我在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
:
-
将您的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名称
-
在
.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"
适当设置桶名
-
定义远程文件并附加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/