AWS cfn-init 是否需要 Profile/Role 用于 DescribeStackResource?

Does AWS cfn-init need a Profile/Role for DescribeStackResource?

来自 this 页:

To use the AWS CloudFormation bootstrap features, you need to provide AWS credentials to the bootstrap scripts. We strongly recommend that you assign an IAM role to on the EC2 instance when the instance is launched.

这看起来很简单,但是当我查看 AWS 文档中各个地方的任何示例时,他们从未为此设置角色或配置文件。例如,here.

我错过了什么?是否存在 cfn-init 需要额外权限而其他情况不需要的情况?

clou-init 脚本需要连接到 AWS 服务以检索您在 CFN 模板中提供的元数据。

为了连接到 AWS 服务,您可以直接将 access/secret 密钥传递给 cfn-init 脚本,或者将具有必要权限的 IAM 角色附加到 EC2 实例,以便 cfn- init 脚本将使用 IAM 角色连接到 AWS 服务。

进一步阅读:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

cfn-init 提供的所有示例都假定您已将 IAM 角色附加到实例,因此 access/secrete 密钥不需要直接传递给 cfn-init 脚本。

不,您不再需要将 cloudformation:DescribeStackResource 添加到与实例配置文件关联的角色的任何策略中以访问 CloudFormation 元数据。 cfn-get-metadata 和 cfn-init 等脚本使用特殊的 CFN header 而非标准 AWS Authorization header 进行授权。来自 CFN 脚本的请求如下所示:

# This command succeeds regardless of your instance profile
cfn-get-metadata --region us-west-1 --stack cftest --resource LaunchConfig  --key AWS::CloudFormation::Init

GET /?Action=DescribeStackResource&StackName=cftest&Version=2010-05-15&ContentType=JSON&LogicalResourceId=LaunchConfig HTTP/1.1
Host: cloudformation.us-west-1.amazonaws.com
Connection: keep-alive
Accept: application/json
Accept-Encoding: gzip, deflate
Authorization: CFN_V1 ewogICJwcml2YXRlSX(truncated)==:b9ZM3/EnzeX(truncated)=
User-Agent: CloudFormation Tools

CFN 授权 header 是 http://169.254.169.254/latest/dynamic/instance-identity/document and http://169.254.169.254/latest/dynamic/instance-identity/signature 的串联,仅允许实例从其自己的堆栈查看 CloudFormation 元数据。

相比之下,使用实例配置文件的请求如下所示:

# This command fails if you don’t have cloudformation:DescribeStackResource permission!
aws cloudformation --region us-west-1 describe-stack-resource --stack-name cftest --logical-resource-id LaunchConfig

POST / HTTP/1.1
Host: cloudformation.us-west-1.amazonaws.com
Accept-Encoding: identity
Content-Length: 95
X-Amz-Date: 20160630T010040Z
User-Agent: aws-cli/1.10.43 Python/2.7.11+ Linux/4.4.0-28-generic botocore/1.4.33
X-Amz-Security-Token: FQoDY(truncated-token)=
Content-Type: application/x-www-form-urlencoded
Authorization: AWS4-HMAC-SHA256 Credential=ASIA(truncated)/20160630/us-west-1/cloudformation/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=fbad7aeef75186cb18bbd44810c4d0379d7d1cf1b8a80be14ea1e3192d2ec531

Action=DescribeStackResource&StackName=cftest&Version=2010-05-15&LogicalResourceId=LaunchConfig

实例配置文件临时凭证是从 http://169.254.169.254/latest/meta-data/iam/security-credentials/ as described in IAM Roles for EC2 中获取的。

(注意:为了收集这些请求,我 运行 nc -l 80 & 和 运行 cfn-get-metadata --url http://localhostaws --endpoint-url http://localhost。)

此 CFNSigner 功能已在 aws-cfn-bootstrap-1.1 (2012-03) 和 aws-cfn-bootstrap-1.3.6 (2012-09) 之间添加到客户端。在 2012 年之前,您确实需要使用具有 cloudformation:DescribeStackResource 权限的角色,如本 2011 年文档 Boostrapping Applications With AWS CloudFormation 中所述。请注意,只有 cfn-* 脚本使用 CFNSigner;如果你想使用 aws cloudformation,你需要确保你的角色允许它。