[AWS] VPCエンドポイント経由でEC2からS3へファイル転送

環境AWS,セキュリティ

EC2 と S3 は同じネットワーク( VPC )内にいないので、通常の通信は、EC2 → インターネット → S3 となり、 S3 へのアクセスは、インターネットを介した通信となる。ここに VPC エンドポイントを設定すると、インターネットを介することなく、 EC2 – S3 間でセキュアな通信が可能となる。
また、インターネット経由での S3 のデータ転送には費用が生じるが、 EC2 と S3 が同じリージョンにあればデータ転送量は無料!異なるリージョンでも安くなるはず。

VPC エンドポイントについて

VPC とは

VPC とは Virtual Private Cloud の略。
Amazon VPC は、 AWS 上にある仮想ネットワークのこと。 Amazon VPC とインターネットの通信は、インターネットゲートウェイを介しておこなわれる。

EC2 と S3 のネットワーク構成

EC2 は、 VPC の中にあって、 S3 は VPC の外側にある。よって、デフォルトだと EC2 – S3 間のアクセスは、インターネット経由となる。

AWS EC2 to S3 via Internet
AWS EC2 to S3 via Internet

VPC エンドポイントというものを設置し、 AWS (のネットワーク)の内部で通信が可能となる。 (インターネットを経由しない。)

AWS EC2 to S3 via VPC endpoint
AWS EC2 to S3 via VPC endpoint

エンドポイントの作成

作成手順

  1. VPC ダッシュボードから、「エンドポイント」をクリック

    AWS VPC Dashboard
    AWS VPC Dashboard
  2. 「エンドポイントの作成」をクリック

    AWS Create Endpoint
    AWS Create Endpoint
  3. 「 AWS サービス」を選択し、「 com.amazonaws.リージョン.s3 」を選択。
    フィルターから「 s3 」で検索すると見つかる。

    AWS Endpoint Service Name
    AWS Endpoint Service Name
  4. VPC 選択欄には対象の EC2 インスタンスの VPC を、ルートテーブル ID には、利用するサブネットに関連づけられたルートテーブルを選択する。

    AWS Endpoint Configure route tables
    AWS Endpoint Configure route tables
  5. ポリシーを設定する。デフォルトだと「フルアクセス」になっているので、「カスタム」を選択し、 ポリシー作成ツール で S3 の対象パケットのみ許可とするポリシーを作り、コピペする。

    AWS Endpoint Policy Custom
    AWS Endpoint Policy Custom

ポリシー作成ツールの使い方

「 Select Type of Policy 」で、「 VPC Endpoint Policy 」を選択。

「Principal」は、「AWS Service」で選択したサービスへのアクセスの許可 / 拒否するユーザーや IAM ロール、 AWS アカウントなどを指定できる。全てを指定するとき、決まりがなくてよくわからないときは ” * ” とする。

「Actions」は、特定の操作しかしないときは対象のアクションを選択。例えば、ファイルダウンロードのみなら「GetObject」だけとか。いろんな操作をするなら、「All Actions ('*’)」のチェックボックスにチェックを入れる。

「 Amazon Resource Name (ARN) 」には、 arn:aws:s3:::/ の形式で入力しなければならない。複数あるときはカンマ( , )で区切る。
例) arn:aws:s3:::BUCKET-NAME,arn:aws:s3:::BUCKET-NAME/*

AWS Policy Generator
AWS Policy Generator

必要なものを記入・選択したら、「 Add Statement 」をクリック後、「 Generate Policy 」をクリック。
※ 入力値に不備があると、「 Add Statement 」ボタンはクリックできない。
テキストでポリシーが表示されるのでコピぺする。

ポリシーの例)
{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::my_secure_bucket",
                   "arn:aws:s3:::my_secure_bucket/*"]
    }
  ]
}

S3 へアクセス・ファイル転送

s3 バケットの中身を確認

$ aws s3 ls s3://BUCKET-NAME/

EC2 から S3 バケットにファイルを同期する
/hoge/hoge/uploads というフォルダ配下を S3 の uploadtest というフォルダ内に同期させる

$ aws sync /hoge/hoge/uploads s3://BUCKET-NAME/uploadtest

EC2 から S3 バケットにファイルをコピーする

$ aws s3 cp /FILE-PATH/FILE-NAME s3://BUCKET-NAME/FILE-PATH/FILE-NAME

S3 にコピーされるファイルの名前は、 s3://〜 以降で指定したファイル名となる。 (元のファイル名と異なる名前をつけるとファイル名が変わるよ。)

Posted by Agopeanuts