🙄

Amazon ECS サービスリビジョンから対象のクラスター・サービスを特定するスクリプトを書いてみた

2025/01/30に公開

なぜやろうと思ったのか

デプロイの状況を監視するために、EventBridge経由でECS Deployment State Changeのイベントをslackに通知しています。
こんな感じです。

ただ、この通知Deployment IDは記載されているんですが、クラスター・サービスの情報がない
→これだと問題が発生した時にどのクラスター・サービスで発生するかが分からない。。。。

ってことでサクッと特定できればいいかなと思いって作ってみました。

Amazon ECS サービスリビジョンって

slackの通知には「Deployment ID」ってなっているんですが、正式には「Amazon ECS サービスリビジョン」という名称らしい?

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-revision.html

マネコンでいうとここの部分

アプリケーションがECS化してから結構経っていますが、正直これを意識したことは今まであまりなかったです。。。。

スクリプト(Ruby)

引数にAmazon ECS サービスリビジョンを渡してあげて検索かけるみたいな感じです。
CLI一発とかで検索できればいいんだけど、微妙にめんどくさい。。。。
ちょっと検索するところは雑かも?💦

スクリプト本体(test.rb)

require 'aws-sdk-ecs'  

# AWSクライアントの設定
ecs_client = Aws::ECS::Client.new(region: 'ap-northeast-1')

# サービスリビジョンID
#service_revision_id = 'ecs-svc/5104029439159861045'
service_revision_id = ARGV[0]

# クラスタのリストを取得
clusters = ecs_client.list_clusters.cluster_arns

clusters.each do |cluster_arn|
  # クラスタ内のサービスを取得
  services = ecs_client.list_services(cluster: cluster_arn).service_arns

  services.each do |service_arn|
    # サービスの詳細を取得
    service = ecs_client.describe_services(cluster: cluster_arn, services: [service_arn]).services.first

    # サービスリビジョンIDと一致するか確認
    if service.deployments[0].include?(service_revision_id)
      puts "Cluster ARN: #{cluster_arn}"
      puts "Service ARN: #{service_arn}"
    end
  end
end

Gemfile

source "https://rubygems.org"
gem 'aws-sdk-ecs'

実行例

$ ruby test.rb ecs-svc/{{ Amazon ECS サービスリビジョン }}
Cluster ARN: arn:aws:ecs:ap-northeast-1:{{ AWSのアカウントID }}:cluster/{{ クラスター名 }}
Service ARN: arn:aws:ecs:ap-northeast-1:{{ AWSのアカウントID }}:service/{{ クラスター名 }}/{{ サービス名 }}
NaviPlusテックブログ

Discussion