如果您尝试在 CloudFormation 启动的 EC2 实例上生成文件,我会推荐以下方法:
在“资源”部分(相应地调整您的政策):
"User": {
"Type": "AWS::IAM::User",
"Properties": {
"Path": "/",
"Policies": [
{
"PolicyName": "AllPrivileges",
"PolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Action": [
"*"
],
"Resource": [ "*" ]
}
]
}
}
]
}
},
"AccessKey" : {
"Type" : "AWS::IAM::AccessKey",
"Properties" : {
"UserName" : { "Ref" : "User" }
}
},
在 EC2 实例资源部分:
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"/home/ec2-user/.aws/config" : {
"content" : { "Fn::Join" : ["", [
"[profile eb-cli]", "\n",
"aws_access_key_id = ", { "Ref" : "AccessKey" }, "\n",
"aws_secret_access_key = ", { "Fn::GetAtt" : [ "AccessKey", "SecretAccessKey" ] }, "\n"
]]},
"mode" : "000600",
"owner" : "ec2-user",
"group" : "ec2-user"
}
},
在输出中添加双引号应该像转义它们一样简单,例如
"files" : {
"/home/ec2-user/.aws/config" : {
"content" : { "Fn::Join" : ["", [
"[profile eb-cli]", "\n",
"\"aws_access_key_id\" = \"", { "Ref" : "AccessKey" }, "\"", "\n",
"\"aws_secret_access_key\" = \"", { "Fn::GetAtt" : [ "AccessKey", "SecretAccessKey" ] }, , "\"", "\n"
]]},
"mode" : "000600",
"owner" : "ec2-user",
"group" : "ec2-user"
}
},
但这不是 AWS CLI 和 SDK 配置文件所必需的
为了触发模板的AWS::Cloudformation::Init 部分,您必须显式调用cfn-init
我通常从用户数据部分执行此操作:
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -x\n",
"exec &> /home/ec2-user/userdata.log\n",
"/opt/aws/bin/cfn-init --region ", { "Ref" : "AWS::Region" }, " -s ", { "Ref" : "AWS::StackId" }, " -r DockerInstance -v\n",
"/opt/aws/bin/cfn-signal -e $? ", { "Fn::Base64" : { "Ref" : "WaitConditionHandle" }}, "\n"
]] } }