AWS Systems Manager パラメーターストアに問い合わせてリージョンやエンドポイントの情報を取得する
こんにちは。サービスグループの武田です。
これまでAWSで提供されているリージョンや、各リージョンのエンドポイントを確認するためにはドキュメントを参照するしかありませんでした。これらの情報がAWS Systems Manager パラメーターストアから取得できるようになり、プログラムなどからも利用しやすくなりました。
AWS News Blogに次のようなポストがありましたので、これを参考にして取得方法などを確認してみました。
環境
次のような環境で検証しています。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.14.4 BuildVersion: 18E226 $ aws --version aws-cli/1.16.145 Python/3.7.0 Darwin/18.5.0 botocore/1.12.135 $ jq --version jq-1.5
AWSの提供リージョン一覧を取得する
AWSの提供リージョンのリージョンコード一覧を取得します。リージョン情報は/aws/service/global-infrastructure/regions
というパラメーター階層で保存されています。そのためget-parameters-by-path
を使用してクエリすることでまとめて取得できます。先日追加された香港リージョン(ap-east-1)も確認できます。
$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/regions' --output json | jq -r '.Parameters[].Value' | sort ap-east-1 ap-northeast-1 ap-northeast-2 ap-northeast-3 ap-south-1 ap-southeast-1 ap-southeast-2 ca-central-1 cn-north-1 cn-northwest-1 eu-central-1 eu-north-1 eu-west-1 eu-west-2 eu-west-3 sa-east-1 us-east-1 us-east-2 us-gov-east-1 us-gov-west-1 us-west-1 us-west-2
AWSで提供されているサービス一覧を取得する
AWSの提供サービスを取得します。サービス情報は/aws/service/global-infrastructure/services
というパラメーター階層で保存されています。執筆時点では160のサービスが提供されているようです。
$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services' --output json | jq -r '.Parameters[].Value' | wc -l 160 $ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services' --output json | jq -r '.Parameters[].Value' | sort | head -10 acm acm-pca alexaforbusiness apigateway application-autoscaling appmesh appstream appsync athena autoscaling
特定リージョンで提供されているサービス一覧を取得する
先ほど取得したのは、AWSが提供している全サービスの一覧です。一方で、特定リージョンで提供されているサービス一覧も取得できます。特定リージョンのサービス情報は/aws/service/global-infrastructure/regions/${region}/services
というパラメーター階層で保存されています。たとえば東京リージョンであれば次のようにクエリします。
$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/regions/ap-northeast-1/services' --output json | jq -r '.Parameters[].Value' | wc -l 126 $ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/regions/ap-northeast-1/services' --output json | jq -r '.Parameters[].Value' | sort | head -10 acm acm-pca apigateway application-autoscaling appmesh appstream appsync athena autoscaling autoscaling-plans
せっかくですので、全サービス一覧と東京リージョンサービス一覧の差分をとってみました。
diff -u \ <(aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services' --output json | jq -r '.Parameters[].Value' | sort) \ <(aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/regions/ap-northeast-1/services' --output json | jq -r '.Parameters[].Value' | sort) \ | grep '^[-][^-]' \ | sed 's/^-//' alexaforbusiness backup ce chime comprehend comprehendmedical cur devicefarm discovery health importexport iot1click-devices lex-models lex-runtime machinelearning macie marketplace-entitlement marketplacecommerceanalytics mgh mobile mturk pinpoint pinpoint-email pinpoint-sms-voice pricing route53domains ses shield textract transcribe translate waf worklink workmail
特定サービスの提供リージョン一覧を取得する
あるサービスがどのリージョンで提供されているかの一覧も取得できます。特定サービスのリージョン情報は/aws/service/global-infrastructure/services/${service}/regions
というパラメーター階層で保存されています。たとえばAmazon Athenaであれば次のようにクエリします。
$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services/athena/regions' --output json | jq -r '.Parameters[].Value' | sort ap-northeast-1 ap-northeast-2 ap-south-1 ap-southeast-1 ap-southeast-2 ca-central-1 eu-central-1 eu-west-1 eu-west-2 us-east-1 us-east-2 us-gov-west-1 us-west-2
サービス名を取得する
サービスコード(?)からサービス名を取得できます。サービス情報は/aws/service/global-infrastructure/services/${service}/longName
というキーで保存されています。サービスの正式名称をCLIで調べたいときなどに有用そうです。次のようにクエリすることで取得できます。
$ aws ssm get-parameter --name '/aws/service/global-infrastructure/services/athena/longName' --output json | jq -r '.Parameter.Value' Amazon Athena $ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services/athena' --output json | jq -r '.Parameters[].Value' Amazon Athena
特定サービスのエンドポイントを取得する
サービスのエンドポイントが取得できます。エンドポイントはサービスとリージョンから組み立てられることが多いですが、一部例外もありますので、汎用的な処理を書きたい場合などによさそうです。/aws/service/global-infrastructure/regions/${region}/services/${service}/endpoint
または/aws/service/global-infrastructure/services/${service}/regions/${region}/endpoint
というパラメーター階層で保存されており、どちらも同じ結果が取得できます。
$ aws ssm get-parameter --name '/aws/service/global-infrastructure/regions/ap-northeast-1/services/athena/endpoint' --output json | jq -r '.Parameter.Value' athena.ap-northeast-1.amazonaws.com $ aws ssm get-parameter --name '/aws/service/global-infrastructure/services/athena/regions/ap-northeast-1/endpoint' --output json | jq -r '.Parameter.Value' athena.ap-northeast-1.amazonaws.com $ aws ssm get-parameter --name '/aws/service/global-infrastructure/regions/ap-northeast-1/services/iam/endpoint' --output json | jq -r '.Parameter.Value' iam.amazonaws.com $ aws ssm get-parameter --name '/aws/service/global-infrastructure/regions/us-gov-east-1/services/iam/endpoint' --output json | jq -r '.Parameter.Value' iam.us-gov.amazonaws.com
まとめ
AWSのAPIを使用して各種情報が取得できると自動化が捗りますね!処理の中でリージョン情報などが必要になった際には、このエントリを思い出してもらえたら幸いです。