🐣

GitHub ActionsでECSデプロイ時にtask-definition.jsonに秘密情報を外部から注入する

2021/10/24に公開

概要

GitHub ActionsでECSのデプロイをしようとしたところ、task-definitionに秘密情報をハードコーディングする必要がでてきてしまい困ったので解決方法を記録しておく。

結論

task-definition.jsonに特定の文字列を書いておき、sedコマンドでGitHub管理のsecretに書き換える。

task-definition

サンプルなのでAWSのアカウントIDを秘密情報扱いをしており、今回は「SED_TARGET_AWS_ACCOUNT_ID」としています。
※ 筆者の場合GrafanaのLokiへのログ転送設定をする際に秘密情報をハードコーディングする必要がでてきて困りました。

{
  "executionRoleArn": "arn:aws:iam::SED_TARGET_AWS_ACCOUNT_ID:role/sample-TaskExecution",
  "taskRoleArn": "arn:aws:iam::SED_TARGET_AWS_ACCOUNT_ID:role/sample-TaskExecution",
  "family": "sample-app",

  //   ....
  
  "containerDefinitions": [
    {
      "name": "nginx",
      "image": "SED_TARGET_AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        },
      ],

      // ....

    }
  ]
}

GitHub ActionsのWorkflow

Deploy処理を走らせる前にsedコマンドで秘密情報を注入してあげるとよいです。

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      # ....

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      # Rewrite task-definition(秘密情報を注入する)
      - name: rewrite task-definition
        run: sed -i -e s/SED_TARGET_AWS_ACCOUNT_ID/${{ secrets.AWS_ACCOUNT_ID }}/g .aws/ecs/task-definition.json

      # ...

      # Deploy
      - name: Render Amazon ECS task definition for first container
        id: render-web-container
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        with:
          task-definition: .aws/ecs/task-definition.json
          container-name: nginx
          image: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

注意事項

コンテナの環境変数に秘密情報を持たせたい場合はシステムマネージャのパラメータストアを利用すると便利です。

Discussion