AWS Systems Manager パラメーターストアに問い合わせてリージョンやエンドポイントの情報を取得する

こんにちは。サービスグループの武田です。

これまでAWSで提供されているリージョンや、各リージョンのエンドポイントを確認するためにはドキュメントを参照するしかありませんでした。これらの情報がAWS Systems Manager パラメーターストアから取得できるようになり、プログラムなどからも利用しやすくなりました。

AWS News Blogに次のようなポストがありましたので、これを参考にして取得方法などを確認してみました。

New – Query for AWS Regions, Endpoints, and More Using AWS Systems Manager Parameter Store | 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を使用して各種情報が取得できると自動化が捗りますね!処理の中でリージョン情報などが必要になった際には、このエントリを思い出してもらえたら幸いです。