タダです.
前回記事で RDS ログを S3 にアップロードする Python スクリプトを Docker で動作するようにしました.今回は GitHub Actions でコンテナイメージを ECR に格納し,EventBridge Scheduler で ECS Runtask を実行するようにしてきます.
コンテナイメージを ECR に格納する
コンテナイメージを ECR に格納する処理は GitHub Actions で行うようにしました.
name: ecr push on: push: branches: - main workflow_dispatch: jobs: deploy: name: ecr push runs-on: ubuntu-latest permissions: id-token: write contents: read timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ap-northeast-1 role-to-assume: "arn:aws:iam::1234567891012:role/ecr-image-push" role-duration-seconds: 1800 - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Build docker images and push its to ECR id: build-image env: registory: ${{ steps.login-ecr.outputs.registry }} repository: hoge-repository image_tag: latest run: | docker build . --tag ${{ env.registory }}/${{ env.repository }}:${{ env.image_tag }} docker push ${{ env.registory }}/${{ env.repository }}:${{ env.image_tag }}
ECS クラスターと ECS タスク定義を作成する
次に ECS クラスターと ECS タスク定義を作ります.ECS クラスターはコスト観点で ECS Fargate Spot を実行できるようにし,タスク定義は次のように指定しました.
タスク定義の containerDefinitions 抜粋
"containerDefinitions": [ { "name": "rds-log-to-s3-upload", "image": "1234567891012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-repository:latest", "cpu": 1024, "memory": 2048, "portMappings": [], "essential": true, "entryPoint": [ "python3", "rds_donwload_to_s3_upload.py" ], "environment": [], "mountPoints": [], "volumesFrom": [], "readonlyRootFilesystem": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/rds-log-to-s3-upload", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "rds-log-to-s3-upload" } } } ],
これで ECS Runtask の実行準備が完了です.
EventBridge Scheduler で ECS Runtask を実行する
そして,EventBridge Scheduler で ECS Runtask を実行するようにしていきます.この記事では Terraform で設定を行いました.EventBridge Scheduler で ECS Runtask を実行する際に気をつけたのは input
で渡している containerOverrides
部分です.ここではコマンドの上書きを行っています.自分が作成したスクリプトでは引数で Aurora クラスター名とログを格納する S3 バケットを指定する必要があります.その引数をコマンドの上書きとして containerOverrides
で行っております.これで input
に指定したパラメーターに応じて Aurora クラスターとバケットを分けてログを出したりが可能です.
resource "aws_iam_role" "evnetbridge_scheduler" { name = "evnetbridge-scheduler-role" assume_role_policy = data.aws_iam_policy_document.eventbridge_scheduler_assume_policy.json inline_policy { name = "evnetbridge-scheduler-role-inline-policy" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "ecs:StopTask", "ecs:RunTask", "ecs:DescribeTasks", ] Effect = "Allow" Resource = "arn:aws:ecs:ap-northeast-1:1234567891012:task-definition/hoge-task-definition:*" }, { Action = "iam:PassRole" Effect = "Allow" Resource = ["*"] Condition = { StringLike = { "iam:PassedToService" = "ecs-tasks.amazonaws.com" } } }, ] } } data "aws_iam_policy_document" "eventbridge_scheduler_assume_policy" { statement { effect = "Allow" actions = [ "sts:AssumeRole", ] principals { type = "Service" identifiers = [ "scheduler.amazonaws.com", ] } } } resource "aws_scheduler_schedule" "test_scheduler" { name = "test-scheduler" state = "ENABLED" schedule_expression = "cron(0 0 * * ? *)" schedule_expression_timezone = "Asia/Tokyo" flexible_time_window { mode = "OFF" } target { arn = aws_ecs_cluster.hoge.arn role_arn = aws_iam_role.hoge.arn ecs_parameters { task_count = 1 launch_type = "FARGATE" task_definition_arn = aws_ecs_task_definition.hoge_task_definition.arn platform_version = "1.4.0" network_configuration { assign_public_ip = false security_groups = [aws_security_group.hoge.id] subnets = [var.hoge_subnet1_id,var.hoge_subnet2_id] } } input = jsonencode({ "containerOverrides" : [ { "name" : "rds-log-to-s3-upload", "command" : ["[Aurora クラスター名]", " [S3 バケット名]"] } ] }) } }
以上で ECS 上での RDS ログを S3 にアップロードの定期実行の仕組み化ができました.
関連記事
まとめ
RDS ログを S3 にアップロードする仕組みを EventBridge Scheduler と ECS を使って実現するまでの工程を記載しました.これで定期実行ができるようになったのですが,運用し始めての気づきもあったので次の記事ではその辺の話を書きます.