【问题标题】:cfn-init fails to download S3 file even though "aws s3 cp" works即使“aws s3 cp”有效,cfn-init 也无法下载 S3 文件
【发布时间】:2018-03-04 23:43:38
【问题描述】:

我有一个 CloudFormation 脚本,它使用 AWS::CloudFormation::Init 部分从 S3 存储桶下载文件,该文件因访问被拒绝 (403) 而失败。

我使用AWS::IAM::InstanceProfile 向机器添加了一个名为s3access 的IAM 角色。使用aws s3 下载文件有效:

[ec2-user@ip-172-31-26-26 ~]$ aws s3 cp s3://my-bucket/test-file 
.download: s3://my-bucket/test-file to ./test-file           

但是cfn-init 失败了:

[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2
构建期间发生错误:无法检索 https://s3.us-east-2.amazonaws.com/my-bucket/test-file:HTTP 错误 403:

我尝试明确设置 IAM 角色,但也失败了:

[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2 - -角色=s3access
AccessDenied:用户:arn:aws:sts::196375698259:assumed-role/s3access/i-044499612c92b50f5 无权执行:cloudformation:DescribeStackResource on resource:arn:aws:cloudformation:us-east-2:196375698259:stack/测试/*

我正在考虑直接从用户数据中使用 aws s3 cp s3://my-bucket/test-file ./,但我想知道为什么 AWS::CloudFormation::Init 无法承担分配给 EC2 实例的角色。

我只发现了一个类似的问题 - How can I access protected S3 files in a CFN script?,但解决方案是应用 IAM 角色,我已经这样做了,cfn-init 仍然失败。

【问题讨论】:

  • 如果您向我们展示您的模板会更容易
  • 我发现使用 cfn-init 没什么优势。您可以轻松地将您的 aws s3 复制逻辑放入 CloudFormation 的 userData 中,并为您的 EC2 实例提供与 s3 读取访问权限相关的角色/策略权限,这样就可以正常工作。

标签: amazon-web-services amazon-cloudformation amazon-iam


【解决方案1】:

我需要将AWS::CloudFormation::Authentication 添加到EC2InstanceMetadata。详情在:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html#cfn-cloudformation-authentication-rolename

例如:

EC2Instance:
    Type: 'AWS::EC2::Instance'    
        Metadata:  
            AWS::CloudFormation::Authentication:  
                 rolebased:  
                     type: S3  
                     roleName: !Ref EC2InstanceIAMRole  
                     buckets:  
                         - !Ref TemplateBucket  
            ...  

角色有权访问相关的TemplateBucket

角色也分配给EC2 instance

关于这个角色的一些细节在这里:

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

在添加这个之前,我可以通过 aws cli 从 s3 下载文件,但是 cfn-init 没有工作,给出了这个错误:

Error occurred during build: Failed to retrieve https://s3.amazonaws.com/FILE: HTTP Error 403 : <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ID</RequestId><HostId>ID</HostId></Error>  

【讨论】:

    【解决方案2】:

    有一些方法可以赋予 cloudformation 实例您的 IAM 角色。

    • 您可以将 IAM 角色的标识放入 cloudformation 模板中,例如在您的 UserData 中。但是,这会给您的 IAM 带来一些机密问题。
    • 您可以将参数放在堆栈上,这样您就可以在每次创建堆栈时指定 IAM 角色。这对于测试堆栈来说并不是很愉快,因为需要经常创建一个新堆栈。
    • 最后一个是启动一个新实例并添加您的 IAM 角色,然后为该实例创建一个 AMI。使用此 AMI 创建 cloudformation 堆栈实例。通过使用此选项,您可以确保您的 s3 命​​令首先在实例上运行,您不必处理参数和机密问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多