我的文件夹中有一个简单的文件.ebextensions
:
00-myconfig.config
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Access:
type: S3
roleName: aws-elasticbeanstalk-ec2-role
buckets: my-bucket
files:
"/tmp/ca-bundle.zip":
mode: "000755"
owner: root
group: root
source: https://s3-ap-southeast-2.amazonaws.com/my-bucket/ca/ca-bundle.zip
authentication: S3Access
根据多个答案,这是向角色授予 S3 存储桶访问权限的方法aws-elasticbeanstalk-ec2-role
。
但我仍然收到 403 错误/var/log/eb-activity.log
[2015-08-26T01:27:03.544Z] INFO [22320] - [Application update/AppDeployStage0/EbExtensionPreBuild/Infra-EmbeddedPreBuild] : Activity execution failed, because: Failed to retrieve https://s3-ap-southeast-2.amazonaws.com/my-bucket/ca/ca-bundle.zip: HTTP Error 403 : <?xml version="1.0" encoding="UTF-8"?> (ElasticBeanstalk::ExternalInvocationError)
如果我手动向角色添加 S3 访问策略aws-elasticbeanstalk-ec2-role
,则一切都会正常进行,因此我知道 URL 或其他任何内容中没有拼写错误,EC2 实例肯定处于正确的角色。
怎么了?
PS. 我尝试了files
带有或不带有“身份验证”设置的部分。
答案1
我已经明白了这一点,我觉得自己没有早点意识到这一点有点愚蠢。
因此对于任何使用AWS::CloudFormation::Authentication
路径的人来说,解决方案当然是:
确保您的 BUCKET 策略允许您的 aws-elasticbeanstalk-ec2-role。哎呀!!
它看起来应该是这样的:
{
"Id": "Policy1111Blah",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1440Blah",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/*",
"Principal": {
"AWS": [
"arn:aws:iam::11111111111:role/aws-elasticbeanstalk-ec2-role"
]
}
}
]
}
您可以从 IAM 控制台获取 ARN。
.ebextensions 配置文件中的说明仅告诉 EB 部署工具使用什么进行身份验证,但您的源存储桶(如果显然是私有的)需要允许该主体访问!!!