web-dev-qa-db-ja.com

CloudFormationで既存のIAMロールをEC2インスタンスに関連付ける

CloudFormationテンプレートで新しいロールを作成するのではなく、EC2インスタンスに既存のIAMロールを使用するにはどうすればよいですか?

たとえば、AWSコンソールでロールを作成し、それを使用したいだけです。

16
Bevan

インスタンスプロファイル、ロール、インスタンス情報(または起動構成)自体が必要です。

インスタンスプロファイルは次のようになります。

"Resources" : {
  "InstanceProfile" : {
    "Type" : "AWS::IAM::InstanceProfile",
    "Properties" : {
      "Path" : "/",
      "Roles" : ["MyExistingRole"]
    }
  },

  "Instance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "IamInstanceProfile" : {"Ref" : "InstanceProfile"}
      ...
    }
  }

特に-インスタンスプロファイル内の参照は既存のRoleNameへの参照であることに注意してください

また、- インスタンスのブートストラップについて書きました これは、インスタンスのプロファイルとロールを使用して、セキュリティを維持しないようにします。

重要なのは、ロールの実際の名前を使用するために{"Ref":RoleName}などを使用することではありません。

25
Pete - MSFT

スタック内から新しいインスタンスを作成する代わりに、既存の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",
      ...
    }
  }
}
25

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"
    }
  }
0
chris