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



我在S3上存储了一些文件,并编写了.ebextensions配置来自动将它们复制到新实例中。我在Elastic Beanstalk控制台中收到这个错误:

[实例:INSTANCEID模块:AWSEBAutoScalingGroup ConfigSet:null]命令在实例上失败。返回代码:1输出:[CMD AppDeploy/AppDeployStage0/EbExtensionPreBuild]命令失败,错误代码为1:生成过程中出错:检索失败https://s3-us-west-1.amazonaws.com/MyBucket/MyFolder/_MyFile.txt:HTTP错误403:AccessDenied

我的.eextension配置文件有以下部分:

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

在尝试使这种文件复制工作的过程中,我还放宽了权限,为弹性beanstallIAM角色提供了对所有S3的标准只读访问策略。政策是这样的:

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

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

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

要使用.ebextensions正确执行此操作,您需要在bucket策略中允许Beanstalk实例IAMs用户,设置AWS::CloudFormation::Authentication: auth-config并将config附加到远程源。这是所有其他答案的混合体,但对我来说,所有答案都以某种方式失败了

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

  1. 将您的AWS bucket设置为允许Beanstalk IAM用户。编辑"bucket policy":

    {
        "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=您的bucket名称

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

    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"
    

    适当设置桶名

  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
    

    适当设置URL

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

我找到了一个解决方案来克服这个错误。事实证明,在.eextensions配置文件中添加一个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

设置.ebextensions配置的另一种选择是在IAM Manager中的aws-elasticbeanstalk-ec2-role上设置一个策略(或专门为您的弹性豆茎环境创建一个新角色,以沙箱您的自动缩放ec2实例。

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

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

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

相关内容

  • 没有找到相关文章

最新更新