AWS

AWS System Managerのセッションマネージャ:Privateインスタンスへの接続【手順】

AWS

AWS上のEC2インスタンスへコンソール接続する方法として、AWS Systems Manager のセッションマネージャーを利用する方法を試してみました。

セッションマネージャーではパブリックに公開されているEC2インスタンスだけでなく、公開されていないプライベート環境のEC2インスタンスにもコンソールに接続することができます。

そのため、外部に公開する踏み台サーバなどを用意する必要もなく、利便性だけではなくセキュリティ的にも向上します。
ただし、プライベート環境に接続するには、幾つかのセットアップが必要となります。

今回はオフラインのEC2インスタンスに対してセッションマネージャーを利用する方法を紹介します。

今回紹介する中で作成するVPCエンドポイントは、利用料金がかかりますので注意してください。

1. 今回の環境

結構分かりにくいので図にしてみました。

セッションマネージャーはAWSマネージドサービスでインターネットなどからアクセスできる場所にあります。
パブリックからはInternetGateway経由でアクセスできますが、プライベートからアクセスするために VPCエンドポイントを経由する必要があります。

2. IAMロール作成

まず、セッションマネージャを利用するために必要な権限を作成します。
私は普段からIAM RoleはCloudFormationで管理していますので、その部分を抜粋します。

この例では、SsmSessionManagerPolicyを作成してEc2InstanceBaseRoleにアタッチしています。

Resources:
  Ec2InstanceBaseRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - !Sub "ec2.${AWS::URLSuffix}"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: aws-infra-policy-ec2-base
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - "ec2:Describe*"
                  - "ec2:CreateTags"
                  - "s3:PutObject"
                  - "s3:ListBucket"
                  - "s3:GetObject"
                Resource: "*"

  SsmSessionManagerPolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: "aws-infra-ssmsessionmanager-policy"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action:
              - "ssm:DescribeAssociation"
              - "ssm:GetDeployablePatchSnapshotForInstance"
              - "ssm:GetDocument"
              - "ssm:DescribeDocument"
              - "ssm:GetManifest"
              - "ssm:GetParameter"
              - "ssm:GetParameters"
              - "ssm:ListAssociations"
              - "ssm:ListInstanceAssociations"
              - "ssm:PutInventory"
              - "ssm:PutComplianceItems"
              - "ssm:PutConfigurePackageResult"
              - "ssm:UpdateAssociationStatus"
              - "ssm:UpdateInstanceAssociationStatus"
              - "ssm:UpdateInstanceInformation"
            Resource: "*"
          - Effect: "Allow"
            Action:
              - "ssmmessages:CreateControlChannel"
              - "ssmmessages:CreateDataChannel"
              - "ssmmessages:OpenControlChannel"
              - "ssmmessages:OpenDataChannel"
            Resource: "*"
          - Effect: "Allow"
            Action:
              - "ec2messages:AcknowledgeMessage"
              - "ec2messages:DeleteMessage"
              - "ec2messages:FailMessage"
              - "ec2messages:GetEndpoint"
              - "ec2messages:GetMessages"
              - "ec2messages:SendReply"
            Resource: "*"
      Roles:
        - !Ref Ec2InstanceBaseRole

このRoleをEC2インスタンスにアタッチします。
そうすることで、この段階でパブリックにあるEC2インスタンスにはセッションマネージャで接続できます。
※Security Groupなどでインターネットに対して443が空いていることが必要です。

3. VPCエンドポイントを作成する

次にプライベート用にVPCエンドポイントを作成します。
以下のサイトに説明されているように必要な種類のVPCエンドポイントを作成します。今回は5つのエンドポイントを作成しました。

Systems Manager を使用したインターネットアクセスなしでのプライベート EC2 インスタンスの管理

こちらもCloudFormationで構築した部分を抜粋しておきます。

  #-----------------------------------------------------------
  # VPC Endpoint
  #-----------------------------------------------------------
  SSMEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC
      SubnetIds:
        - !Ref PrivateSubnetA
        - !Ref PrivateSubnetC
      SecurityGroupIds:
        - !Ref SSMEndpointSG
  EC2MessageEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC
      SubnetIds:
        - !Ref PrivateSubnetA
        - !Ref PrivateSubnetC
      SecurityGroupIds:
        - !Ref SSMEndpointSG
  EC2Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2"
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC
      SubnetIds:
        - !Ref PrivateSubnetA
        - !Ref PrivateSubnetC
      SecurityGroupIds:
        - !Ref SSMEndpointSG
  SSMAgentEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC
      SubnetIds:
        - !Ref PrivateSubnetA
        - !Ref PrivateSubnetC
      SecurityGroupIds:
        - !Ref SSMEndpointSG
  S3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"
      VpcId: !Ref VPC
      RouteTableIds:
        - !Ref PrivateRouteTable

Deployすると以下のようにエンドポイントが5つ作成されます。

4. ルーティングを追加する

インターフェース型のVPCエンドポイント(S3)の場合は、ルーティング追加が必要です。
実はこちらは先ほどのVPCエンドポイント作成時に合わせてルーティングを追加しています。

  S3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"
      VpcId: !Ref VPC
      RouteTableIds:
        - !Ref PrivateRouteTable

5. セッションマネージャ接続を試してみる

それでは実際に接続をテストしています

EC2インスタンス画面から対象のインスタンスを選択して、「接続」をクリックします。

接続方法を選択する画面が表示されます。ここでセッションマネージャーを選択します。

コンソールが開くことを確認します。

セッションマネージャの画面からも接続できます。接続履歴なども確認できます。

AWSを効率的に学習する方法

私がAWSを学習するために使った学習材料は「Udemy」だけです。

まずは座学を行ってAWSプラクティショナー もしくは ソリューションアーキテクト試験を取得することを目標にしました。

具体的にはUdemyで以下の2つの商材を購入して学習しました。AWS公式が提供している模擬試験も受けていません。

Udemyは世界最大級のオンライン学習プラットフォームで、世界中の学びたい人と教えたい人をオンラインでつなぐサービスです。 Udemyは米国Udemy,Inc.が運営するプラットフォームで日本ではベネッセが事業パートナーとして協業をしています。 C2C(consumer to consumer)により生まれる豊富で多彩な講座により個人の学習ニーズに応じた学びをみつけることができます。

これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)
【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)

今回は以上となります。

コメント

タイトルとURLをコピーしました