S3をリバースプロキシする際の疑問点調査

  • 投稿者:
  • 投稿カテゴリー:aws

nginx(EC2)でリバースプロキシしてS3を公開した際に
・Static website hosting は必要かどうか?
・S3エンドポイント を利用すると設定で変更するところはあるのか?
がわからなかったため調査。

結論として
・Static website hostingは必要なし。
・S3エンドポイントをバケットポリシーで制御する必要がある。
ことがわかった。

S3設定

バケット名:bucket–name
を作成して、[1.png]をアップロードした。

URLは以下となる。
http://bucket–name.s3.amazonaws.com/1.png
http://bucket–name.s3-ap-northeast-1.amazonaws.com/1.png
http://s3-ap-northeast-1.amazonaws.com/bucket–name/1.png

また外部から閲覧するためにアクセス権限を設定した。
(以下はIPアドレスx.x.x.xに公開する場合)

{
  "Id": "Policy1505038915778",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1505038910815",
      "Action": [
        "s3:GetObject"
      ],
      "Principal": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket--name/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "x.x.x.x"
        }
      }
    }
  ]
}

nginxのリバースプロキシ設定

location / {
        set $s3_bucket        'bucket--name.s3.amazonaws.com';
        proxy_set_header       Host $s3_bucket;
        proxy_hide_header      x-amz-id-2;
        proxy_hide_header      x-amz-request-id;
        proxy_hide_header      Set-Cookie;
        resolver               10.0.0.2 valid=300s;
        resolver_timeout       10s;
        proxy_pass             http://$s3_bucket;
}

Static website hosting について

・有効にすると、公開用のURLが追加で作成される。(無効にすると利用できなくなる。)
http://bucket–name.s3-website-ap-northeast-1.amazonaws.com
・上記URLに限り、インデックスドキュメントとエラードキュメントやリダイレクトが動作する。
・DNSを設定することで、独自ドメイン(バケット名)も利用できる。

つまりこの機能を利用しなくても、リバースプロキシのオリジンに設定することが可能。

S3エンドポイント時の設定

バケットポリシーに以下を追加する必要がある。

{
    "Version": "2012-10-17",
    "Id": "Policy1505038915778",
    "Statement": [
        {
            "Sid": "Stmt1505038910815",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket--name/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "x.x.x.x"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1505038910816",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket--name/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-xxxxxxx"
                }
            }
        }
    ]
}

参考

http://blog.serverworks.co.jp/tech/2016/08/22/vpc_endpoint_s3_backet-2/