はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須ローカルに AWS CLI が導入されていること
- あると良いVPC エンドポイントまたは NAT ゲートウェイのどちらかを扱った経験
※ ローカル端末は Windows を想定し、PowerShell から Session Manager プラグイン経由で EC2 に接続する手順で説明します。SSH の鍵やポート開放は使いません。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
プライベートサブネットの EC2 インスタンスから S3 にアクセスしたい場合、よく使われる方法の1つが NAT ゲートウェイです。ただし NAT ゲートウェイは、起動時間とデータ処理量に応じた料金がかかります。S3へのアクセスだけが目的なら、もっと安く済む方法があります。
それがS3 用の VPC ゲートウェイエンドポイントです。ルートテーブルに1行追加するだけで、インターネットを一切経由せず、AWS のネットワークの中だけで S3 へ到達できるようになります。今回は、エンドポイントを追加する前と後で、S3への到達性がどう変わるかを実際に比較します。
NATゲートウェイの代わりに、いつでもこのエンドポイントを使えるの?
S3 やDynamoDBなど、ゲートウェイ型エンドポイントが用意されている一部のサービスに限られます。他のサービスへの一般的なインターネットアクセス(パッケージの更新など)が必要な場合は、NAT ゲートウェイなど別の方法が必要です。今回は「S3への到達経路だけ」を解決する方法だという点がポイントです。
プライベートサブネットのEC2に、SSHの鍵やポート開放なしでどうやって入るの?
Systems Manager の Session Manager を使います。EC2 に IAM ロールを持たせ、Session Manager 用のインターフェース型エンドポイントを3つ用意しておくことで、SSH の鍵もポート開放も使わずにシェルへ接続できます。
プライベートサブネットの EC2 から、S3 用のゲートウェイエンドポイントを追加する前は aws s3 ls が失敗し、追加した後は成功することを、Session Manager 経由で接続したシェルの中で確認する。
つくる構成
同じ EC2・同じプライベートサブネットのまま、ルートテーブルにS3用のゲートウェイエンドポイントを追加する前後で、S3への到達性がどう変わるかを比較します。
S3への経路がない
AWSネットワーク内で直接到達
※ インターネットゲートウェイやNATゲートウェイは、どちらの状態でも使いません。
要件
以下の要件を満たし、「届かない」→「エンドポイント追加」→「届く」という変化を確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | インターネットゲートウェイ・NATゲートウェイへのルートを持たないプライベートサブネットを用意する。 |
| 3 | そのサブネットに、Systems Manager 用のIAMロールを持つ EC2 インスタンスを1台起動する(名前は自由、例:s3-endpoint-demo)。Session Manager 接続のため、3つのインターフェース型エンドポイント(ssm / ssmmessages / ec2messages)を用意する。 |
| 4 | テスト用の S3 バケットを1つ作成する(名前は自由、例:endpoint-demo-yourname)。 |
| 5 | エンドポイント追加前に、EC2 から aws s3 ls を実行し、失敗(タイムアウト)することを確認する。 |
| 6 | S3用のゲートウェイ型VPCエンドポイントを作成し、プライベートサブネットのルートテーブルに関連付ける。 |
| 7 | エンドポイント追加後に、同じコマンドが成功することを確認する。 |
構築の進め方
「届かない状態を確認する」→「エンドポイントを追加する」→「届くようになることを確認する」という順番で進めます。
- フェーズ1 — プライベートサブネットとEC2を用意する
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
プライベートサブネットを用意する
VPC コンソールで、インターネットゲートウェイへのルートも、NATゲートウェイへのルートも持たないサブネットを1つ用意します(既存のVPCに新しいサブネットを追加するか、新しいVPCを作成して進めます)。
-
Systems Manager 用の IAM ロールを作成する
IAM コンソールで、EC2 用の信頼関係を持つロールを作成し、管理ポリシー
AmazonSSMManagedInstanceCoreをアタッチします。 -
Session Manager 用のインターフェースエンドポイントを3つ作成する
VPC コンソールの「エンドポイント」から、
com.amazonaws.ap-northeast-1.ssm、ssmmessages、ec2messagesの3つを、タイプ「インターフェース」でプライベートサブネットに作成します。セキュリティグループは、VPC内からのHTTPS(443)を許可するものを指定します。Session Manager接続用の準備この3つのエンドポイントは、プライベートサブネットのEC2にSession Manager経由で接続するための準備です。S3への到達性とは別の目的なので、混同しないようにしましょう。
-
EC2 インスタンスを起動する
EC2 コンソールで、名前に
s3-endpoint-demo、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠の対象(例:t3.micro)を選び、手順2のプライベートサブネットに、手順3のIAMロールをアタッチして起動します。パブリックIPは割り当てません。 - フェーズ2 — 「届かない」状態を確認する
-
テスト用のS3バケットを作成する
S3 コンソールで、バケットを1つ作成します(名前は一意に、例:
endpoint-demo-yourname)。設定はデフォルトのままで構いません。 -
Session Manager で EC2 に接続する
ローカルの PowerShell から、インスタンスIDを指定して接続します。
aws ssm start-session --target <インスタンスID>
-
S3への到達性がない状態を確認する
接続したシェルの中で、S3バケットの一覧を取得しようとします。
# タイムアウトして失敗するはず aws s3 lsしばらく応答がなければ想定どおりコマンドが固まったまま応答がない、または一定時間後にタイムアウトエラーになれば、これが「届かない」状態です。インターネットへの経路もS3への経路も持たないため、この結果は想定どおりです。
Ctrl + Cで中断して構いません。 - フェーズ3 — ゲートウェイエンドポイントを追加する
-
S3用のゲートウェイエンドポイントを作成する
VPC コンソールの「エンドポイント」で「エンドポイントを作成」を選び、サービスカテゴリに「AWSサービス」、サービス名に
com.amazonaws.ap-northeast-1.s3(タイプがGatewayのもの)を選びます。VPCを選び、ルートテーブルの一覧から、プライベートサブネットに関連付けられているルートテーブルにチェックを入れて作成します。同じ「s3」でも2種類あるサービス名の一覧に、タイプが「Gateway」のものと「Interface」のものが両方表示される場合があります。今回使うのはGatewayタイプのほうです。ルートテーブルへの追加が必要なのはGatewayタイプの特徴です。
- フェーズ4 — 「届く」ようになったことを確認する
-
もう一度 aws s3 ls を実行する
Session Manager のシェルに戻り(切れていた場合は再接続し)、同じコマンドをもう一度実行します。
# 今度はバケット一覧が表示されるはず aws s3 ls # 作成したバケットの中身も見てみる aws s3 ls s3://<作成したバケット名>
これがゴールさきほど失敗した同じコマンドが、今度はバケットの一覧を返す——この変化を確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「ゲートウェイエンドポイントを作ったのに、まだ届かない」
作成したエンドポイントが、EC2インスタンスのあるサブネットに関連付けられたルートテーブルを選んでいるか見直しましょう。VPC内に複数のルートテーブルがある場合、関連付け忘れているルートテーブルがあると、そのサブネットには反映されません。
「aws ssm start-session を実行しても、つながらない」
①EC2 に正しいIAMロール(インスタンスプロフィール)がアタッチされているか、②3つのインターフェースエンドポイント(ssm / ssmmessages / ec2messages)がすべて利用可能な状態になっているか、を順に見直しましょう。
完了チェック
要件の再確認ではなく、画面・コマンドのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- VPCコンソールの「エンドポイント」一覧に、タイプGatewayのS3用エンドポイントが「使用可能」な状態で表示されている。
- プライベートサブネットのルートテーブルに、S3向けのプレフィックスリストを宛先とするルートが追加されている。
- エンドポイント追加前は
aws s3 lsが失敗(タイムアウト)し、追加後はバケット一覧が表示される。 aws s3 ls s3://<バケット名>で、バケットの中身が確認できる。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- NATゲートウェイ経由でS3にアクセスする方法と、ゲートウェイ型エンドポイントを使う方法では、データの流れる経路にどんな違いがあるでしょうか。
ヒント
NATゲートウェイを経由する場合、データは一度インターネットゲートウェイの方向に向かいます。ゲートウェイエンドポイントの場合、AWSのネットワークの中だけで完結します。この違いが、料金や安全性にどう影響しそうか考えてみましょう。 - S3用のゲートウェイエンドポイントがあれば、他のサービス(例えばインターネット上の外部API)へのアクセスも不要になるのでしょうか。
ヒント
ゲートウェイエンドポイントは、対応している特定のサービス(S3やDynamoDBなど)専用の経路です。S3以外の汎用的なインターネットアクセスが必要な場面では、別の手段が必要になる、という観点で考えてみましょう。 - 本番運用で、プライベートサブネットのEC2が複数のAWSサービスにアクセスする必要がある場合、NATゲートウェイとゲートウェイ・インターフェースエンドポイントをどのように組み合わせるとよさそうでしょうか。
ヒント
使う頻度が高く、対応するエンドポイントがあるサービス(S3など)はエンドポイント経由にし、それ以外の汎用的な通信のためにNATゲートウェイを残す、という分担の考え方がヒントです。
後片づけ
作成したリソースを順番に削除します。
- S3バケットを空にして削除する:バケットの中のオブジェクトをすべて削除してから、バケット本体を削除します。
- EC2インスタンスを終了する:EC2コンソールで
s3-endpoint-demoを選び、終了します。 - VPCエンドポイントを削除する:S3用のゲートウェイエンドポイント、および Session Manager 用の3つのインターフェースエンドポイントをすべて削除します。
- IAMロールを削除する:作成したロールを削除します。
削除するのは、このハンズオンで自分が作ったエンドポイントだけ
エンドポイントの一覧には、他のハンズオンや検証用に作成したものが並んでいることもあります。名前やタグで、このハンズオン用のものだけを選んで削除してください。デフォルトVPCやデフォルトのサブネットは消さないようにしましょう。
コストに関する注意: S3用のゲートウェイエンドポイントの利用そのものに追加料金はかかりません。一方、Session Manager用のインターフェース型エンドポイントは1つあたり起動時間に応じた料金が発生し、今回は3つ作成するため3つ分の料金がかかります。EC2インスタンスは起動中のみ課金されます(t3.microなどは無料利用枠の対象)。S3の保存容量・リクエストにも料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。IAMロール・VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。