【AWS Systems Manager】プライベートサブネット内のEC2にAWS PrivateLink経由でリモート接続してみた
2023-05-23
azblob://2023/05/23/eyecatch/2023-05-23-ec2-systems-manager-vpc-endpoints-000.png.png

こんにちは、株式会社FIXERの村上です。

AWS Systems Manager を使用して、AWS PrivateLink(インターフェースVPCエンドポイント)経由でプライベートサブネット内のAmazon Linux 3にSSH接続する手順をブログにしました。

※ 本記事は AWS CloudShell で操作することを前提としています。ただし、以下の要件を満たせばローカルPCでも動作します。

1. ローカル環境の推奨要件

  • AWS CLI v2 をインストールしていること
  • PowerShell 7 をインストールしていること

2. 検証環境の構築手順(省略可能)

AWS CLI で各リソースを作成します。本記事は「東京リージョン」を想定しています。

(1)環境変数を定義する

# VPC の IPv4 CIDR ブロック 
$vpc_ipv4_cidr_block = '10.0.0.0/16'
# サブネット の IPv4 CIDR ブロック
$subnet_ipv4_cidr_block = '10.0.0.0/24'
# セキュリティグループ名 
$security_group_name = 'techblog-sg'
# セキュリティグループの説明文
$security_group_description = 'Security group for techblog.'
# キーペア名
$key_name = 'techblog-keypair'

(2)キーペアを作成する(既存のキーペアを利用する場合は、省略可能)

# キーペアを作成して、カレントディレクトリ配下に公開鍵をダウンロードする
aws ec2 create-key-pair --key-name $key_name --key-type rsa --key-format pem --output text > "$key_name.pem"

(3)下記のコマンドを実行して、検証環境のリソースを作成する

# VPC を作成する
$vpc_id = aws ec2 create-vpc --cidr-block $vpc_ipv4_cidr_block --query 'Vpc.VpcId' --output text

# プライベートサブネット を作成する
$subnet_id = aws ec2 create-subnet --vpc-id $vpc_id --cidr-block $subnet_ipv4_cidr_block --query 'Subnet.SubnetId' --output text

# セキュリテグループ を作成する
$sg_id = aws ec2 create-security-group --group-name $security_group_name --description $security_group_description --vpc-id $vpc_id  --query 'GroupId' --output text

# Amazon Linux3 のAMIイメージを取得する
$ami_id = aws ec2 describe-images --owners amazon --filters 'Name=name,Values=al2023-ami-2023.*.*.*-kernel-6.1-x86_64' 'Name=state,Values=available' --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' --region ap-northeast-1 --output text

# EC2インスタンス を作成する
aws ec2 run-instances --image-id $ami_id --count 1 --instance-type t2.micro --key-name $key_name --subnet-id $subnet_id --security-group-ids $sg_id --no-associate-public-ip-address

※1:AMIのイメージIDは、リージョンごとに異なるため EC2インスタンスと同じリージョンにしてください。
※2:AMIのイメージはAWSから提供されているものに限ります。自作AMIを用いる場合は、SSM Agentをインストールした状態にしてください。

3. AWS Systems Manager を 利用するための設定手順

AWS Systems Managerを利用するためには、下記 3つの条件を満たす制約があります。

(1)EC2インスタンスにIAMロールをアタッチする

AmazonSSMManagedInstanceCore」ポリシーを付与されたIAMロールを作成して、EC2インスタンスにアタッチします。

1-1. IAMロールを作成する

  1. IAMコンソールにサインインします。
  2. [アクセス管理] > [ロール] に移動して、「ロールを作成」 を選択します。
  3. 【ステップ1】 信頼されたエンティティを選択

    1. 信頼されたエンティティタイプ では、「AWS のサービス」を選択
    2. ユースケース では、「EC2」を選択
    3. 「次へ」を押下
  4. 【ステップ2】許可を追加
    1. 許可ポリシーでは、「AmazonSSMManagedInstanceCore」を選択
    2. 「次へ」を押下

  5. 【ステップ3】名前、確認、および作成
    1. ロールの詳細
      1. ロール名:「Custom-AdminRole-Test-EC2(任意)」
      2. 説明:「Created to perform administrative tasks on EC2 instances in test environments.(任意)」
    2. 「ロールを作成」を押下

1-2. IAMロールをEC2インスタンスにアタッチする

  1. EC2コンソールにサインインします。
  2. [インスタンス] に移動して、作成したEC2インスタンスを選択します。
  3. 右上の [インスタンスの状態] > [セキュリティ] > 「IAMロールを変更」を選択します。

  4. 先ほど作成したIAMロールを選択して、「IAMロールの更新」を押下します。

これでEC2インスタンスにIAMロールをアタッチできました。

(2)SSM エージェント をEC2インスタンスにインストールする

AWSから提供されたAMIには、SSM エージェントは初期インストールされています。
本記事では、AWSイメージを利用するため導入手順を省略します。

(3)SSM エージェントからSSM APIを実行できる通信経路(アウトバウンド)を確保する

本記事では、VPCエンドポイントを利用してSSM エージェントがSSM APIと通信できるプライベートネットワークを構築して、通信経路を確保します。
パブリックサブネットを利用している場合、インターネット通信のインバウンド・アウトバウンドは確保されているため本手順は省略してください。

3-1. VPC で 「DNS ホスト名」と「DNS 解決」を有効化に更新する

  1. VPCコンソールにサインインします。
  2. [仮想プライベートクラウド] > [お使いのVPC]に移動して、対象のVPCを選択します。
  3. 右上の[アクション] > [VPC の設定を編集] を選択します。
  4. [DNS 設定] の 「DNS 解決を有効化」と「DNS ホスト名を有効化」にチェックを入れて、DNS機能の有効化を行います。
  5. 「保存」を押下

3-2. PrivateLink用のインバウンドルールを追加する

SSM エージェントからSSM APIまでの通信プロトコルは、すべてHTTPSで通信を行います。
「2. 検証環境の構築手順」で作成したセキュリティグループにHTTPSトラフィックを許可するインバウンドルールを追加します。

  1. VPCコンソールにサインインします。
  2. [セキュリティ] > [セキュリティグループ] に移動して、EC2に設定されたセキュリティグループを選択します。
  3. インバウンドルール には 下記の設定を行います。
    1. タイプ:[HTTPS] を選択
    2. ソース:[10.0.0.0/16](VPC の IPv4 cider値)を選択
    3. 「ルールを保存」を押下

3-3. SSM用のVPCエンドポイントを作成する

PrivateLink経由でSSM APIを実行することを想定しているため、インターフェイスエンドポイントを3つ追加します。
(補足:ゲートウェイエンドポイントはSSMに対応していません)

  1. VPCコンソールにサインインします。
  2. [仮想プライベートクラウド] > [エンドポイント] に移動して、「エンドポイントを作成」 を選択します。
  3. エンドポイントの作成

    1. エンドポイントの設定
      1. エンドポイント名:[Ssm-Test-Ssm-Endpoint](任意)を入力します。
      2. サービスカテゴリ:[AWSのサービス] を選択します。
    2. サービス
      1. サービス:[com.amazonaws.ap-northeast-1.ssm] を選択します。
    3. VPC
      1. VPC:対象のVPCを選択します。
      2. [追加設定] DNS 名を有効化:チェックします。(3-1で設定済み)
      3. [追加設定] DNS レコードの IP タイプ:[IPv4]
    4. サブネット
      1. サブネット:EC2が存在するAZを選択して、対象のサブネットを選択します。
      2. IP アドレスタイプ:[IPv4]
    5. セキュリティグループ
      1. 対象のセキュリティグループを選択します。(3-2でインバウンドルールを追加したSGを選択)
    6. ポリシー
      1. [フルアクセス] を選択します。

    「エンドポイントを追加」を押下

    上記の手順を繰り返して、

    ・サービス:[com.amazonaws.ap-northeast-1.ssmmessages](エンドポイント名:Ssm-Test-SsmMessages-Endpoint(任意))
    ・サービス:[com.amazonaws.ap-northeast-1.ec2messages](エンドポイント名:Ssm-Test-Ec2Messages-Endpoint(任意))

    のVPCエンドポイントを作成します。

    <補足>
    ※ Windows Server を利用する場合、EBS上でWindows VSSを使用するときは、下記のエンドポイントも追加してください。

    ・サービス:com.amazonaws.ap-northeast-1.ec2(エンドポイント名:Ssm-Test-Ec2-Endpoint(任意))

これで、AWS Systems Manager を利用するための設定は完了しました。

※(1)から(3)を設定されたEC2インスタンスのことを AWSでは、マネージドインスタンス と呼びます。

4. AWS Systems Manager を 利用してリモート接続する手順

  1. AWS Systems Managerコンソールにサインインします。
  2. [ノード管理] > [Session Manager]に移動します。
  3. [セッション]画面で 接続したいインスタンスを選択して、[セッションの開始]を選択します。
  4. セッション情報の設定画面が表示されますが、特に設定値を追加・変更することなく [Next]を選択します。
  5. 最後に [start session] を押せば、ブラウザ上でSSHポートを穴あけすることなくSSH接続できました。