はじめに
こんにちは、最近こたつを導入してぬくぬく作業しているエンジニアの わた です。
今回は interfaceエンドポイントを使って S3 バケットにプライベートアクセスする構成 を作ってみたので、そのときの知見を整理がてらメモしておきます。
そもそもinterfaceエンドポイントとは
ざっくり言うと、VPC の中に ENI(Elastic Network Interface)を作って、 AWS のサービスと プライベート通信 ができるようにする仕組みです。
HTTPS で通信しつつ、PrivateLink 技術を使ってるので、 Gateway 型よりも 細かいアクセス制御ができるのがポイントです。
アーキテクチャ図
今回の構成では、public subnet と private subnet を分けて作成しています。
理由は、「interface endpoint 経由でちゃんとプライベート通信できてるか?」を確認したかったからです。
流れとしては以下になります。
①public subnet の EC2 から private subnet の EC2 に SSH 接続
②private subnet の EC2 から interface endpoint 経由で S3 バケットにアクセス
やってみる
以下の流れで行っていきます(EC2は作成済みのものとします。)
- interfaceエンドポイントの作成
- S3バケットの作成
- IAMロールの作成
- EC2へのIAMロールアタッチ
- 動作確認
interfaceエンドポイントの作成
S3 用の interface endpoint を作成します。 以下のようにコンソールからポチポチ進めていきます。





S3バケットの作成
テスト用の S3 バケットを作成して、ファイルを 1 つアップロードしておきます。


バケットポリシーの作成
interface endpoint 経由でのみアクセスできるように、バケットポリシーを設定します。
それぞれ以下のように置き換えてください
・your-bucket-name:作成したS3バケットの名前
・vpce-xxxxxxxxxxxxxxxxx:作成したinterfaceエンドポイントのエンドポイントID
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
],
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-xxxxxxxxxxxxxxxxx"
}
}
}
]
}
IAMロールの作成
EC2からS3バケットへアクセスするためのIAMロールを作成してEC2にアタッチさせます。
AWS管理ポリシーの「AmazonS3FullAccess」をアタッチしたIAMロールを作成するだけでOK。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"s3-object-lambda:*"
],
"Resource": "*"
}
]
}
EC2にアタッチ
動作確認
public subnet の EC2 から private subnet の EC2 に SSH 接続して、
interface endpoint 経由で S3 バケットにアクセスできるか確認します。
aws s3 ls s3://your-bucket-name
S3バケット名のみでアクセスできる理由
interface endpoint作成時に「プライベート DNS」を有効にすることで、自動的にinterface endpoint経由の通信になります。
まとめ
今回は interface endpoint を使って、S3 バケットへのプライベートアクセスを試してみました。
最初はちょっと混乱しましたが、整理してみると意外とシンプルですね。
バケットポリシーやエンドポイントポリシーで細かく制御できるので、 このあたりはまた別途試してみたいと思います。
Gateway endpoint との違いも気になるので、次回はその比較もやってみる予定です。





