FIXER cloud.config Tech Blog
AWS Systems Managerを使いAWS PrivateLink経由でEC2にSSH接続する方法
2023年06月14日 10時00分更新
本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「【AWS Systems Manager】プライベートサブネット内のEC2にAWS PrivateLink経由でリモート接続してみた 」を再編集したものです。
こんにちは、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接続できました。
村上滉樹/FIXER
FIXER|エンタープライズ部門所属
2020年4月 新卒入社
職業:Cloud Solution Engineer(主にインフラ)
好きなAWS/Azureサービス:AWS Fargate / App Service
この連載の記事
-
TECH
Github Copilotで、コミットメッセージもAIに考えてもらう方法 -
TECH
Terraform 1.5から追加されたimportブロックがすごい!! -
TECH
Prometheusで辞書形式のメトリクスを持つExporterを作りたい! -
TECH
GTM経由でカスタムディメンションを取得するTypeScript -
TECH
Grafana Tempo×OpenTelemetryの導入方法 -
TECH
Grafana TempoとLokiの連携で進化するログ解析とトレーシング -
TECH
「Microsoft 365開発者プログラム」のアクティベーション方法 -
TECH
サインインなしでも使える! 開発者向けAI検索エンジン「Phind」をご紹介 -
TECH
え、高級言語しか触ったことないのにCPUを自作するんですか!? -
TECH
Terraformを用いてAKS上にFluxを導入する方法 -
TECH
Github Copilot Chatをさらに便利にする3つの機能 - この連載の一覧へ