はじめに
某金融業界にもようやくAWSの波が来つつあるこの頃、とりあえずデータセンターとAWSをDirect Connectでつないでセキュリティを確保しつつ、AWSのElasticなコンピューティングパワーを活用するというやり方が今後スタンダードになりそうな予感です。
今回のゴール
そうすると問題なのがインターネット禁止という制約。今回は、S3のStatic Web Hostingで作るWebサイトを、インターネットアクセス禁止、特定のVPC経由のみ可能とする。というのをやります。
AWS Developer Forum最高
ググったけど全然わからなかったので、AWS Developer Forumに聞いてみたところ、一瞬で解決したので、みなさんもググってQiita読んでも解決しなかったら、Forumに投稿してみるとよいと思います。
・Discussion Forums > Category: Japanese Forums
https://forums.aws.amazon.com/category.jspa?categoryID=9
参考URL
Amazon S3 バケットへのアクセスを許可する VPC や IP アドレスを指定する方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/block-s3-traffic-vpc-ip/
手順
設定手順
VPC
- 「1 個のパブリックサブネットを持つ VPC」を作成する
- サービスエンドポイントに「com.amazonaws.us-east-1.s3」を追加する
- こいつがVPCからS3にインターネット経由しないでアクセスするためのもの
- エンドポイントのメニューで、作成したVPCのエンドポイントIDをメモしておく(vpce-xxxxxxxxxxxxxxxxx)
S3
- バケットを作る
- 作ったバケットのルートフォルダにindex.htmlをアップロードする
- index.htmlを公開する
- 作ったバケットのプロパティ>「Static website hosting」
- 「このバケットを使用してウェブサイトをホストする」にチェック
- インデックスドキュメントに「index.html」を入力
- 保存ボタンをクリック
- エンドポイントURLをメモしておく
- 作ったバケットのアクセス権限>ブロックパブリックアクセス
- 「パブリックアクセスをすべてブロック」をオフにして保存(つまり全部公開)
- 作ったバケットのアクセス権限>バケットポリシー
- 下記を入力して保存する
- [bucketname]と[VPC Endpoint ID]は適宜置き換える
{
"Version": "2012-10-17",
"Id": "VPCe and SourceIP",
"Statement": [{
"Sid": "VPCe and SourceIP",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::[bucketname]",
"arn:aws:s3:::[bucketname]/*"
],
"Condition": {
"StringNotLike": {
"aws:sourceVpce": [
"[VPC Endpoint ID]"
]
}
}
}]
}
テスト手順
- 作成したVPC内にEC2インスタンスを起動する
- sshでログインして、curlコマンド等でS3のエンドポイントURLにアクセス可能であることを確認する。
- 端末のブラウザ等からS3のエンドポイントURLにアクセス不可であることを確認する。(403 Forbidden)
たぶん
API Gateway回りも同様にハマりそうな予感。