🙄
Amazon ECS サービスリビジョンから対象のクラスター・サービスを特定するスクリプトを書いてみた
なぜやろうと思ったのか
デプロイの状況を監視するために、EventBridge経由でECS Deployment State Changeのイベントをslackに通知しています。
こんな感じです。

ただ、この通知Deployment IDは記載されているんですが、クラスター・サービスの情報がない
→これだと問題が発生した時にどのクラスター・サービスで発生するかが分からない。。。。
ってことでサクッと特定できればいいかなと思いって作ってみました。
Amazon ECS サービスリビジョンって
slackの通知には「Deployment ID」ってなっているんですが、正式には「Amazon ECS サービスリビジョン」という名称らしい?
マネコンでいうとここの部分

アプリケーションがECS化してから結構経っていますが、正直これを意識したことは今まであまりなかったです。。。。
スクリプト(Ruby)
処理の内容としては、こんな感じです。
※2025/02/13 スクリプトの内容を修正しました。以前に書いたスクリプトの場合だとデプロイサーキットブレーカーによってロールバックした場合にサービスリビジョンもロールバックしてしまうため、うまく検索できない感じになってました。。。
- (1) サービスリビジョンIDを引数から取得&文字列加工
- (2) ap-northeast-1リージョンのECSクラスタを取得
- (3) 各クラスタ内のサービスを走査し、サービスのデプロイメント一覧を取得
- (4) 該当のサービスリビジョンが存在した場合はクラスタ名、サービス名を取得
スクリプト本体(test.rb)
require 'aws-sdk-ecs'
# サービスリビジョンIDを引数から取得
argv = ARGV[0]
# サービスリビジョンIDから「evc-svc/」を削除
# https://www.javadrive.jp/ruby/regex/index29.html
/ecs-svc\// =~ argv
service_revision_id = $'
if service_revision_id.nil? || service_revision_id.empty?
puts "サービスリビジョンIDを引数として指定してください。"
exit 1
end
# ECSクライアントを初期化
ecs = Aws::ECS::Client.new(region: 'ap-northeast-1')
# アカウント内の全クラスタを取得
clusters = []
ecs.list_clusters.cluster_arns.each do |cluster_arn|
clusters << cluster_arn
end
# 各クラスタ内のサービスを走査
clusters.each do |cluster_arn|
ecs.list_services({cluster: cluster_arn}).service_arns.each do |service_arn|
# サービスのデプロイメント一覧を取得
deployments = ecs.list_service_deployments({
cluster: cluster_arn,
service: service_arn
}).service_deployments
# デプロイ一覧に該当のサービスリビジョンIDが存在する場合はクラスタ・サービス名を出力
if deployments[0].target_service_revision_arn.include?(service_revision_id)
cluster_name = cluster_arn.split('/').last
service_name = service_arn.split('/').last
puts "クラスタ: #{cluster_name}, サービス: #{service_name}"
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/{{ クラスター名 }}/{{ サービス名 }}
Discussion