弹性beanstalk检索S3文件时权限被拒绝

时间:2014-10-16 01:09:54

标签: amazon-web-services amazon-s3 elastic-beanstalk amazon-iam

我将文件存储在S3上并编写.ebextensions config以自动将它们复制到新实例。我在Elastic Beanstalk控制台中收到此错误:

  

[Instance: INSTANCEID Module:AWSEBAutoScalingGroup ConfigSet:null]实例上的命令失败。返回码:1输出:[CMD-AppDeploy / AppDeployStage0 / EbExtensionPreBuild]命令失败,错误代码为1:构建期间出错:无法检索https://s3-us-west-1.amazonaws.com/MyBucket/MyFolder/_MyFile.txt:HTTP错误403:AccessDenied

我的.ebextension配置文件包含以下部分:

files:
    "/target/file/path" :
        mode: "000777"
        owner: ec2-user
        group: ec2-user
        source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt

在尝试使此文件复制工作时,我还通过向所有S3提供弹性beanstalk IAM角色标准只读访问策略来放宽权限。它的政策是:

{
  "Effect": "Allow",
  "Action": [
    "s3:Get*",
    "s3:List*"
  ],
  "Resource": "*"
}

然而预建复制步骤仍然失败。我是否以正确的格式提供了源网址?是否涉及另一个安全实体/政策?请帮助:)

5 个答案:

答案 0 :(得分:16)

该主题的文档非常粗略(可能是StackExchange Docs的理想候选者!)。

要使用.ebextensions正确执行此操作,您需要在存储桶策略中允许Beanstalk实例IAM用户,设置AWS::CloudFormation::Authentication:身份验证配置并将配置附加到远程源。这是所有其他答案的混合,但所有这些都以某种方式失败了。

假设您的IAM实例角色为aws-elasticbeanstalk-ec2-role

  1. 设置您的AWS桶以允许Beanstalk IAM用户。编辑"存储桶策略":

    {
        "Version": "2012-10-17",
        "Id": "BeanstalkS3Copy",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "<beanstalk_iam_role_arn>"
                },
                "Action": [
                    "s3:ListBucketVersions",
                    "s3:ListBucket",
                    "s3:GetObjectVersion",
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::<bucket_name>",
                    "arn:aws:s3:::<bucket_name>/*"
                ]
            }
        ]
    }
    

    其中:

      

    beanstalk_iam_role_arn =完全限定的实例IAM角色。参见&#34; IAM角色&#34;与正在运行的实例关联(如果可用)或参见环境配置。示例:arn:aws:iam::12345689:role/aws-elasticbeanstalk-ec2-role

         

    bucket_name =您的广告位名称

  2. .ebextension/myconfig.config中,添加使用您的IAM实例用户的S3身份验证块:

    Resources:
    AWSEBAutoScalingGroup:
      Metadata:
        AWS::CloudFormation::Authentication:
          S3Auth:
            type: "s3"
            buckets: ["bucket_name"]
            roleName:
              "Fn::GetOptionSetting":
                Namespace: "aws:asg:launchconfiguration"
                OptionName: "IamInstanceProfile" 
                DefaultValue: "aws-elasticbeanstalk-ec2-role"
    
      

    正确设置 bucket_name

  3. 定义远程文件并附加S3身份验证块:

    "/etc/myfile.txt" :
       mode: "000400"
       owner: root
       group: root
       authentication: "S3Auth" # Matches to auth block above.
       source: https://s3-eu-west-1.amazonaws.com/mybucket/myfile.txt
    
      

    正确设置来源网址

答案 1 :(得分:11)

与chaseadamsio的答案类似,您可以使用策略来配置给EC2实例的角色以访问S3资源,然后使用预安装的AWS CLI实用程序来移动文件。

我接近这个的方法是创建一个专用于给定EB应用程序的角色,然后附加类似于以下的策略:

"Statement": [
    {
        "Sid": "<sid>",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::<your_bucket_path>/*"
        ]
    }
]

这为您的实例提供了访问权限,然后为了获取文件,添加了一个&#39;命令&#39;阻止您的配置,例如:

commands: 
  01-get-file:
    command: aws s3 cp s3://<your_bucket_path>/your-file.txt /home/ec2-user
  02-execute-actions: 
    [unpack, run scripts, etc..]

显然,您可以根据需要使用其他AWS CLI。我发现这解决了我在S3访问时遇到的很多问题,并使部署变得更加容易。

答案 2 :(得分:7)

我找到了解决此错误的解决方案。事实证明,在.ebextensions配置文件中添加Resources部分使其工作。整个文件变为:

files:
  "/target/file/path" :
    mode: "000777"
    owner: ec2-user
    group: ec2-user
    source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Access:
          type: S3
          roleName: aws-elasticbeanstalk-ec2-role
          buckets: _MyBucket

在这一点上,我不知道为什么它必须这样。希望它可以帮助失去的人前进并最终获得更好的理解。我的答案基于https://forums.aws.amazon.com/message.jspa?messageID=541634

答案 3 :(得分:3)

设置.ebextensions配置的另一种方法是在IAM管理器中的aws-elasticbeanstalk-ec2-role上设置策略(或者专门为弹性beanstalk环境创建一个新角色,以对自动调整的ec2实例进行沙箱处理。

要执行此操作,请转到Web控制台中的IAM管理器,然后单击左侧的“角色”。您应该在角色列表中看到您的实例名称,单击该名称将转到该特定角色的管理页面。将新角色策略附加到“权限”下的角色,其策略文档与您希望ec2有权执行的操作相匹配(在这种情况下,您将为其提供访问名为_MyBucket的s3存储桶的策略并且您不再需要Resources配置中的.ebextensions部分。

答案 4 :(得分:0)

如果您为配置为访问该文件的计算机拥有IAM角色,则可以在.ebextensions

中执行以下操作
commands:
  01a_copy_file:
    command: aws s3 cp s3://bucket/path/file /destination/