AWS Identity and Access Management テンプレートスニペット
このセクションでは、AWS Identity and Access Management のテンプレートスニペットを紹介しています。
トピック
重要
IAM リソースを含んだテンプレートを使ってスタックを作成または更新する際は、IAM の機能の使用に同意する必要があります。テンプレート内の IAM リソースの使用の詳細については、「AWS Identity and Access Management で CloudFormation アクセスを制御する」を参照してください。
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-2
aws-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