AWS上のEC2インスタンスへコンソール接続する方法として、AWS Systems Manager のセッションマネージャーを利用する方法を試してみました。
セッションマネージャーではパブリックに公開されているEC2インスタンスだけでなく、公開されていないプライベート環境のEC2インスタンスにもコンソールに接続することができます。
そのため、外部に公開する踏み台サーバなどを用意する必要もなく、利便性だけではなくセキュリティ的にも向上します。
ただし、プライベート環境に接続するには、幾つかのセットアップが必要となります。
今回はオフラインのEC2インスタンスに対してセッションマネージャーを利用する方法を紹介します。
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つのエンドポイントを作成しました。
こちらも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用語や構成に関しても習得できているはずです。
今回は以上となります。
コメント