🐣
GitHub ActionsでECSデプロイ時にtask-definition.jsonに秘密情報を外部から注入する
概要
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