AWS Copilotを使っていて、気がついた点や公式ドキュメントではわかりにくい点をまとめました
ビルド時にキャッシュを効かせる
公式ドキュメントでもdockerfileの指定は
image:
build: './frontend/Dockerfile'
こんな感じでになっていますが、これだと毎回最初からビルドされるので非効率です
image:
build:
dockerfile: './frontend/Dockerfile'
cache_from:
- {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxx:latest
args:
BUILDKIT_INLINE_CACHE: 1
こんな感じでcache_fromにECRのレポジトリとargsにBUILDKIT_INLINE_CACHE:1
を設定するとキャッシュが効きます
要は、docker buildコマンドで--cache-from
と--build-arg BUILDKIT_INLINE_CACHE=1
を指定してるのと同じことになります
(ただ、これでも変更が無いのにキャッシュが効かないことがある謎)
起動コマンドで複数コマンドを実行したい場合は起動用シェルを作る
例えばこんな感じで
command: python manage.py migrate && gunicorn config.wsgi:application -b :80 --timeout 600
&&で繋いで複数コマンド実行とかはできません
素直にシェルにしましょう、例えばこんな感じ
(省略)
COPY start.sh /start.sh
RUN chmod +x /start.sh
(省略)
python manage.py migrate
gunicorn config.wsgi:application -b :80 --timeout 600
command: sh /start-prd.sh
git管理したくない情報のsecretsへの渡し方
DBのアクセス情報とか各種アクセスキーなどですね
その場合、パラメータストアかシークレットマネージャーから渡すことになります
シークレットマネージャーの場合
secrets:
{設定したい環境変数名}:
secretsmanager: '{シークレットの名前}:{シークレットのキー}::'
例えば以下のような感じ
secrets:
DATABASE_HOST:
secretsmanager: 'hogehoge:host::'
パラメータストアの場合
secrets:
{設定したい環境変数名}: {パラメータの名前}
パラメータの名前は
/copilot/${COPILOT_APPLICATION_NAME}/${COPILOT_ENVIRONMENT_NAME}/secrets/{パラメータ}
が推奨のようです
例えば以下のような感じ
secrets:
API_KEY: /copilot/${COPILOT_APPLICATION_NAME}/${COPILOT_ENVIRONMENT_NAME}/secrets/API_KEY
またどちらも以下の二つのタグをつける必要があります
copilot-application: {copilotで作成したアプリケーション名}
copilot-environment: {デプロイする際のenvironment}
jobのdockerfileはlocationを指定する
jobは大抵はバックエンドと同じソースで起動コマンドだけ違うってことが多いと思います
その場合にmanifestファイルにバックエンドと同じようにdockerfileのパスを指定すると、ビルドされてしまいデプロイに時間がかかりますし、ECRのレポジトリも勝手に作られてしまいます
以下のような感じでlocationを指定すれば、デプロイ時にビルドされずにビルド済みイメージが使われます
image:
location: {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxx:latest
jobでDB接続したい場合はsecurity_groupsを指定する
バックエンドサービスが使っているセキュリティグループをそのまま使えばいいはず
例えばApp Runnerの場合は、設定>ネットワーキング>セキュリティグループにありました
network:
vpc:
security_groups:
groups:
- 'sg-xxxxxxxxxxxx'
manifestファイルに変更があった場合にやること
サービスのmanifestファイルに変更があった場合は特にやることはなく、普通にpushするだけで反映されます
ただし、pipelinesのmanifestファイルはcopilot pipeline deploy
をしないと反映されませんでした