{CloudFront}チュートリアル: シンプルな Lambda@Edge 関数の作成



https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html

https://qiita.com/chii-08/items/1b8c7f9f876673b7aa20


Lambda@Edge 関数を作成するにはUS-East-1 (バージニア北部) リージョン (us-east-1) にいることを確認します。

Lambda@Edge 関数を削除できるのは、関数のレプリカが CloudFront によって削除された場合のみです。
レプリカは通常、数時間以内に削除されます。


-- 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. パブリックアクセスブロック設定の編集

-- 3.1 アカウントレベル
aws s3control put-public-access-block \
--account-id 999999999999 \
--public-access-block-configuration "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

aws s3control get-public-access-block \
--account-id 999999999999

-- 3.2 バケットレベル
aws s3api put-public-access-block \
--bucket bucket123 \
--public-access-block-configuration "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

aws s3api get-public-access-block \
--bucket bucket123


-- 4. バケットポリシーの設定

vim b.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket123/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "0.0.0.0/0"
                }
            }
        }
    ]
}

 

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


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


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

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

 

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


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 AAAAAAAAAAAAA

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

 


-- 7. IAMロール作成
vim role01.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com",
                    "edgelambda.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}


aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json

-- 8. ポリシーをロールにアタッチ

aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole \
--role-name role01

 


-- 9. Lambda関数作成  [ US-East-1 (バージニア北部) リージョン ]

export AWS_DEFAULT_REGION=us-east-1

vim test.js

'use strict';
exports.handler = (event, context, callback) => {

    //Get contents of response
    const response = event.Records[0].cf.response;
    const headers = response.headers;

    //Set new headers
    headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}];

    //Return modified response
    callback(null, response);
};

 

chmod 755 test.js
zip test.zip test.js

aws lambda create-function \
--function-name func01 \
--zip-file fileb://test.zip \
--handler test.handler  \
--runtime nodejs12.x  \
--role arn:aws:iam::999999999999:role/role01


aws lambda list-functions | grep func01

aws lambda get-function --function-name func01

 


export AWS_DEFAULT_REGION=ap-northeast-1

 


-- 10. Lambda関数にバージョンを発行する  [ US-East-1 (バージニア北部) リージョン ]
export AWS_DEFAULT_REGION=us-east-1

aws lambda publish-version \
--function-name func01

aws lambda list-versions-by-function \
--function-name func01


export AWS_DEFAULT_REGION=ap-northeast-1


-- 11. Lambda関数に権限を追加する  [ US-East-1 (バージニア北部) リージョン ]
export AWS_DEFAULT_REGION=us-east-1

aws lambda add-permission \
--function-name func01:2 \
--statement-id statement01 \
--action lambda:GetFunction \
--principal replicator.lambda.amazonaws.com


aws lambda get-policy \
--function-name func01:2 | jq -r .Policy  | jq .

export AWS_DEFAULT_REGION=ap-northeast-1

 


-- 12. 関数を実行する CloudFront トリガーを追加する


aws cloudfront get-distribution \
--id AAAAAAAAAAAAA

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


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

vim distribution.json


DefaultCacheBehavior -> LambdaFunctionAssociations  を下記のように修正

            "LambdaFunctionAssociations": {
                "Quantity": 1,
                "Items": [
                    {
                        "LambdaFunctionARN": "arn:aws:lambda:us-east-1:999999999999:function:func01:2",
                        "EventType": "origin-response",
                        "IncludeBody": false
                    }
                ]
            },


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

aws cloudfront update-distribution \
--id AAAAAAAAAAAAA \
--if-match BBBBBBBBBBBBB \
--distribution-config file://distribution.json

 

-- 13. 動作確認


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

Lambda関数で追加した以下のヘッダの存在確認

x-frame-options

 

-- 14. クリーンアップ

 

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

aws cloudfront get-distribution \
--id AAAAAAAAAAAAA

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


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

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

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

 

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

aws cloudfront update-distribution \
--id AAAAAAAAAAAAA \
--if-match CCCCCCCCCCCCCC \
--distribution-config file://distribution.json


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

無効化されるまで待つ


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

aws cloudfront get-distribution \
--id AAAAAAAAAAAAA

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

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

aws cloudfront delete-distribution \
--id AAAAAAAAAAAAA \
--if-match DDDDDDDDDDDDDD

 

aws cloudfront list-distributions

 

-- IAMロールの削除
aws iam list-roles | grep role01


aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole


aws iam delete-role --role-name role01

 

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

aws s3 rb s3://bucket123 --force


-- アカウントレベルのパブリックアクセスブロックの有効化

aws s3control put-public-access-block \
--account-id 999999999999 \
--public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

aws s3control get-public-access-block \
--account-id 999999999999


-- Lambda関数の削除  [ US-East-1 (バージニア北部) リージョン ]

ディストリビューション削除後、しばらく待ってから実行

export AWS_DEFAULT_REGION=us-east-1

aws lambda get-function --function-name func01

aws lambda list-versions-by-function \
--function-name func01


aws lambda delete-function --function-name func01:2
aws lambda delete-function --function-name func01

 

export AWS_DEFAULT_REGION=ap-northeast-1