こんにちは!
BFT名古屋支店の、佐野です。
とあるAWSの案件で、S3に関する以下のような相談を受けたことがあります。
「S3バケットへの操作をVPC内のEC2インスタンスから、AWS CLIを用いてのみ閲覧・操作が可能という形にできないか」
理由としては、S3バケット内に格納するデータで多くの秘匿すべき情報を取り扱い、かつ通常業務ではおおよそ閲覧を行なわないという前提であり、ならば不必要に閲覧可能な機会を減らしたいというお話でした。
この相談に関する課題は以下の3つ。
- VPC内のEC2インスタンスをプライベートなS3バケットに疎通させ、操作可能な状態とすること
- インターネットゲートウェイを使わないこと(インターネットを経由しない)
- S3を閲覧・操作可能な端末を特定のEC2インスタンスのみに限定すること
結論から言うと、[3.]は可能ではありましたが、複雑性や利便性などの問題からボツになりました。
しかし[1.]と[2.]に関しては簡単に実現することが可能です。
ですので今回は、特に「VPC内のEC2インスタンスからS3バケットの内容を閲覧・操作する方法」についてお送りします。
はじめに:S3とVPC内EC2インスタンスの関係
まずS3バケットですが、これをVPCの中に含めることはできません。
S3バケットは必ずVPCの外に置かれます。
そしてS3がパブリックなアクセスを制限している場合は、S3バケットを所有しているアカウントを関連付けた端末や操作環境からアクセスしないとS3バケットの内容の閲覧および操作をすることができません。
(逆を言えば、S3バケットを所有しているアカウントを関連付けた端末や操作環境であれば、外部から閲覧・操作が可能です)
これを図に表すと以下のようになります。
※「S3バケットを所有しているアカウントを関連付けている状態」を「クレデンシャル有り」、そうでない状態を「クレデンシャルなし」と表現しています。
この通り、S3バケットを所有しているアカウントを関連付けている状態であれば、インターネットに出ることができるインスタンスや、外部の端末からAWS CLIを用いてのS3の内容閲覧・操作が可能です。
今回の事例の場合、プライベートサブネット内のインスタンスである①からAWS CLIを用いてS3を触りたいということになりますが、何もしていない状態の場合、図の通り①はプライベートサブネットから外に出ることができないため、S3にアクセスすること自体ができません。
勿論プライベートサブネット内ですので、インターネットゲートウェイを使ってインターネットに出ることはNGです。
ではその問題、課題の1および2に該当するハードルをどう解決すればよいか。
それにはVPCからAWSサービスへのプライベートな接続を可能とする「VPCエンドポイント」の追加が必要となります。
VPCエンドポイントを使ってS3バケットへの道を通す
先に述べた通り、VPCエンドポイントとは「VPC内からAWSのサービスへプライベートに接続を行なう」ことを可能にするコンポーネントです。
これを用いることで、インターネットを経由しなくとも、VPCの中からS3に接続をすることが可能となります。
具体的なイメージとしては以下の図のようになります。
VPCエンドポイントの設定方法
VPCエンドポイントの設定方法は以下の通りになります。
①マネジメントコンソールから「VPC」コンソールに入り、左側メニューより「エンドポイント」を選択、さらに「エンドポイントの作成」を選択する。
②「エンドポイントの作成」画面となったら、以下項目を次のように設定します。
- サービスカテゴリ:「AWSサービス」を選択します。
- サービス名:「com.amazonaws.ap-northeast-1.s3」を探して選択します。
- VPC:S3バケットに接続させたいインスタンスが属するVPCを選択します。
- ルートテーブルの設定:S3バケットに接続させたいインスタンスに関連付けられているルートテーブルを選択します。
- ポリシー:今回は「フルアクセス」を選択します。
※ポリシーについては、ポリシー作成ツールを用いてVPC Endpoint Policyを設定すれば、詳細なアクセス制御を行なうこともできます。
- タグ・キー:Name と入力します。(任意)
- タグ・値:VPCエンドポイントに付与する名前を入力します。(任意)
以上のように設定したあと「エンドポイントの作成」を選択します。
これでVPCエンドポイントの作成と設定は完了となります。
「ルートテーブルの設定」で関連付けたルートテーブルも確認すると、VPCエンドポイントのルーティングが追加されているはずです。
最後に
この設定を行なうことで、課題であった「VPC内のEC2インスタンスをプライベートなS3バケットに疎通させ、操作可能な状態とすること」と「インターネットゲートウェイを使わないこと(インターネットを経由しない)」が解決できました。
ひとつのコンポーネントを追加するだけで可能ですので、同じような要件を求められた場合は役立つと思います。
また課題3.の「 S3を閲覧・操作可能な端末を特定のEC2インスタンスのみに限定すること」については、先に述べた通り、実現すること自体はできました。
しかしながらこちらは様々な不都合を抱えておりましたため、今回はご紹介いたしません。
あるいは今後の記事にて、今回のおまけのような形で書きたいとは思っておりますので、興味があればご覧いただければと思います。