CloudFormationテンプレートで新しいロールを作成するのではなく、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}などを使用することではありません。
スタック内から新しいインスタンスを作成する代わりに、既存のInstanceProfileを使用できます。実際、すでに作成されている可能性があります- the docs から:
AWSマネジメントコンソールを使用してAmazon EC2のロールを作成する場合、コンソールは自動的にインスタンスプロファイルを作成し、ロールと同じ名前を付けます。
つまり、スタックにAWS::IAM::InstanceProfile
リソースを作成する必要がない場合があります。ただし、次の点にも注意してください。
コンソールは、Amazon EC2に関連付けられていないロールのインスタンスプロファイルを作成しません。
この場合、次の2つのコマンドを使用してAWS CLIから手動で実行できます。
aws iam create-instance-profile --instance-profile-name MyExistingRole
aws iam add-role-to-instance-profile --instance-profile-name MyExistingRole --role-name MyExistingRole
次に、MyExistingRole
という名前のUIでロールを定義した場合、これで十分です。
"Resources" : {
"Instance" : {
"Type" : "AWS::EC2::Instance",
...
"Properties" : {
"IamInstanceProfile" : "MyExistingRole",
...
}
}
}
IAMロールで何をしようとしていますか?
制限付きS3バケットへのアクセスを必要とするcfnスクリプトがあります。私のインスタンスブロックは次のようになります。bucketNameとRoleNameはどちらもパラメーターで、デフォルトは次のとおりです。
"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"
}
}