S3 PrivateLinkによる閉域網内静的ウェブサイトの構築方法

AWSで静的ウェブサイトの構築と言うと、S3の静的サイトホスティングとCloudFrontのセットで対応するのは一般的ですが、何の場合でも対応できるわけではありません。

# S3の静的サイトホスティングで対応できない場合
S3の静的サイトホスティングとCloudFrontの構成では、インターネットを介して接続しないといけませんので、インターネットが出られない閉域網内では実現できません。
例えばインターネットの接続できないオンプレミスのサーバーからSite-to-Site VPNやDirect ConnectでAWSに接続したりする場合。

:::note warn
S3のGateway Endpointを作ってPrivate SubnetからS3へアクセスする場合、Private SubnetでElastic Network Interfaceが作成されませんので、このような通信ルートでは実現できません。
:::
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/d0460276-0acb-21d2-020e-4bdee22798b2.jpeg)

# 閉域網内の場合の対応方法
:::note info
S3のEndpointは、Gateway Endpoint以外、Interface Endpointもあります。それを使ってPrivateLinkを作成して対応することで解決できます。
:::

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/112740da-9509-1b87-5818-7249d2b0af2c.jpeg)

# 具体的な構築方法
１. **S3の作成、準備**
事前に作成しておいたHtmlファイルをアップロードしました。閉域網内でのアクセスですから、パブリックアクセスをすべてブロックを設定しても問題ありません。又、内部からアクセスするので、静的サイトホスティングの有効化する必要もありません。

![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/0638f36c-3d64-c72d-cd14-7e38297b8258.jpeg)

２. **endpointからアクセスできるようなポリシーの作成**
endpointからのみで、アクセスできるように制限するパブリックポリシーですが、Actionもう少し絞ると、s3:GetObjectで良いです。
```
{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Access-to-specific-VPCE-only",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::www.asp-members.net",
                "arn:aws:s3:::www.asp-members.net/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-058919f7c51133336"
                }
            }
        }
    ]
}
```
３. **S3 interface endpoint作成**
アベイラビリティーゾーンを二つ跨ぐ冗長構成となりますので、作成されたeniは二つとなります。セキュリティグループは後で作成するALBよりアクセスできるように許可設定する必要です。
![4ャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/7f91f3be-c79d-8981-ba9c-47b1e67a0e0c.jpeg)

４. **ALB関連リソースの設定**

:::note info
**ACM証明書作成**
お名前.comで取得した無料ドメイン名となり、ACM証明書作成にて認証時、CNAMEレコードをお名前.comに登録すれば認証されます。
:::

![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/e83db16c-fdf6-3017-7ef9-beb552a820d1.jpeg)

:::note info
**Route53の設定**
内部からアクセスする時、https://www.asp-members.net/asphand.html
のようにアクセスするので、www.asp-members.netはバケット名と同じにする必要なのと、www.asp-members.netとALBのDNSとマッピングする必要です。
:::

![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/58e7556f-cbee-197f-26ac-58587f10824e.jpeg)

:::note info
**Internal ALB作成**
:::
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/51a0ad2e-3fc6-9122-92b8-9d9229824064.jpeg)
![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/b3470c55-ffd7-7a86-7325-eb9a5d500fd9.jpeg)

このような設定によりオンプレミス環境　⇒　Site-to-Site VPN　⇒　S3の静的ウェブサイトのようにアクセスできることが確認できましたが、ALBの作成は面倒で使いたくない場合（直接ローカルからS3のコンテンツにアクセスしたい）、以下のURLを使ってアクセスすれば良いです。
https://bucket.vpce-0d904c707a00c6c26-ttg0vjkv.s3.ap-northeast-1.vpce.amazonaws.com/www.asp-members.net/asphand.htm

:::note warn
**ドメイン名を使いたい場合**
https://www.asp-members.net/asphand.htm
事前に、www.asp-members.net対応するeniのプライベートIPアドレスをC:\Windows\System32\drivers\etc\hostsに登録しておいてください。
:::

# 参考文献
[ALB、S3、PrivateLinkによる内部HTTPS静的ウェブサイトのホスティング](https://aws.amazon.com/jp/blogs/news/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/)
[Amazon S3 のプライベート DNS サポートのご紹介](
https://aws.amazon.com/jp/blogs/news/introducing-private-dns-support-for-amazon-s3-with-aws-privatelink/)