从 this 页面:
这看起来很简单,但是当我查看 AWS 文档中所有位置的任何示例时,他们从未为此设置角色或配置文件。例如, here 。
我错过了什么?是否存在 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 和 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/ 中所述,从 IAM Roles for EC2 获取实例配置文件临时凭证。
(注意:为了收集这些请求,我运行了
nc -l 80 &
并运行了 cfn-get-metadata --url http://localhost
和 aws --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
,你需要确保你的角色允许它。关于amazon-web-services - AWS cfn-init 是否需要 DescribeStackResource 的配置文件/角色?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29393675/