弹性 beantalk 检索 S3 文件时权限被拒绝
Posted
技术标签:
【中文标题】弹性 beantalk 检索 S3 文件时权限被拒绝【英文标题】:Permission denied while elastic beanstalk is retrieving S3 file 【发布时间】: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": "*"
然而,预构建复制步骤仍然失败。我是否以正确的格式提供了源网址?是否涉及其他安全实体/策略?请帮忙:)
【问题讨论】:
我今天有这个问题。 【参考方案1】:文档在这个主题上非常粗略(可能是 StackExchange Docs 的理想候选者!)。
要正确使用 .ebextensions
执行此操作,您需要在存储桶策略中允许 Beanstalk 实例 IAM 用户,设置 AWS::CloudFormation::Authentication:
身份验证配置并将配置附加到远程源。这是所有其他答案的混合体,但对我来说都以某种方式失败了。
假设您的 IAM 实例角色是 aws-elasticbeanstalk-ec2-role
:
设置您的 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 = 您的存储桶名称
在您的.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
定义一个远程文件并附加 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:***.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/…) 中没有记录此资源部分,可能是同时删除的非公开功能。以上是关于弹性 beantalk 检索 S3 文件时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
Boto3 使用 django 应用程序在本地和弹性 beantalk 上生成不同的链接
尝试通过弹性 beantalk 运行救援时忽略 .ebextensions 文件