CloudFrontとS3のエンドポイント

#A. static website hostingのエンドポイントをOrigin Domain Nameに指定する#

##1.S3でStatic website hostingを公開する##

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/02d5f718-aad1-d84f-9bf3-5c28f5c195e2.png)

バケットポリシーは以下のように設定。

```
{
    "Version": "2012-10-17",
    "Id": "Policy1557901682108",
    "Statement": [
        {
            "Sid": "Stmt1557901670604",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::leomaro.tk/*"
        }
    ]
}
```

##2.Origin Domain Name にS3のstatic website hosting を指定する###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/14eebe9a-6cf0-cf1a-aadb-fac514b0da08.png)

これで、CloudFrontのエンドポイントでアクセスすることができる。

しかし、このようにS3のstatic website hostingのエンドポイントを指定した場合、cloud frontからのみアクセスするといったことができない。

そこで、Origin Custom Headersに特定の文字列を送り、S3バケットでその特定のHeaderがある場合のみGetObjectできるといったバケットポリシーを設定する。

##3 Origin Custom Headersをつける##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/377c4e10-79d8-2d30-17d4-03d0b1495760.png)

##4 S3のバケットポリシーを変更する##

name　に test がある場合は、Allow、ない場合は Deny。

```
{
    "Version": "2008-10-17",
    "Id": "http referer policy",
    "Statement": [
        {
            "Sid": "Referer-Allow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::leomaro.tk/*",
            "Condition": {
                "StringLike": {
                    "aws:name": "test"
                }
            }
        },
        {
            "Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::leomaro.tk/*",
            "Condition": {
                "StringNotLike": {
                    "aws:name": "test"
                }
            }
        }
    ]
}
```

##5 テストしてみる##

```
curl --header 'name:test' website hosting Endpoint URL
#→アクセスできる

curl --header 'name:test' website hosting Endpoint URL
#→アクセスできない(403エラー)
```


#B. S3のエンドポイントをOrigin Domain Nameに指定する#

##1 Origin Domain Name にS3のエンドポイントを指定する##
このとき設定は以下のようにします。

- Restrict Bucket Access ：Yes（CloudFrontからしかS3にアクセスできないようにできます）
- Origin Access Identity：Create a New Identity（S3にアクセスするこのCloudFrontの接続子です）
- Grant Read Permissions on Bucket：Yes（S3に対してCloudFrontからのBucketPolicyを設定します。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ea77d2e7-37a1-d28c-7ddb-814610665aee.png)

##2 S3側のバケットポリシーを覗いてみる##
先程、Grant Read Permissions on Bucket で設定したものが反映されています。

```
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3UEIDRYVURC48"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::leomaro.tk/*"
        }
    ]
}
```

##3 アクセスしてみる##

S3のエンドポイント　→　アクセスできない
CloudFrontのエンドポイント　→　アクセスできる