こんにちは、株式会社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ロールを作成する
- IAMコンソールにサインインします。
- [アクセス管理] > [ロール] に移動して、「ロールを作成」 を選択します。
【ステップ1】 信頼されたエンティティを選択
- 信頼されたエンティティタイプ では、「AWS のサービス」を選択
- ユースケース では、「EC2」を選択
- 「次へ」を押下
- 【ステップ2】許可を追加
- 許可ポリシーでは、「AmazonSSMManagedInstanceCore」を選択
「次へ」を押下
- 【ステップ3】名前、確認、および作成
- ロールの詳細
- ロール名:「Custom-AdminRole-Test-EC2(任意)」
- 説明:「Created to perform administrative tasks on EC2 instances in test environments.(任意)」
「ロールを作成」を押下
- ロールの詳細
1-2. IAMロールをEC2インスタンスにアタッチする
- EC2コンソールにサインインします。
- [インスタンス] に移動して、作成したEC2インスタンスを選択します。
右上の [インスタンスの状態] > [セキュリティ] > 「IAMロールを変更」を選択します。
- 先ほど作成したIAMロールを選択して、「IAMロールの更新」を押下します。
これでEC2インスタンスにIAMロールをアタッチできました。
(2)SSM エージェント をEC2インスタンスにインストールする
AWSから提供されたAMIには、SSM エージェントは初期インストールされています。
本記事では、AWSイメージを利用するため導入手順を省略します。
(3)SSM エージェントからSSM APIを実行できる通信経路(アウトバウンド)を確保する
本記事では、VPCエンドポイントを利用してSSM エージェントがSSM APIと通信できるプライベートネットワークを構築して、通信経路を確保します。
パブリックサブネットを利用している場合、インターネット通信のインバウンド・アウトバウンドは確保されているため本手順は省略してください。
3-1. VPC で 「DNS ホスト名」と「DNS 解決」を有効化に更新する
- VPCコンソールにサインインします。
- [仮想プライベートクラウド] > [お使いのVPC]に移動して、対象のVPCを選択します。
- 右上の[アクション] > [VPC の設定を編集] を選択します。
- [DNS 設定] の 「DNS 解決を有効化」と「DNS ホスト名を有効化」にチェックを入れて、DNS機能の有効化を行います。
- 「保存」を押下
3-2. PrivateLink用のインバウンドルールを追加する
SSM エージェントからSSM APIまでの通信プロトコルは、すべてHTTPSで通信を行います。
「2. 検証環境の構築手順」で作成したセキュリティグループにHTTPSトラフィックを許可するインバウンドルールを追加します。
- VPCコンソールにサインインします。
- [セキュリティ] > [セキュリティグループ] に移動して、EC2に設定されたセキュリティグループを選択します。
- インバウンドルール には 下記の設定を行います。
- タイプ:[HTTPS] を選択
- ソース:[10.0.0.0/16](VPC の IPv4 cider値)を選択
- 「ルールを保存」を押下
3-3. SSM用のVPCエンドポイントを作成する
PrivateLink経由でSSM APIを実行することを想定しているため、インターフェイスエンドポイントを3つ追加します。
(補足:ゲートウェイエンドポイントはSSMに対応していません)
- VPCコンソールにサインインします。
- [仮想プライベートクラウド] > [エンドポイント] に移動して、「エンドポイントを作成」 を選択します。
エンドポイントの作成
- エンドポイントの設定
- エンドポイント名:[Ssm-Test-Ssm-Endpoint](任意)を入力します。
- サービスカテゴリ:[AWSのサービス] を選択します。
- サービス
- サービス:[com.amazonaws.ap-northeast-1.ssm] を選択します。
- VPC
- VPC:対象のVPCを選択します。
- [追加設定] DNS 名を有効化:チェックします。(3-1で設定済み)
- [追加設定] DNS レコードの IP タイプ:[IPv4]
- サブネット
- サブネット:EC2が存在するAZを選択して、対象のサブネットを選択します。
- IP アドレスタイプ:[IPv4]
- セキュリティグループ
- 対象のセキュリティグループを選択します。(3-2でインバウンドルールを追加したSGを選択)
- ポリシー
- [フルアクセス] を選択します。
「エンドポイントを追加」を押下
上記の手順を繰り返して、
・サービス:[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 を 利用してリモート接続する手順
- AWS Systems Managerコンソールにサインインします。
- [ノード管理] > [Session Manager]に移動します。
- [セッション]画面で 接続したいインスタンスを選択して、[セッションの開始]を選択します。
- セッション情報の設定画面が表示されますが、特に設定値を追加・変更することなく [Next]を選択します。
- 最後に [start session] を押せば、ブラウザ上でSSHポートを穴あけすることなくSSH接続できました。