0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ECS Fargateでイメージタグ管理を効率化するSSMパラメータストア活用術

Posted at

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パイプラインを使用している
  • 複数環境での運用がある

この仕組みを導入することで、運用負荷を軽減し、より信頼性の高いデプロイプロセスを実現できます。

参考リンク

以上、お疲れさまでした!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?