【问题标题】:Permission denied while elastic beanstalk is retrieving S3 file弹性 beantalk 检索 S3 文件时权限被拒绝
【发布时间】:2014-12-11 05:54:00
【问题描述】:

我将文件存储在 S3 上并编写了 .ebextensions 配置以自动将它们复制到新实例。我在 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

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

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

然而,预构建复制步骤仍然失败。我是否以正确的格式提供了源网址?是否涉及其他安全实体/策略?请帮忙:)

【问题讨论】:

  • 我今天有这个问题。

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


【解决方案1】:

文档在这个主题上非常粗略(可能是 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 角色。如果可用,请参阅与正在运行的实例关联的“IAM 角色”或查看环境配置。示例: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
    

    适当设置您的来源网址

【讨论】:

  • 有效!这是一个完美的解释。它应该被接受为答案。
  • 查看official docs 似乎缺少存储桶策略的第一部分。这对我来说是缺少的一步,导致eb deploy 出现 403
  • 有没有办法将存储桶名称作为参数传递?例如,在 Elastic Beanstalk 中将存储桶名称作为环境变量传递,然后在此脚本中访问该变量的值?
【解决方案2】:

如果您将机器的 IAM 角色配置为访问文件,您可以在 .ebextensions 中执行以下操作

commands:
  01a_copy_file:
    command: aws s3 cp s3://bucket/path/file /destination/

【讨论】:

    【解决方案3】:

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

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

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

    这为您的实例提供访问权限,然后要获取文件,请在您的配置中添加一个“命令”块,例如:

    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 访问时遇到的很多问题,并使部署变得更加容易。

    【讨论】:

    • 我喜欢你的 aws cli 方法。它节省了一天的时间。非常感谢
    【解决方案4】:

    设置 .ebextensions 配置的替代方法是在 IAM 管理器中对 aws-elasticbeanstalk-ec2-role 设置策略(或专门为您的弹性 beanstalk 环境创建一个新角色,以沙箱化您的自动缩放的 ec2 实例。

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

    【讨论】:

    • 我认为这应该是公认的答案,因为它是解决这个问题的最干净的方法。谢谢 - 我从未在左侧面板中看到角色部分。
    • 我同意这确实感觉更容易。实际上,我只是在我的 EB 角色中添加“fullS3access”时遇到问题,尝试查看文件时仍然被拒绝权限 SO:stackoverflow.com/questions/36125292/…
    【解决方案5】:

    我找到了克服此错误的解决方案。事实证明,在 .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

    【讨论】:

    • Soln 以上产生...访问被拒绝!失败!
    • 当我遇到完全相同的问题时,对我来说完美无缺。非常感谢您发布此内容。
    • @babalu:使用“身份验证:S3Access”
    • 我同意这只是行不通的“HTTP 错误 403”。 @MickeyCheong 有authentication 和没有。
    • 对我不起作用,官方文档 (docs.aws.amazon.com/elasticbeanstalk/latest/dg/…) 中没有记录此资源部分,可能是同时删除的非公开功能。
    猜你喜欢
    • 2021-03-11
    • 2019-11-12
    • 2018-10-14
    • 1970-01-01
    • 2015-05-11
    • 2015-07-11
    • 2011-11-10
    相关资源
    最近更新 更多