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つのエンドポイントを作成しました。

インターネットにアクセスせずにプライベート EC2 インスタンスを管理する
私の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスはインターネットにアクセスできません。AWS Systems Manager を使用してインスタンスを管理したいと思います。

こちらも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を学習するために実施した方法は以下の通りです。
 ①最初に書籍(ハンズオンができる)を購入、座学でAWSの基礎を学習
 ②AWS資格試験を取得ための学習

※私の場合は①と②を合わせて2か月でソリューションアーキテクトを取得できました。

①AWS基礎学習

最初に購入した書籍は「Amazon Web Services 基礎からのネットワーク&サーバー構築」です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

この本では、AWSの基本サービスを利用したハンズオンを通じて、AWSの基礎を学習することができます。

また、タイトル通りAWSのネットワークやインフラに関しても網羅しているため、もともとインフラ系の技術者ではない人たちにとっても分かりやすい内容だと思います。

とりあえずAWS上にサーバーを設定して開発を行うための準備までするには最良の一冊です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

②AWS資格取得

AWSの基礎をある程度学習することができたら、次はAWS資格を取得しましょう。まずはAWSソリューションアーキテクトを目指しましょう。

資格勉強のための問題集をひたすら解きながら、AWSの知識を積み重ねて習得していきましょう!

苦行ではありますがこの問題集を3周ほどすればAWS用語や構成に関しても習得できているはずです。

AWS認定ソリューションアーキテクト-アソシエイト問題集

今回は以上となります。

コメント