CloudFormation テンプレートで新しい IAM ロールを作成するのではなく、EC2 インスタンスに既存の IAM ロールを使用するにはどうすればよいですか?
たとえば、AWS コンソールでロールを作成しましたが、それを使用したいだけです。
CloudFormation テンプレートで新しい IAM ロールを作成するのではなく、EC2 インスタンスに既存の IAM ロールを使用するにはどうすればよいですか?
たとえば、AWS コンソールでロールを作成しましたが、それを使用したいだけです。
インスタンス プロファイル、ロール、およびインスタンス情報 (または起動構成) 自体が必要です。
インスタンス プロファイルは次のようになります。
"Resources" : {
"InstanceProfile" : {
"Type" : "AWS::IAM::InstanceProfile",
"Properties" : {
"Path" : "/",
"Roles" : ["MyExistingRole"]
}
},
"Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"IamInstanceProfile" : {"Ref" : "InstanceProfile"}
...
}
}
特に、インスタンス プロファイルでの参照は既存の RoleName に対するものであることに注意してください。
また 、インスタンスのプロファイルとロールを使用してセキュリティを永続化しないことを保証するインスタンスのブートストラップについても書いています。
重要なことは、{"Ref" : RoleName} などを使用するのではなく、ロールの実際の名前を使用することです。
IAM ロールで何をしようとしていますか?
制限付き S3 バケットへのアクセスが必要な cfn スクリプトがあります。私のインスタンス ブロックは次のようになります。
"Resources" : {
"myInstance" : {
"Type" : "AWS::EC2::Instance",
"Metadata" : {
"Comment1" : "My Instance stuff here",
"AWS::CloudFormation::Authentication": {
"default" : {
"type": "s3",
"buckets": [ { "Ref" : "bucketName" } ],
"roleName": { "Ref" : "RoleName" }
}
},
...snip...
編集: インスタンスを作成するときに、プロパティの一部としてロールを含めます。
"Properties" : {
"ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "64"] },
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroups" : [ {"Ref" : "SecurityGroup"} ],
"IamInstanceProfile" : { "Ref" : "RoleName" },
"KeyName" : { "Ref" : "KeyName" },
"BlockDeviceMappings" : [
{
"DeviceName" : "/dev/sda1",
"Ebs" : { "VolumeSize" : "10" }
}
],
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -v\n",
...snip...
] ] } }
そして RoleName は私のパラメータセクションで定義されています:
"Parameters" : {
"RoleName" : {
"Description" : "Role description",
"Type" : "String",
"Default" : "my-default-role",
"ConstraintDescription" : "Must be a valid IAM Role"
}
}
起動テンプレートを使用する場合、構文は ec2instance または起動構成と比較して少し異なります。
以下は、起動テンプレートを使用している yaml の例です。
LaunchTemplate:
Properties:
LaunchTemplateData:
IamInstanceProfile:
Name: !Ref ExistingInstanceProfileName