ECS Fargateでイメージタグ管理を効率化するSSMパラメータストア活用術
はじめに
AWS ECS Fargateでコンテナアプリケーションを運用する際、イメージタグの管理は重要な課題の一つです。CloudFormationでインフラを管理している場合、新しいイメージをデプロイするたびにタスク定義のイメージタグを更新する必要があります。この記事では、SSMパラメータストアを活用してこの課題を解決する方法をご紹介します。
課題:なぜイメージタグの管理が面倒なのか?
ECS Fargateでアプリケーションを運用する際、以下のような課題があります:
- CloudFormationテンプレートにイメージタグを直接記述すると、デプロイのたびにテンプレートを更新する必要がある
- 手動でタグを更新する場合、人的ミスのリスクがある
- 複数環境(開発/本番等)でのタグ管理が煩雑になる
-
latest
タグを使用すると簡単だが、以下の問題がある:- 実際にどのバージョンがデプロイされているか追跡が困難
解決策:SSMパラメータストアとCodeBuildの連携
この課題を解決するために、以下の仕組みを実装します:
- SSMパラメータストアにイメージタグを保存
- CloudFormationのタスク定義でパラメータストアの値を参照
- CodeBuildでイメージビルド時に自動的にパラメータを更新
CloudFormationでの実装
まず、SSMパラメータを定義します:
ssmTaskDefinitionRevisionAppSample:
Type: AWS::SSM::Parameter
Properties:
Description: 'Task Definition Revision, updated by the CodePipeline: AppSample'
Name: !Sub /${AWS::StackName}/ssm/TaskDefinitionRevisionAppSample
Type: String
Value: !Ref TaskDefinitionRevisionAppSample
次に、ECSタスク定義でこのパラメータを参照します:
taskAppSample:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${AWS::StackName}-app-sample:{{resolve:ssm:/${AWS::StackName}/ssm/TaskDefinitionRevisionAppSample}}
Essential: true
Name: !Join
- '-'
- - !Ref AWS::StackName
- ecs
- app
- sample
2. CodeBuildでの自動更新設定
buildspec.ymlでイメージビルド時にパラメータを更新します:
version: 0.2
env:
variables:
STACK_NAME: "sample-stack"
APP_NAME: "app-sample"
phases:
install:
commands:
- IMAGE_TAG=$(date "+%Y%m%d%H%M%S")
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
- APPLICATION_IMAGE_TAG=${STACK_NAME}-${APP_NAME}:${IMAGE_TAG}
build:
commands:
- echo "Building the Docker image..."
- docker build -t ${APPLICATION_IMAGE_TAG} .
post_build:
commands:
- echo "Updating image revision in SSM parameter-store..."
- |
aws ssm put-parameter \
--name "/${STACK_NAME}/ssm/TaskDefinitionRevisionAppSample" \
--value "${IMAGE_TAG}" \
--type "String" \
--overwrite
メリット
この仕組みには以下のメリットがあります:
-
自動化による効率化
- イメージタグの更新が自動化され、人的ミスを防止
- CloudFormationテンプレートの変更が不要
-
一貫性の確保
- タグの命名規則が統一され、追跡が容易
- デプロイプロセスが標準化
-
運用負荷の軽減
- 手動でのタグ管理が不要
- 複数環境での一貫した管理が可能
実装のポイント
1. タグ命名規則
イメージタグには日時を使用し、以下のメリットを得られます:
- デプロイ履歴の追跡が容易になる(いつデプロイされたかが一目で分かる)
- バージョン間の前後関係が明確
- ロールバック時に特定の時点のバージョンを即座に特定可能
- 本番環境とステージング環境の差分確認が容易
具体的なタグの生成例:
IMAGE_TAG=$(date "+%Y%m%d%H%M%S")
2. パラメータ名の規則
パラメータ名は環境やアプリケーションが分かりやすい形式にします:
/${STACK_NAME}/ssm/TaskDefinitionRevision[AppName]
3. エラーハンドリング
パラメータ更新時のエラーハンドリングも考慮します:
if ! aws ssm put-parameter \
--name "/${STACK_NAME}/ssm/TaskDefinitionRevisionAppSample" \
--value "${IMAGE_TAG}" \
--type "String" \
--overwrite
then
echo "Failed to update SSM parameter"
exit 1
fi
注意点
1. パラメータストアの権限設定
- CodeBuildのIAMロールに適切な権限が必要
- パラメータへのアクセス制御を適切に設定
2. デバッグ対応
- パラメータ更新のログを適切に記録
- トラブルシューティングのための監視設定
まとめ
SSMパラメータストアを活用することで、ECS Fargateのイメージタグ管理を効率化できます。この方法は以下の場合に特に有効です:
- CloudFormationでインフラを管理している
- CI/CDパイプラインを使用している
- 複数環境での運用がある
この仕組みを導入することで、運用負荷を軽減し、より信頼性の高いデプロイプロセスを実現できます。
参考リンク
以上、お疲れさまでした!