0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

interfaceエンドポイントを用いたS3バケットへのプライベートアクセス方法

Posted at

はじめに

こんにちは、最近こたつを導入してぬくぬく作業しているエンジニアの わた です。
今回は 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 バケットにアクセス

image.png

やってみる

以下の流れで行っていきます(EC2は作成済みのものとします。)

  • interfaceエンドポイントの作成
  • S3バケットの作成
  • IAMロールの作成
  • EC2へのIAMロールアタッチ
  • 動作確認

interfaceエンドポイントの作成

S3 用の interface endpoint を作成します。 以下のようにコンソールからポチポチ進めていきます。
image.png
image.png
image.png
image.png
image.png

S3バケットの作成

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

バケットポリシーの作成

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。

AmazonS3FullAccess
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

image.png
image.png
image.png

EC2にアタッチ

IAM ロールを EC2 にアタッチします。
image.png

動作確認

public subnet の EC2 から private subnet の EC2 に SSH 接続して、
interface endpoint 経由で S3 バケットにアクセスできるか確認します。

aws s3 ls s3://your-bucket-name

先ほど作成したファイルが見れることが確認できました
image.png

S3バケット名のみでアクセスできる理由

interface endpoint作成時に「プライベート DNS」を有効にすることで、自動的にinterface endpoint経由の通信になります。

まとめ

今回は interface endpoint を使って、S3 バケットへのプライベートアクセスを試してみました。
最初はちょっと混乱しましたが、整理してみると意外とシンプルですね。
バケットポリシーやエンドポイントポリシーで細かく制御できるので、 このあたりはまた別途試してみたいと思います。
Gateway endpoint との違いも気になるので、次回はその比較もやってみる予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?