はじめに
こんにちは。ニフティ株式会社の添野です。
AWS Amplifyで配信している静的ページに対する定期リビルド機構を組む必要があったので、その際にAmazon EventBridge API 送信先を利用した話を共有します。
背景
社内のとあるサービスで利用する静的ページの配信基盤にAWS Amplifyを採用しており、そのページの中には定期的に変わるコンテンツが存在します。その仕様のため定期的にリビルドすることが必要になりました。最初はAWS Lambdaを利用してAWS AmplifyのIncomingWebHookを定期的に叩こうかなと思いましたが、AWS Lambda上のコードの管理やAWS LambdaランタイムのEOL対応、AWS Lambdaに対するメモリ設定など気にする項目が増えて、手間だなと思いました。そこでもう少し良さげな機能が無いかなと思い探してみたら、Amazon EventBridgeの中にあるAPI 送信先を見つけました。
API 送信先とは?
公式ドキュメントによれば、API送信先(あるいはAPI Destinationとも呼ばれる)とは、
AWS サービスまたはリソースをターゲットとして呼び出す方法と同様に、ルールのターゲットとして呼び出すことができる HTTP エンドポイントです。
とのことで、レートリミットなどの制御やセキュリティの機能なども提供します。
API 送信先を利用した定期リビルド機構について
ここではTerraformのコードを示しつつ、組んだ話について説明します。
まずは、対象となるAWS Amplifyのアプリケーションに対して、Incoming WebHookを設定します。叩くとAmplifyでビルドと公開処理が走ります。
1 2 3 4 5 6 |
resource "aws_amplify_webhook" "master" { app_id = aws_amplify_app.static_content.id branch_name = "master" description = "triggermaster" } |
次に、毎日07:30に定期的にリビルドを走らせるルールを作成し、ターゲットとしてAWS AmplifyのIncoming WebHookに前置するAPI送信先を指定します。ここで、Amazon EventBridgeの接続先(aws_cloudwatch_event_connection)では提供されている認証方式(APIキー認証、Basic認証、OAuth認証)を必ず選択しないといけない点に注意する必要があります。今回はBasic認証を選択することにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
resource "aws_cloudwatch_event_rule" "regular_rebuild" { name = "${var.application_name}-regular-rebuild-${var.environment_name}" description = "${var.application_name} Regular Rebuild ${var.environment_name}" schedule_expression = "cron(30 22 * * ? *)" # NOTE: 毎日 07:30 JST (静的ページリビルド) } resource "aws_cloudwatch_event_target" "regular_rebuild" { target_id = "RegularRebuild" arn = aws_cloudwatch_event_api_destination.regular_rebuild.arn rule = aws_cloudwatch_event_rule.regular_rebuild.name role_arn = aws_iam_role.regular_rebuild.arn } resource "aws_cloudwatch_event_api_destination" "regular_rebuild" { name = "${var.application_name}-regular-rebuild-${var.environment_name}" description = "${var.application_name} Regular Rebuild ${var.environment_name}" invocation_endpoint = aws_amplify_webhook.master.url http_method = "POST" invocation_rate_limit_per_second = 1 connection_arn = aws_cloudwatch_event_connection.regular_rebuild.arn } resource "aws_cloudwatch_event_connection" "regular_rebuild" { name = "regular_reguild_webhook" description = "A connection description" authorization_type = "BASIC" # NOTE: Amazon EventBridgeが利用するBasic認証情報 auth_parameters { basic { username = "user" password = "Pass1234567!" } } } |
実際に定期リビルドされている様子を示します。Updatedが07:31、Last commitがIncoming WebHook起動であることが示されています。
料金(東京リージョンを仮定する)は、API 送信先を利用する方式では0.24USD/100万呼び出しであり、対してAWS Lambdaを利用する方式では、メモリを128MB指定して、呼び出しに300ミリ秒が掛かると、0.0000000021 x 300USD/呼び出しであり、AWS Lambdaを利用する方式の方が若干高くなります。
おわりに
今回は、API 送信先を利用してAmplifyで配信している静的ページに対する定期リビルド機構を組んだ話を共有しました。AWS Amplifyのリビルド機構を組みたい方の参考になれば幸いです。