Amazon Simple Storage Service

privateなEC2からS3にアクセスしてみた

概要

こんにちは、ディーネットの牛山です。

プライベートなEC2インスタンスからS3バケットにアクセスできるよう検証したので紹介します。

プライベートな環境からS3にアクセスする手法として、NATを介す方法と、VPCエンドポイントのゲートウェイ型を用いるパターンがあります。

ゲートウェイ型の特徴として、ゲートウェイエンドポイントは追加料金なしで使用でき、データ転送とリソースの使用量に対する標準料金が適用されるため安心です。

今回は、同じリージョン内かつEC2とS3の転送となるためデータ転送は無料で使用可能です。

前置き

本題へ入る前に、AWS構成図を作成しましたので見ていきましょう。

マルチAZ構成で、ALBで振り分けており、private subnetにEC2がAZを隔てて1台づつ居る環境を例にします。

private subnetに居るEC2からは、Gateway Endpointを介してS3とやり取りをおこなう形となります。

実際には、public subnetに踏み台サーバを置き、そこから、private subnetに存在するEC2インスタンスへアクセスしますが提示している図には含めていないことに注意してください。

前提事項

簡略化する為、S3バケット、Gateway Endpoint、EC2からS3バケットへのやり取りに焦点を当てますので、その他、各種リソースの作成および設定は省く形となりますのであらかじめご承知ください。

一部、作業を省力化するため、AWS CLIでリソースを作成するところがありますので以下は作成済みであるものとします。

  • AWS CLI IAMユーザをセットアップ済みであること。
  • AWS CLI認証情報を設定済みであること。

※各手順で共通しますが「*」(アスタリスク)部分は意図的にマスクしていているので各自読み替えてください。

それでは、作業をおこなっていきます。

S3バケット作成とアップロード

private環境からアクセスするため、バケットとテストファイルを以下の通りおこないます。

aws s3 mb s3://s3-endpoint-test-***

make_bucket: s3-endpoint-test-***

vi test.txt

s3 endpoint test

aws s3 cp test.txt s3://s3-endpoint-test-***/

upload: ./test.txt to s3://s3-endpoint-test-***/test.txt

aws s3 ls s3://s3-endpoint-test-***

***         17 test.txt

IAMロールの作成とEC2インスタンスへROLEアタッチ

IAMロール作成画面で、[AmazonS3FullAccess]の権限を持ったロールを作成し、その後、private subnetに存在するEC2インスタンスへ下記、リンクを参考にしアタッチします。

リンク中 IAM インスタンスプロファイルを EC2 インスタンスにアタッチする の箇所までの実施で構いません。

EC2インスタンスにS3バケットへのアクセス権を付与する

事前確認

privateにあるEC2インスタンスに対してpublic subnetにある踏み台サーバより、private subnetのEC2インスタンス(web01)にssh接続をおこないます。

※踏み台サーバが存在しない場合は、public subnetにEC2インスタンスを作成し、web01のprivate ipを踏み台サーバから指定して接続します。

[ec2-user@bation ~]$ ssh -i web01.pem ec2-user@10.0.0.254

Last login: *** *** from 10.0.1.233

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

 ⇒踏み台サーバからweb01のprivate ip[10.0.0.254]を指定してログインします。

※private ipのアドレスは各自環境に読み替えてください。

[ec2-user@web01 ~]$ aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************OWA5         iam-role
secret_key     ****************FNyH         iam-role
    region                <not set>             None    None

 ⇒IAMロールがついていることを確認します。

[ec2-user@web01 ~]$ curl https://s3-endpoint-test-***.s3.ap-northeast-1.amazonaws.com/test.txt

 ⇒curlでS3バケットにアクセス出来ないことを確認します。

[ec2-user@web01 ~]$ aws s3 ls //s3-endpoint-test-***

 ⇒aws cliコマンドでS3バケットにアクセスできないことを確認します。

ゲートウェイエンドポイント作成

S3サービスページにアクセスし、「エンドポイントサービス」を選択します。

「エンドポイントサービス」画面、右上「エンドポイントサービスを作成」ボタンをクリックします。

それぞれ、以下、キャプチャ画像の通りに設定をおこないます。

内容に問題なければ、「エンドポイントを作成」ボタンをクリックします。

※サービス名は必ずゲートウェイ型の「com.amazonaws.ap-northeast-1.s3」を選択するようにします。

上記、S3の標準エンドポイント「s3.ap-northeast-1.amazonaws.com」を表しており、後ほどcurlコマンドでアクセスする際、こちらのエンドポイントを介しますので間違えないよう注意します。

また、エンドポイントは、http、httpsでの通信となるため、セキュリティグループ許可設定も気にする必要があります。

「エンドポイント」画面に遷移するので、「VPCエンドポイントが正常に作成されました」と画面上にでることを確認します。

「サービス名」が「com.amazonaws.ap-northeast-1.s3」になっていることを確認します。

エンドポイントIDを後ほど使用しますのでメモしておきます。

S3バケットへバケットポリシーを適用

このままではアクセス拒否されてしまいますので、先ほど作成したエンドポイントからの接続を許可する設定をおこないます。

「aws:sourceVpce」 には先ほどメモした、エンドポイントのIDを入れます。

設定する、内容は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowVPCe",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3-endpoint-test-***",
                "arn:aws:s3:::s3-endpoint-test-***/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-07ab182d2cc45e715"
                }
            }
        }
    ]
}

以下、コンパネキャプチャ画像の通り設定します。

S3サービスページより「バケット」を選び、最初に作成したS3バケットを選択します。

「アクセス許可」タブを選び、バケットポリシーの編集を押します。

「バケットポリシーを編集」ページに遷移しますので、上記記載の設定を各自読み替えて設定し、内容に問題なければ、「変更を保存」ボタンをクリックします。

「バケットポリシーが正常に編集されました。」となることを確認し、バケットポリシーの設定に相違ないことを確認します。

事後確認

privateにあるEC2インスタンスに対してpublic subnetにある踏み台サーバより、private subnetのEC2インスタンス(web01)にssh接続をおこないます。

※踏み台サーバが存在しない場合は、public subnetにEC2インスタンスを作成し、web01のprivate ipを踏み台サーバから指定して接続します。

[ec2-user@bation ~]$ ssh -i web01.pem ec2-user@10.0.0.254

Last login: *** *** from 10.0.1.233

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

 ⇒踏み台サーバからweb01のprivate ip[10.0.0.254]を指定してログインします。

※private ipのアドレスは各自環境に読み替えてください。

[ec2-user@web01 ~]$ aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************OWA5         iam-role
secret_key     ****************FNyH         iam-role
    region                <not set>             None    None

 ⇒IAMロールがついていることを確認します。

[ec2-user@web01 ~]$ curl https://s3-endpoint-test-***.s3.ap-northeast-1.amazonaws.com/test.txt

s3 endpoint test

 ⇒curlで対象のS3バケットにアクセス可能で、「s3 endpoint test」を出ることを確認します。

[ec2-user@web01 ~]$ aws s3 ls s3://s3-endpoint-test-***/test.txt

***         17 test.txt

 ⇒aws cliコマンドで対象のS3バケットが操作可能であることを確認します。

[ec2-user@web01 ~]$ curl -v https://www.google.com

*   Trying ***:443...
*   Trying ***...
* Immediate connect fail for ***: Network is unreachable

 ⇒privateな環境でNATゲートウェイ等介していないのでインターネットに出られないことを確認します。

まとめ

いかがでしたでしょうか、手軽にprivateな環境からS3にアクセスすることができました。

誰かの助けになれば幸いです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA