今回のゴール
今までEC2に接続する際、パブリックサブネットのEC2にはリモート端末から直接SSHし、プライベートサブネットのEC2にはBastionサーバー経由で接続してました。
今回はSSMのセッションマネージャー経由でEC2に接続します。
セッションマネージャーを使用すると下記ようなのメリットがあります。
- プライベートサブネットのEC2インスタンスに接続可能となるのでBastionサーバーが不要となる
- SSHポートを開放する必要がなくなる
- コマンドのログを保存できる(SSHを使用したポートフォワーディングでは不可)
- IAMでアクセス制御を行うため、キーペアの管理が不要(SSHを使用したポートフォワーディングでは不可)
下記は今回構成するイメージです。

SSMにアクセスするロールの作成
EC2からSSMにアクセスできるようにロールを作成します。
IAMサービスより、[ロール]をクリックして「ロールの作成」ボタンをクリックします。

[信頼されたエンティティの種類を選択]:AWSサービス
[ユースケースの選択]:EC2

AmazonSSMManagedInstanceCoreにチェック

必要であればタグを指定して次へ

[ロール名]:AllowSSMRole (任意)

既存EC2にロールをアタッチ
先ほど作成したロールをEC2にアタッチします。
EC2サービスより該当のEC2を選択して、[アクション]-[セキュリティー]-[IAMロールを変更]をクリックします。

作成した”AllowSSMRole”を選択します。

VPCエンドポイントの作成
今回はインターネットを経由せずにVPCから直接SSMにアクセスしたいので、VPCエンドポイントを作成します。
VPCエンドポイント用のセキュリティーグループの作成
VPCエンドポイントにアタッチするセキュリティーグループを作成します。
EC2サービスより[セキュリティーグループ]を選択して、「セキュリティーグループを作成」ボタンをクリックします。

【基本的な詳細】
[セキュリティーグループ名]:sg_endpoint_ssm (任意)
[説明]:access to SSM (任意)
[VPC]:VPCを選択
【インバウンドルール】
[タイプ]:https [ソース]:10.0.0.1/24 (任意)

VPCエンドポイントの作成
VPCサービスの[エンドポイント]から「エンドポイントの作成」をクリックします。

[サービス名]:com.amazonaws.[region].ssm
[VPC]:任意
[サブネット]:任意
[セキュリティーグループ]:先ほど作成したセキュリティーグループ(sg_endpoint_ssm)を選択

※同様に下記のサービス名についてもエンドポイントを作成します。
com.amazonaws.[region].ec2messages
com.amazonaws.[region].ssmmessages
S3用のエンドポイント作成(ゲートウェイタイプ)
S3へのエンドポイントを作成します。
ログの保存とSSMエージェントの更新に使用されます。
詳細は下記のリンクを参照ください
Systems Manager の VPC エンドポイントの作成
VPCサービスの[エンドポイント]-「エンドポイントの作成」をクリックします。
[サービス名]:S3 Gatewayタイプ
[ルートテーブル設定]:プライベートサブネットで指定しているルートテーブルを選択

設定確認
“ssm.ap-northeast-1.amazonaws.com”の名前解決がプライベートIPになっているか確認します。
もし、パブリックIPアドレスになっていて、VPC内にドメインコントローラーが存在するときは、下記のリンクを参照してください。
ログの保存設定
コマンドのログを保存する設定を行います。
今回はS3にログを保存します。
作成方法は割愛しますが、S3バケットを作成します。
SSMの設定
SSMサービスより、[セッションマネージャー]を選択して、[設定]タブを選択し「編集」ボタンをクリックします。
【S3 logging】
[Send session logs to S3]:Enableにチェック
バケット名を選択します。

EC2のロール設定
EC2のロールにログを出力できるよう下記のポリシーをアタッチします。
- s3:PutObject
また、今回はS3バケットをSSM-KMSで暗号化しておりますので下記のポリシーアタッチします。
- s3:GetEncryptionConfiguration
- ssmmessages:CreateControlChannel
- ssmmessages:CreateDataChannel
- ssmmessages:OpenControlChannel
- ssmmessages:OpenDataChannel
- ssm:UpdateInstanceInformation
詳細は下記のリンクを確認ください。
Session Manager および Amazon S3 および CloudWatch Logs (コンソール) のアクセス許可を持つインスタンスプロファイルの作成
設定確認
S3へのアクセスがエンドポイント経由で行われいるかのチェックは下記を参照してください。
通信データの暗号化
デフォルトでは、ローカルPCとEC2インスタンス間のセッションデータはTLS1.2で暗号化されております。
KMSキーを使用して転送中のデータをさらに暗号化する事ができます。
IAMポリシーの付与
ユーザーにKMSのの該当キーへのGenerateDataKeyアクセスを許可します。
EC2インスタンスにKMSの該当キーへのDecryptアクセスを許可します。
手順は下記を参照ください。
セッションデータの KMS キー暗号化を有効にする (コンソール)
暗号化の有効化
SSMサービスより、[セッションマネージャー]を選択して、[設定]タブを選択し「編集」ボタンをクリックします。
【General preferences】
[Enable KMS encryption]:Enableにチェック

設定確認
SSMサービスより[フリートマネージャー]を選択します。
ここに表示されている時点でEC2とSSMとのやり取りは正常に動作しているのですが、試しにセッションマネージャーで接続してみます。
該当のEC2インスタンスを選択して、[インスタンスアクション]-[セッションの開始]を選択します。

無事に接続できました。

S3を確認すると、ログが出力されてました。(数分時間がかかります。)
