我将文件存储在S3上并编写.ebextensions
config以自动将它们复制到新实例。我在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
在尝试使此文件复制工作时,我还通过向所有S3提供弹性beanstalk IAM角色标准只读访问策略来放宽权限。它的政策是:
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
然而预建复制步骤仍然失败。我是否以正确的格式提供了源网址?是否涉及另一个安全实体/政策?请帮助:)
答案 0 :(得分:16)
该主题的文档非常粗略(可能是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角色。参见&#34; IAM角色&#34;与正在运行的实例关联(如果可用)或参见环境配置。示例:
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
正确设置来源网址
答案 1 :(得分:11)
与chaseadamsio的答案类似,您可以使用策略来配置给EC2实例的角色以访问S3资源,然后使用预安装的AWS CLI实用程序来移动文件。
我接近这个的方法是创建一个专用于给定EB应用程序的角色,然后附加类似于以下的策略:
"Statement": [
{
"Sid": "<sid>",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<your_bucket_path>/*"
]
}
]
这为您的实例提供了访问权限,然后为了获取文件,添加了一个&#39;命令&#39;阻止您的配置,例如:
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访问时遇到的很多问题,并使部署变得更加容易。
答案 2 :(得分:7)
我找到了解决此错误的解决方案。事实证明,在.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
答案 3 :(得分:3)
设置.ebextensions
配置的另一种方法是在IAM管理器中的aws-elasticbeanstalk-ec2-role
上设置策略(或者专门为弹性beanstalk环境创建一个新角色,以对自动调整的ec2实例进行沙箱处理。
要执行此操作,请转到Web控制台中的IAM管理器,然后单击左侧的“角色”。您应该在角色列表中看到您的实例名称,单击该名称将转到该特定角色的管理页面。将新角色策略附加到“权限”下的角色,其策略文档与您希望ec2有权执行的操作相匹配(在这种情况下,您将为其提供访问名为_MyBucket
的s3存储桶的策略并且您不再需要Resources
配置中的.ebextensions
部分。
答案 4 :(得分:0)
如果您为配置为访问该文件的计算机拥有IAM角色,则可以在.ebextensions
commands:
01a_copy_file:
command: aws s3 cp s3://bucket/path/file /destination/