AWS Identity and Access Management テンプレートスニペット - AWS CloudFormation

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 バケット内のオブジェクトに対し、GetObjectPutObjectPutObjectAcl の各アクションを許可する 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:SetSubscriptionAttributesAWS::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 にポリシーを適用します。リソースのバケット名は、Refmybucket 関数で取得しています。

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:SetSubscriptionAttributesAWS::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