CloudFormationでEC2のインスタンスプロファイルを指定する時は、ARNや名前の指定に注意しよう
こんにちは。まるとです。
皆様、EC2にIAMロールなどプロファイルを設定して、AWSサービスに接続しに行くことも結構あるのではないかと思います。
今回はCloudFormation(以下、CFn)でEC2を構築し、インスタンスプロファイルを設定する際に一つつまづいたことがあるのでメモします。
先に結論
IAMロールとインスタンスプロファイルは間違えないように指定しよう
EC2向けIAMロールを作成した時の挙動について
IAMでEC2向けのロールを作成すると、IAMロールとインスタンスプロファイル、合わせて2つのARNが付与されます。
AWS マネジメントコンソール上からIAMロールを作成する際は、IAMロールとインスタンスプロファイルどちらも同じ名前が付与されます。
どういった時に注意すべき?
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
まとめ
非常に細かいところかつ分かりやすいところですが、つまづいてしまったのでメモしました。
もし、インスタンスプロファイル周りでエラーが出た時は、指定している名前が間違えていないか確認してみてください。