この記事は、CloudWatch Eventsを利用し、CodeBuildの環境変数を上書きしつつ定期実行する方法についてまとめたものです。
アーキテクチャ
シンプルな図になるのですが今回作成したいものは、このような構成を想定しています。
やり方
- CloudWatchのコンソールを開き、[イベント]、[ルールの作成]の順に選択します。
- スケジュールから、Cronを選択し、Cron式指定します。
- [ターゲット]より、[ターゲットの追加、CodeBuildプロジェクト]を選択します。
- プロジェクトARNには、ビルドプロジェクトのARNを入力します。
- CodeBuildに環境変数などのパラメータを渡すには、[入力の構成]、[定数(JSONテキスト)]を選択します。
環境変数をOverrideするにはどうするか
上記の最後に記載した、入力構成から、json形式でパラメータをCodeBuild側に渡すことができます。
実際に渡せるパラメータは、こちらを参照してください。CodeBuildに渡せるパラメータ
今回注目するのは、environmentTypeOverride:です。
こちらを使用することで、環境変数の上書きができます。
注意点
現在(2020/12/8 時点)では、公式のドキュメントのサンプルがオブジェクトを要素にもつ配列として書かれていない為、そこが注意点です。
下記のような形式だとうまくいきました。
Sample.json
{
"projectName": "Test-Project",
"environmentVariablesOverride": [
{
"name": "testName",
"value": "testValue",
"type": "PLAINTEXT"
}
]
}
terraformで実装する場合
上記の設定をterraformで実装する場合は、こちらを参照してください。Terraformでの実装方法
実装としては、aws_cloudwatch_event_targetを利用します。また、上記のjsonを定義する方法は、inputに記載することで適用されます。
sample.tf
resource "aws_cloudwatch_event_target" "ecs_scheduled_task" {
target_id = "run-scheduled-task-every-hour"
arn = aws_ecs_cluster.cluster_name.arn
rule = aws_cloudwatch_event_rule.every_hour.name
role_arn = aws_iam_role.ecs_events.arn
ecs_target {
task_count = 1
task_definition_arn = aws_ecs_task_definition.task_name.arn
}
input = <<DOC
{
"containerOverrides": [
{
"name": "name-of-container-to-override",
"command": ["bin/console", "scheduled-task"]
}
]
}
DOC
}