lambrollでLambda@Edgeをデプロイする

メモ。

デプロイ

デプロイ自体はlambroll deploy --region us-east-1を実行すればOK。

CloudFrontの更新

Lambda@Edgeでは$LATESTやAliasを使えないので、current Aliasからバージョンを探してCloudFrontを明示的に更新する。

export AWS_REGION=us-east-1

FUNC_NAME=myfunc
ARN=$(aws lambda get-function --function-name $FUNC_NAME --query 'Configuration.FunctionArn' --output text)
VER=$(aws lambda get-alias --function-name $FUNC_NAME --name current --query 'FunctionVersion' --output text)

DIST_ID=xxx
aws cloudfront get-distribution-config --id $DIST_ID > config.json
ETAG=$(jq -r '.ETag' config.json)
sed -E "s/${ARN}:[0-9]+/${ARN}:${VER}/" config.json > full-config.json.new
jq .DistributionConfig full-config.json.new > config.json.new
aws cloudfront update-distribution --id $DIST_ID --distribution-config file://config.json.new --if-match $ETAG

参考:

stackoverflow.com

TerraformのCloudFrontの定義

Terraformではqualifier = "current"を指定してLambdaを参照する。

data "aws_lambda_function" "myfunc" {
  function_name = "myfunc"
  qualifier     = "current"
  region        = "us-east-1"
}

resource "aws_cloudfront_distribution" "mydist" {
    # ...
    lambda_function_association {
      lambda_arn = "${data.aws_lambda_function.myfunc.arn}:${data.aws_lambda_function.myfunc.version}"
      # ...
    }
    # ...
}