我希望让 CloudFormation 模板创建一个 EC2 实例,并授予该实例对 S3 存储桶的访问权限。
一种方法是让模板创建具有适当权限的 IAM 用户,并使用其访问密钥授予访问权限。
但是,如果我不想授予该用户对 IAM 服务的访问权限,该怎么办?有没有办法让该用户在没有 IAM 的情况下部署此模板?
更新:
我希望能够共享该模板,所以我想知道是否可以不依赖于预先存在的 IAM 资源(角色、策略等)
为实例授予权限的常用方法是实例配置文件。您可以创建具有所有必需权限的角色,将该角色分配给实例配置文件,然后将该配置文件分配给所需的任何实例。
您可以使用CloudFormation执行此操作:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"myEC2Instance": {
"Type": "AWS::EC2::Instance",
"Version": "2009-05-15",
"Properties": {
"ImageId": "ami-205fba49",
"InstanceType": "t2.micro",
"IamInstanceProfile": {
"Ref": "RootInstanceProfile"
}
}
},
"MyRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version" : "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Principal": {
"Service": [ "ec2.amazonaws.com" ]
},
"Action": [ "sts:AssumeRole" ]
} ]
},
"Path": "/"
}
},
"RolePolicies": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "s3",
"PolicyDocument": {
"Version" : "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action":["s3:PutObject","s3:PutObjectAcl"],
"Resource":["arn:aws:s3:::examplebucket/*"],
} ]
},
"Roles": [ { "Ref": "MyRole" } ]
}
},
"RootInstanceProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [ { "Ref": "MyRole" } ]
}
}
}
}
如果您希望避免向用户授予部署此模板的 IAM 访问权限,您可以在部署模板之前创建实例配置文件,并在模板中指定已存在的实例配置文件。我还没有尝试过,但似乎只需要ec2:AssociateIamInstanceProfile
,你应该能够将其限制在一个特定的配置文件中。
取决于您所说的 IAM 服务的含义。
您可以创建 IAM 用户访问密钥,以授予对特定 AWS 服务的权限,而不授予对其他服务的权限。访问密钥不允许 IAM 控制台访问(这需要登录凭证或联合身份验证)。
对于您的用例,您的用户至少需要:
- 使用 CloudFormation 执行模板的权限。
- 创建 EC2 实例的权限。
这些权限在您添加到 AWS 管理控制台中的 IAM 用户的策略中定义。您可以创建无法登录控制台的用户。然后,您生成用户将在其应用程序、AWS CLI 等中使用的访问密钥。
IAM 策略概述