[CloudFormation] SSM アクセスができる EC2 インスタンスを作成
この記事でやること
・EC2 インスタンスをデプロイ
・SSM Session Manager でのアクセスをできるようにする
使用するテンプレート
AWSTemplateFormatVersion: 2010-09-09
Parameters:
ImageId:
Type: String
PrivateSubnetId:
Type: String
Resources:
EC2Role:
Type: AWS::IAM::Role
Properties:
Path: /
RoleName: !Sub ${AWS::StackName}-EC2Role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
MaxSessionDuration: 3600
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: /
Roles:
- !Ref EC2Role
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: t2.micro
IamInstanceProfile: !Ref InstanceProfile
SubnetId: !Ref PrivateSubnetId
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-EC2
※ Parameters セクションの値はハードコードしても問題ありません
このテンプレートではテンプレートの汎用性のために Paramaters セクションにしてます
テンプレートの展開確認
下記リソースが展開されます
EC2 の詳細画面では作成した IAM ロールがアタッチされています
※Security Group は今回作成していないため、デフォルトのものがアタッチされています
SSM でのアクセスも可能なことが確認できます
各リソースの説明
EC2Role:
Type: AWS::IAM::Role
Properties:
Path: /
RoleName: !Sub ${AWS::StackName}-EC2Role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
MaxSessionDuration: 3600
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM
SSM アクセスを許可する IAM ロールを作成します
・RoleName: 作成する IAM ロールの名前を指定します
→ IAM ロールは名前が一意である必要があるため、スタック名を含めることで重複を防ぎます
・AssumeRolePolicyDocument: 作成する IAM ロールの信頼関係の設定を行います
→ ここでは EC2 サービスに対してこのロールを使用する権限を付与しています
・ManagedPolicyArns: IAM ロールにアタッチする IAM ポリシーを指定します
→ ここではマネージドポリシーの「AmazonEC2RoleforSSM」を指定します
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: /
Roles:
- !Ref EC2Role
インスタンスプロファイルを作成します
CloudFormation を使用して EC2 インスタンスを作成し IAM ロールをアタッチする際は、
インスタンスプロファイルを作成し EC2 インスタンスのプロパティに設定する必要があります
※EC2 インスタンスと IAM ロールを繋ぐコネクタのようなものです
参考:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html
・Roles: 上記で作成した IAM ロールを指定します
→ ここではロール名を指定する必要があるため '!Ref' を使用します
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: t2.micro
IamInstanceProfile: !Ref InstanceProfile
SubnetId: !Ref PrivateSubnetId
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-EC2
EC2 インスタンスを作成します
・ImageId: 使用する AMI Id を指定します
・InstanceType: 作成する EC2 インスタンスのインスタンスタイプを指定します
→ ここでは 't2.micro' を指定していますが随時変更ください
・IamInstanceProfile: 上記で作成したインスタンスプロファイルを指定します
→ ここではインスタンスプロファイル名を指定する必要があるため '!Ref' を使用します
・SubnetId: EC2 インスタンスをデプロイするサブネットの ID を指定します
参考
Discussion