このセクションでは、AWS Identity and Access Management のテンプレートスニペットを紹介しています。
トピック
重要
IAM リソースを含んだテンプレートを使ってスタックを作成または更新する際は、IAM の機能の使用に同意する必要があります。詳細については、「CloudFormation テンプレートでの IAM リソースの承認」を参照してください。
IAM ユーザーリソースの宣言
このスニペットは、IAM ユーザーを作成するための AWS::IAM::User リソースの宣言を示しています。ユーザーの宣言には、パス ("/"
) と、パスワード (myP@ssW0rd
) のあるログインプロファイルとを使用しています。
giveaccesstoqueueonly
という名前のポリシードキュメントは、Amazon SQS キューリソース myqueue
に対するすべての Amazon SQS アクションの実行権限をユーザーに付与するとともに、他のすべての Amazon SQS キューリソースに対するアクセスを拒否します。Fn::GetAtt
関数は、AWS::SQS::Queue リソース myqueue
の Arn 属性を取得します。
giveaccesstotopiconly
という名前のポリシードキュメントをユーザーに追加し、Amazon SNS トピックリソース mytopic
に対するすべての Amazon SNS アクションの実行権限をユーザーに付与するとともに、他のすべての Amazon SNS リソースへのアクセスを拒否します。Ref
関数は AWS::SNS::Topic リソース mytopic
の ARN を取得します。
JSON
"myuser" : {
"Type" : "AWS::IAM::User",
"Properties" : {
"Path" : "/",
"LoginProfile" : {
"Password" : "myP@ssW0rd"
},
"Policies" : [ {
"PolicyName" : "giveaccesstoqueueonly",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Action" : [ "sqs:*" ],
"Resource" : [ {
"Fn::GetAtt" : [ "myqueue", "Arn" ]
} ]
}, {
"Effect" : "Deny",
"Action" : [ "sqs:*" ],
"NotResource" : [ {
"Fn::GetAtt" : [ "myqueue", "Arn" ]
} ]
}
] }
}, {
"PolicyName" : "giveaccesstotopiconly",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Action" : [ "sns:*" ],
"Resource" : [ { "Ref" : "mytopic" } ]
}, {
"Effect" : "Deny",
"Action" : [ "sns:*" ],
"NotResource" : [ { "Ref" : "mytopic" } ]
} ]
}
} ]
}
}
YAML
myuser:
Type: AWS::IAM::User
Properties:
Path: "/"
LoginProfile:
Password: myP@ssW0rd
Policies:
- PolicyName: giveaccesstoqueueonly
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sqs:*
Resource:
- !GetAtt myqueue.Arn
- Effect: Deny
Action:
- sqs:*
NotResource:
- !GetAtt myqueue.Arn
- PolicyName: giveaccesstotopiconly
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sns:*
Resource:
- !Ref mytopic
- Effect: Deny
Action:
- sns:*
NotResource:
- !Ref mytopic
IAM アクセスキーリソースの宣言
このスニペットは、AWS::IAM::AccessKey リソースを示します。myaccesskey
リソースは、アクセスキーを作成し、テンプレートに AWS::IAM::User リソースとして宣言されている IAM ユーザーにそれを割り当てます。
JSON
"myaccesskey" : {
"Type" : "AWS::IAM::AccessKey",
"Properties" : {
"UserName" : { "Ref" : "myuser" }
}
}
YAML
myaccesskey:
Type: AWS::IAM::AccessKey
Properties:
UserName:
!Ref myuser
AWS::IAM::AccessKey
リソースのシークレットキーは、Fn::GetAtt
関数を使用して取得できます。シークレットキーを取得する 1 つの方法は、それを Output
値に追加することです。Ref
関数を使用してアクセスキーを取得することができます。次の Output
値の宣言は、myaccesskey
のアクセスキーとシークレットキーを取得します。
JSON
"AccessKeyformyaccesskey" : {
"Value" : { "Ref" : "myaccesskey" }
},
"SecretKeyformyaccesskey" : {
"Value" : {
"Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ]
}
}
YAML
AccessKeyformyaccesskey:
Value:
!Ref myaccesskey
SecretKeyformyaccesskey:
Value: !GetAtt myaccesskey.SecretAccessKey
AWS のアクセスキーとシークレットキーを、テンプレートに定義されている Amazon EC2 インスタンスまたは Auto Scaling グループに渡すこともできます。次の AWS::EC2::Instance 宣言では、UserData
プロパティを使用して、myaccesskey
リソースのアクセスキーとシークレットキーを渡しています。
JSON
"myinstance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"AvailabilityZone" : "us-east-1a",
"ImageId" : "ami-0ff8a91507f77f867",
"UserData" : {
"Fn::Base64" : {
"Fn::Join" : [
"", [
"ACCESS_KEY=", {
"Ref" : "myaccesskey"
},
"&",
"SECRET_KEY=",
{
"Fn::GetAtt" : [
"myaccesskey",
"SecretAccessKey"
]
}
]
]
}
}
}
}
YAML
myinstance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: "us-east-1a"
ImageId: ami-0ff8a91507f77f867
UserData:
Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
IAM グループ リソースの宣言
このスニペットは、AWS::IAM::Group リソースを示します。このグループにはパス ("/myapplication/"
) があります。myapppolicy
という名前のポリシードキュメントがグループに追加され、グループのユーザーが Amazon SQS キューリソース myqueue に対してすべての Amazon SQS アクションを実行し、myqueue
を除く他のすべての Amazon SQS リソースへのアクセスを拒否できるようになります。
IAM では、リソースにポリシーを割り当てる際、リソースの Amazon リソースネーム (ARN) が必要となります。このスニペットで、Fn::GetAtt
関数は AWS::SQS::Queue リソースキューの ARN を取得しています。
JSON
"mygroup" : {
"Type" : "AWS::IAM::Group",
"Properties" : {
"Path" : "/myapplication/",
"Policies" : [ {
"PolicyName" : "myapppolicy",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Action" : [ "sqs:*" ],
"Resource" : [ {
"Fn::GetAtt" : [ "myqueue", "Arn" ]
} ]
},
{
"Effect" : "Deny",
"Action" : [ "sqs:*" ],
"NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ]
}
] }
} ]
}
}
YAML
mygroup:
Type: AWS::IAM::Group
Properties:
Path: "/myapplication/"
Policies:
- PolicyName: myapppolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sqs:*
Resource: !GetAtt myqueue.Arn
- Effect: Deny
Action:
- sqs:*
NotResource: !GetAtt myqueue.Arn
グループへのユーザーの追加
グループには、AWS::IAM::UserToGroupAddition リソースでユーザーを追加します。次のスニペットで、addUserToGroup
リソースは、myexistinggroup2
という名前の既存のグループに対し、既存のユーザー existinguser1
と、テンプレートに AWS::IAM::User リソースとして宣言されているユーザー myuser
とを追加しています。
JSON
"addUserToGroup" : {
"Type" : "AWS::IAM::UserToGroupAddition",
"Properties" : {
"GroupName" : "myexistinggroup2",
"Users" : [ "existinguser1", { "Ref" : "myuser" } ]
}
}
YAML
addUserToGroup:
Type: AWS::IAM::UserToGroupAddition
Properties:
GroupName: myexistinggroup2
Users:
- existinguser1
- !Ref myuser
IAM ポリシーの宣言
このスニペットでは、ポリシーを作成し、mypolicy
という名前の AWS::IAM::Policy リソースを使用して、複数のグループにそのポリシーを適用しています。mypolicy
リソースには、ARN PolicyDocument
で表される S3 バケット内のオブジェクトに対し、GetObject
、PutObject
、PutObjectAcl
の各アクションを許可する arn:aws:s3:::myAWSBucket
プロパティが存在します。mypolicy
リソースのポリシーの適用先は、myexistinggroup1
という名前の既存のグループと、テンプレート内で AWS::IAM::Group リソースとして宣言されているグループ mygroup
です。この例では、Groups
プロパティを使用してグループにポリシーを適用する方法を示していますが、Users
プロパティを使用して、ポリシードキュメントを一連のユーザーに追加することもできます。
重要
AWS::IAM::Policy リソースで宣言されている Amazon SNS ポリシーアクションは、AWS::SNS::TopicPolicy リソースで宣言されている Amazon SNS トピックポリシーアクションとは異なります。例えば、ポリシーアクション sns:Unsubscribe
および sns:SetSubscriptionAttributes
は AWS::IAM::Policy
リソースに有効ですが、AWS::SNS::TopicPolicy
リソースには無効です。AWS::IAM::Policy
リソースで使用できる有効な Amazon SNS ポリシーアクションの詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Special information for Amazon SNS policies」(Amazon SNS ポリシーの特別情報) を参照してください。
JSON
"mypolicy" : {
"Type" : "AWS::IAM::Policy",
"Properties" : {
"PolicyName" : "mygrouppolicy",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Action" : [
"s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ],
"Resource" : "arn:aws:s3:::myAWSBucket/*"
} ]
},
"Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ]
}
}
YAML
mypolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: mygrouppolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
- s3:PutObjectAcl
Resource: arn:aws:s3:::myAWSBucket/*
Groups:
- myexistinggroup1
- !Ref mygroup
Amazon S3 バケットポリシーの宣言
このスニペットでは、ポリシーを作成し、AWS::S3::BucketPolicy リソースを使用して Amazon S3 バケットにそのポリシーを適用しています。このポリシーの適用先となる S3 バケットのすべてのオブジェクトに対する GetObject
アクションを user1
IAM ユーザーに許可するポリシードキュメントが mybucketpolicy
リソースで宣言されています。このスニペットでは、Fn::GetAtt
リソースの ARN を user1
関数で取得しています。mybucketpolicy
リソースは、AWS::S3::BucketPolicy
リソース mybucket にポリシーを適用します。リソースのバケット名は、Ref
mybucket
関数で取得しています。
JSON
"mybucketpolicy" : {
"Type" : "AWS::S3::BucketPolicy",
"Properties" : {
"PolicyDocument" : {
"Id" : "MyPolicy",
"Version": "2012-10-17",
"Statement" : [ {
"Sid" : "ReadAccess",
"Action" : [ "s3:GetObject" ],
"Effect" : "Allow",
"Resource" : { "Fn::Join" : [
"", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ]
] },
"Principal" : {
"AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] }
}
} ]
},
"Bucket" : { "Ref" : "mybucket" }
}
}
YAML
mybucketpolicy:
Type: AWS::S3::BucketPolicy
Properties:
PolicyDocument:
Id: MyPolicy
Version: '2012-10-17'
Statement:
- Sid: ReadAccess
Action:
- s3:GetObject
Effect: Allow
Resource: !Sub "arn:aws:s3:::${mybucket}/*"
Principal:
AWS: !GetAtt user1.Arn
Bucket: !Ref mybucket
Amazon SNS トピックポリシーの宣言
このスニペットでは、ポリシーを作成し、AWS::SNS::TopicPolicy リソースを使用して Amazon SNS トピックにそのポリシーを適用しています。mysnspolicy
リソースに含まれている PolicyDocument
プロパティでは、AWS::IAM::User リソース myuser
に対して Publish
アクションを AWS::SNS::Topic リソース mytopic
で実行することを許可します。スニペットでは、Fn::GetAtt
関数で myuser
リソースの ARN を取得し、Ref
関数で mytopic
リソースの ARN を取得します。
重要
AWS::IAM::Policy リソースで宣言されている Amazon SNS ポリシーアクションは、AWS::SNS::TopicPolicy リソースで宣言されている Amazon SNS トピックポリシーアクションとは異なります。例えば、ポリシーアクション sns:Unsubscribe
および sns:SetSubscriptionAttributes
は AWS::IAM::Policy
リソースに有効ですが、AWS::SNS::TopicPolicy
リソースには無効です。AWS::IAM::Policy
リソースで使用できる有効な Amazon SNS ポリシーアクションの詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Special information for Amazon SNS policies」(Amazon SNS ポリシーの特別情報) を参照してください。
JSON
"mysnspolicy" : {
"Type" : "AWS::SNS::TopicPolicy",
"Properties" : {
"PolicyDocument" : {
"Id" : "MyTopicPolicy",
"Version" : "2012-10-17",
"Statement" : [ {
"Sid" : "My-statement-id",
"Effect" : "Allow",
"Principal" : {
"AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] }
},
"Action" : "sns:Publish",
"Resource" : "*"
} ]
},
"Topics" : [ { "Ref" : "mytopic" } ]
}
}
YAML
mysnspolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Id: MyTopicPolicy
Version: '2012-10-17'
Statement:
- Sid: My-statement-id
Effect: Allow
Principal:
AWS: !GetAtt myuser.Arn
Action: sns:Publish
Resource: "*"
Topics:
- !Ref mytopic
Amazon SQS ポリシーの宣言
このスニペットでは、ポリシーを作成し、AWS::SQS::QueuePolicy リソースを使用して Amazon SQS キューにそのポリシーを適用しています。PolicyDocument
プロパティは、既存のキュー (URL で指定) および AWS::SQS::Queue リソース myqueue に対する SendMessage
アクションを既存のユーザー myapp
(ARN で指定) に許可します。リソースの URL は Ref 関数で取得しています。myqueue
JSON
"mysqspolicy" : {
"Type" : "AWS::SQS::QueuePolicy",
"Properties" : {
"PolicyDocument" : {
"Id" : "MyQueuePolicy",
"Version" : "2012-10-17",
"Statement" : [ {
"Sid" : "Allow-User-SendMessage",
"Effect" : "Allow",
"Principal" : {
"AWS" : "arn:aws:iam::123456789012:user/myapp"
},
"Action" : [ "sqs:SendMessage" ],
"Resource" : "*"
} ]
},
"Queues" : [
"https://sqs.us-east-2aws-region
.amazonaws.com/123456789012/myexistingqueue",
{ "Ref" : "myqueue" }
]
}
}
YAML
mysqspolicy:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Id: MyQueuePolicy
Version: '2012-10-17'
Statement:
- Sid: Allow-User-SendMessage
Effect: Allow
Principal:
AWS: arn:aws:iam::123456789012:user/myapp
Action:
- sqs:SendMessage
Resource: "*"
Queues:
- https://sqs.aws-region
.amazonaws.com/123456789012/myexistingqueue
- !Ref myqueue
IAM ロールのテンプレートの例
このセクションでは、CloudFormation テンプレートで EC2 インスタンスの IAM ロールを使用する例を紹介しています。
IAM ロールの詳細については、「AWS Identity and Access Management ユーザーガイド」の「Working with roles」(ロールの操作) を参照してください。
IAM ロールと EC2
この例では、インスタンスプロファイルは EC2 インスタンスの IamInstanceProfile
プロパティによって参照されます。インスタンスポリシーとロールポリシーのどちらも、AWS::IAM::Role を参照します。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"myEC2Instance": {
"Type": "AWS::EC2::Instance",
"Version": "2009-05-15",
"Properties": {
"ImageId": "ami-0ff8a91507f77f867",
"InstanceType": "m1.small",
"Monitoring": "true",
"DisableApiTermination": "false",
"IamInstanceProfile": {
"Ref": "RootInstanceProfile"
}
}
},
"RootRole": {
"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": "root",
"PolicyDocument": {
"Version" : "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action": "*",
"Resource": "*"
} ]
},
"Roles": [ { "Ref": "RootRole" } ]
}
},
"RootInstanceProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [ { "Ref": "RootRole" } ]
}
}
}
}
YAML
AWSTemplateFormatVersion: '2010-09-09'
Resources:
myEC2Instance:
Type: AWS::EC2::Instance
Version: '2009-05-15'
Properties:
ImageId: ami-0ff8a91507f77f867
InstanceType: m1.small
Monitoring: 'true'
DisableApiTermination: 'false'
IamInstanceProfile:
!Ref RootInstanceProfile
RootRole:
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: root
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: "*"
Resource: "*"
Roles:
- !Ref RootRole
RootInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: "/"
Roles:
- !Ref RootRole
IAM ロールと AutoScaling グループ
この例では、インスタンスプロファイルは、AutoScaling グループの起動構成の IamInstanceProfile
プロパティによって参照されます。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"myLCOne": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Version": "2009-05-15",
"Properties": {
"ImageId": "ami-0ff8a91507f77f867",
"InstanceType": "m1.small",
"InstanceMonitoring": "true",
"IamInstanceProfile": { "Ref": "RootInstanceProfile" }
}
},
"myASGrpOne": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Version": "2009-05-15",
"Properties": {
"AvailabilityZones": [ "us-east-1a" ],
"LaunchConfigurationName": { "Ref": "myLCOne" },
"MinSize": "0",
"MaxSize": "0",
"HealthCheckType": "EC2",
"HealthCheckGracePeriod": "120"
}
},
"RootRole": {
"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": "root",
"PolicyDocument": {
"Version" : "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action": "*",
"Resource": "*"
} ]
},
"Roles": [ { "Ref": "RootRole" } ]
}
},
"RootInstanceProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [ { "Ref": "RootRole" } ]
}
}
}
}
YAML
AWSTemplateFormatVersion: '2010-09-09'
Resources:
myLCOne:
Type: AWS::AutoScaling::LaunchConfiguration
Version: '2009-05-15'
Properties:
ImageId: ami-0ff8a91507f77f867
InstanceType: m1.small
InstanceMonitoring: 'true'
IamInstanceProfile:
!Ref RootInstanceProfile
myASGrpOne:
Type: AWS::AutoScaling::AutoScalingGroup
Version: '2009-05-15'
Properties:
AvailabilityZones:
- "us-east-1a"
LaunchConfigurationName:
!Ref myLCOne
MinSize: '0'
MaxSize: '0'
HealthCheckType: EC2
HealthCheckGracePeriod: '120'
RootRole:
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: root
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: "*"
Resource: "*"
Roles:
- !Ref RootRole
RootInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: "/"
Roles:
- !Ref RootRole