はじめに
AWS Lambdaの気になる機能調べてみた記事3つ目です。
今回も画面左側に表示されているメニューのレプリカ
について調べてみます。
Lambda@Edgeが各リージョンにコピーされたもの。
結論は、Lambda@Edgeが各リージョンにコピーされたものでした。
下記の説明の通り、Lambda@Edgeはバージニア北部のリージョンで作成されたものが、各リージョン(+エッジロケーション)にコピーされ、ユーザに近いロケーションで実行されるためです。
Lambda@Edge は、Amazon CloudFrontの機能で、アプリケーションのユーザーに近いロケーションでコードを実行できるため、パフォーマンスが向上し、待ち時間が短縮されます。Lambda@Edge では、世界中の複数のロケーションでインフラストラクチャをプロビジョニングまたは管理する必要はありません。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。
作ってみる。
Lambdaの準備
バージニア北部リージョンで作成する必要があります!
node.jsでレスポンスヘッダを加工するソースを用意しました。
export const handler = async (event, context) => {
const response = event.Records[0].cf.response;
const request = event.Records[0].cf.request;
// セキュリティヘッダーを追加
response.headers['strict-transport-security'] = [{
key: 'Strict-Transport-Security',
value: 'max-age=31536000; includeSubdomains'
}];
response.headers['x-content-type-options'] = [{
key: 'X-Content-Type-Options',
value: 'nosniff'
}];
// キャッシュ制御
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'public, max-age=86400' // 24時間
}];
return response;
};
また、Lambda@Edgeとして動作させるため、Lambdaの実行ロールの信頼関係にedgelambda.amazonaws.com
を追加しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
+ "edgelambda.amazonaws.com",
"lambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
CloudFrontへの紐付け
CloudFrontへの紐付けをしていきます。
作成したLambdaの+ トリガーを追加
を選択します。
CloudFrontを選択し、Lamdba@Edgeへのデプロイ
を選択します。
任意のCloudFrontディストリビューションを選択し、デプロイ
を選択します。
なお、Lambda@Edgeへのデプロイを確認
のチェックボックスは外すとエラーになる模様です。(必要なのかこれは、、)
レプリカに表示された!
デプロイが完了すると、レプリカにも無事表示されるようになりました。
余談
2025/01時点では、インフォパネルの説明が誤ってそうです。
(一つ上のメニューである、Lambdaレイヤーになってる)
最後に
今まではCloudFront Functionsで事足りてたため、Lambda@Edgeを触ることがなかったのですが、Lambda@Edgeの作り方を知ることができてよかったです!
これでメニューに表示されている一通りの疑問点は解消できたかな?