CloudFormationでEC2のインスタンスプロファイルを指定する時は、ARNや名前の指定に注意しよう

CloudFormationでEC2のインスタンスプロファイルを指定する時は、ARNや名前の指定に注意しよう

Clock Icon2025.04.10

こんにちは。まるとです。
皆様、EC2にIAMロールなどプロファイルを設定して、AWSサービスに接続しに行くことも結構あるのではないかと思います。
今回はCloudFormation(以下、CFn)でEC2を構築し、インスタンスプロファイルを設定する際に一つつまづいたことがあるのでメモします。

先に結論

IAMロールとインスタンスプロファイルは間違えないように指定しよう

EC2向けIAMロールを作成した時の挙動について

IAMでEC2向けのロールを作成すると、IAMロールとインスタンスプロファイル、合わせて2つのARNが付与されます。
AWS マネジメントコンソール上からIAMロールを作成する際は、IAMロールとインスタンスプロファイルどちらも同じ名前が付与されます。
1

どういった時に注意すべき?

CFnでEC2インスタンスを作成する際、以下の2ケースで注意が必要です。

起動テンプレートを使用し、インスタンスプロファイルにARNを指定する場合

仮に以下のCFnテンプレートがあったとします。

AWSTemplateFormatVersion: 2010-09-09
Description: Test

Resources: 
# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------# 
# Launch Template
  EC2LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: TestTenplate
      LaunchTemplateData:
        InstanceType: t3.micro
        ImageId: ami-0599b6e53ca798bb2
        KeyName: TestKey
        IamInstanceProfile:
          Arn: arn:aws:iam::************:instance-profile/EC2SSMAccess  # ここに注目
        MetadataOptions:
          HttpTokens: required
# Instance
  DemoEC2:
    Type: AWS::EC2::Instance
    Properties:
      NetworkInterfaces:
        - AssociatePublicIpAddress: false
          DeviceIndex: 0
          SubnetId: subnet-yyyyyyyyyyyyy
          GroupSet: 
           - sg-xxxxxxxxxxxxxxx
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 100
            VolumeType: gp3
            Encrypted: true
      LaunchTemplate:
        LaunchTemplateId: !Ref EC2LaunchTemplate
        Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
      Tags:
        - Key: Name
          Value: Test

わかりやすいといえば、わかりやすい箇所ですが、この場合「instance-profile/」がついている、インスタンスプロファイルのARNを入れる必要があります。
「role/」がついているARNを指定しても、エラーとなるので注意が必要です。

IAMロールとインスタンスプロファイルの名前が異なる場合

AWSマネジメントコンソール上でEC2向けIAMロールを作成した場合、IAMロール名とインスタンスプロファイル名が同じになるため、あまり意識する必要がありませんが、CFnでIAMロールを作成すると名前を別々にすることができます。

AWSTemplateFormatVersion: 2010-09-09
Description: Test

Resources: 
  EC2IAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - Effect: Allow
            Principal: 
              Service: 
                - ec2.amazonaws.com
            Action: 
              - 'sts:AssumeRole'
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      RoleName: EC2TestRole # ここに注目
      Tags:
        - Key: Name
          Value: EC2TestRole

  EC2IAMInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: EC2TestRoleProfile # ここに注目
      Roles: 
        - !Ref EC2IAMRole

名前が異なる場合、EC2インスタンスをCFnで作成する際に必要な前はインスタンスプロファイル側となります。

EC2TestRole : IAMロール名
EC2TestRoleProfile : インスタンスプロファイル名(こっちが必要)

実際にCFnでEC2インスタンスを作成する際は以下のようになります。

AWSTemplateFormatVersion: 2010-09-09
Description: Test

Resources: 
# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------# 
  DemoEC2:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t3.micro
      ImageId: ami-0599b6e53ca798bb2
      KeyName: TestKey
      IamInstanceProfile: EC2TestRoleProfile  # インスタンスプロファイル名を入れる
      NetworkInterfaces:
        - AssociatePublicIpAddress: false
          DeviceIndex: 0
          SubnetId: subnet-yyyyyyyyyyyyy
          GroupSet: 
           - sg-xxxxxxxxxxxxxxx
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 20
            VolumeType: gp3
            Encrypted: true
      Tags:
        - Key: Name
          Value: Test

まとめ

非常に細かいところかつ分かりやすいところですが、つまづいてしまったのでメモしました。
もし、インスタンスプロファイル周りでエラーが出た時は、指定している名前が間違えていないか確認してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.