{CloudFront}Amazon S3 オリジンへのアクセスの制限

https://dev.classmethod.jp/articles/amazon-cloudfront-origin-access-control/
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

 

-- 1. コマンド等のインストール

-- 1.1 aws cli version 2 インストール

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

 

-- 1.2 jqインストール
sudo yum -y install jq


-- 2. S3 バケットを作成する

aws s3 ls

aws s3 mb s3://bucket123

 


-- 3. インデックスドキュメントの設定

vim index.html

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
</body>
</html>

aws s3api put-object --bucket bucket123 --key index.html --body index.html --content-type text/html

 

 

-- 4. ディストリビューションの作成


aws cloudfront create-distribution \
--origin-domain-name bucket123.s3.ap-northeast-1.amazonaws.com \
--default-root-object index.html

 

aws cloudfront list-distributions

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111

 

-- 5. オリジンアクセスコントロール (OAC)の作成

aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml

vim origin-access-control.yaml

ファイルを編集して OAC の名前、説明 (オプション) を追加し、SigningBehavior を always に変更します。

  Name: "oac01"
  Description: "oac01"

  SigningBehavior: always


aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml


aws cloudfront list-origin-access-controls


-- 6. OACをディストリビューションに追加する

 

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .DistributionConfig > distribution.json

vim distribution.json


Origins -> Items の下で、以下の編集を行う

"OriginAccessControlId"にOAC の ID をセット

"CustomOriginConfig"を削除して下記を追加

        "S3OriginConfig": {
          "OriginAccessIdentity": ""
        },

 

 

aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .ETag

aws cloudfront update-distribution \
--id 11111111111111 \
--if-match 22222222222222 \
--distribution-config file://distribution.json

 

 

-- 7. OAC に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する


vim b.json

{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "AllowCloudFrontServicePrincipalReadWrite",
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": [
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::bucket123/*",
        "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::999999999999:distribution/11111111111111"
            }
        }
    }
}

 

aws s3api put-bucket-policy \
--bucket bucket123 \
--policy file://b.json


aws s3api get-bucket-policy \
--bucket bucket123

 

 


-- 8. 動作確認

 

curl -v -X GET http://xxxxxxxxxxxxxx.cloudfront.net/index.html

curl -v -X GET https://bucket123.s3.ap-northeast-1.amazonaws.com/index.html

 

-- 9. クリーンアップ

 

 

-- ディストリビューションの無効化

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111


※ distribution.jsonはget-distribution-configコマンドのDistributionConfigから取得し、Enabledをfalseに変更する

aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .DistributionConfig > distribution.json

sed -i 's/"Enabled": true/"Enabled": false/' distribution.json

 

aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .ETag

aws cloudfront update-distribution \
--id 11111111111111 \
--if-match 3333333333333 \
--distribution-config file://distribution.json


※ if-matchにはETagの値をセット

無効化されるまで待つ


-- ディストリビューションの削除

aws cloudfront get-distribution \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111

aws cloudfront get-distribution-config \
--id 11111111111111 | jq -r .ETag

aws cloudfront delete-distribution \
--id 11111111111111 \
--if-match 44444444444444

 

aws cloudfront list-distributions

 

 

-- OACの削除

aws cloudfront list-origin-access-controls

aws cloudfront get-origin-access-control \
--id 55555555555555

aws cloudfront delete-origin-access-control \
--id 55555555555555 \
--if-match 6666666666666


-- バケットの削除
aws s3 ls

aws s3 rb s3://bucket123 --force