🌟

[CloudFormation] SSM アクセスができる EC2 インスタンスを作成

2021/08/09に公開

この記事でやること

・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 を指定します

参考

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html

Discussion