AWS Systems Manager Public Parameter で AWS サービスについてアレコレやってみた!

2020.02.28

園部です。

今日は AWS Systems Manager(以降 SSM) の Parameter Store で AWS が提供している Public Parameter を利用して AWS サービスについて色々調べてみたいと思います!

Public Parameters とは

一部の AWS のサービスでは、共通のアーティファクトを Systems Manager パブリック パラメータとして公開します。たとえば、Amazon Elastic Compute Cloud (Amazon EC2) サービスは、パブリックパラメータとして Amazon マシンイメージ (AMI) の情報を公開します。GetParametersByPath、GetParameter、および GetParameters API アクションを使用して、スクリプトやコードからこの情報を呼び出すことができます。

引用: 公式ドキュメント

上記ドキュメントで、3つのユースケースが紹介されています。

  • AMI パブリックパラメータを呼び出す
  • ECS に最適化された AMI パブリックパラメータを呼び出す
  • AWS のサービス、リージョン、エンドポイントパブリックパラメータを呼び出す

一つ目のユースケースについては弊社メンバーが既に記事で書いてくれています!

今日は、三つ目のユースケース「AWS のサービス、リージョン、エンドポイントパブリックパラメータを呼び出す」を参考にアレコレやってみたいと思います!

ドキュメントサンプルをやってみる

まずはドキュメントで紹介されている例をやってみます!

アクティブな AWS リージョン一覧を取得

AWS CLI ssm get-parameters-by-path を利用して取得します。

$ aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/regions --query Parameters[].Name |sort
    "/aws/service/global-infrastructure/regions/ap-east-1",
    "/aws/service/global-infrastructure/regions/ap-northeast-1",
    "/aws/service/global-infrastructure/regions/ap-northeast-2",
    "/aws/service/global-infrastructure/regions/ap-northeast-3",
    "/aws/service/global-infrastructure/regions/ap-south-1",
    "/aws/service/global-infrastructure/regions/ap-southeast-1",
    "/aws/service/global-infrastructure/regions/ap-southeast-2",
    "/aws/service/global-infrastructure/regions/ca-central-1",
    "/aws/service/global-infrastructure/regions/cn-north-1",
    "/aws/service/global-infrastructure/regions/cn-northwest-1",
    "/aws/service/global-infrastructure/regions/eu-central-1",
    "/aws/service/global-infrastructure/regions/eu-north-1",
    "/aws/service/global-infrastructure/regions/eu-west-1"
    "/aws/service/global-infrastructure/regions/eu-west-2",
    "/aws/service/global-infrastructure/regions/eu-west-3",
    "/aws/service/global-infrastructure/regions/me-south-1",
    "/aws/service/global-infrastructure/regions/sa-east-1",
    "/aws/service/global-infrastructure/regions/us-east-1",
    "/aws/service/global-infrastructure/regions/us-east-2",
    "/aws/service/global-infrastructure/regions/us-gov-east-1",
    "/aws/service/global-infrastructure/regions/us-gov-west-1",
    "/aws/service/global-infrastructure/regions/us-west-1",
    "/aws/service/global-infrastructure/regions/us-west-2",

利用可能サービス一覧を取得

$ aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/services --query Parameters[].Name |sort
    "/aws/service/global-infrastructure/services/accessanalyzer",
    "/aws/service/global-infrastructure/services/acm",
    "/aws/service/global-infrastructure/services/acm-pca",
    "/aws/service/global-infrastructure/services/alexaforbusiness",
    "/aws/service/global-infrastructure/services/amplify",
(中略)    
    "/aws/service/global-infrastructure/services/worklink",
    "/aws/service/global-infrastructure/services/workmail"
    "/aws/service/global-infrastructure/services/workmailmessageflow",
    "/aws/service/global-infrastructure/services/workspaces",
    "/aws/service/global-infrastructure/services/xray",

特定サービスが利用可能なリージョンを取得

e.g. SSM が利用が可能なリージョンを取得してみます。

$ aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/services/ssm/regions --query Parameters[].Value 
    "ap-east-1",
    "ap-northeast-1",
    "ap-northeast-2",
    "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",
    "me-south-1",
    "sa-east-1",
    "us-east-1",
    "us-east-2",
    "us-gov-east-1",
    "us-gov-west-1",
    "us-west-1",
    "us-west-2",

e.g. MACIE が利用が可能なリージョンを取得しています。

$ aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/services/macie/regions --query Parameters[].Value |sort
    "us-east-1",
    "us-west-2"

特定サービスの特定リージョンでのエンドポイントを取得

e.g. SSM の東京リージョンでのエンドポイントを取得してみます。
ここでは AWS CLI ssm get-parameter を利用して取得します。

$ aws ssm get-parameter --name /aws/service/global-infrastructure/regions/ap-northeast-1/services/ssm/endpoint --query Parameter.Value
"ssm.ap-northeast-1.amazonaws.com"

アレコレやってみる

特定リージョンで利用可能なサービス

e.g. 中国(寧夏)リージョンで提供されているサービスエンドポイントを取得してみます。

$ aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/regions/cn-northwest-1/services --query Parameters[].Value |sort
    "apigateway",
    "apigatewaymanagementapi",
    "apigatewayv2",
    "application-autoscaling",
    "athena",
(中略) 
    "support",
    "swf",
    "transcribe",
    "workspaces",
    "xray"

グローバルサービスとリージョンサービス

ここは正解となる情報を得られていないので、あくまで以下の条件と仮定して実施しています。

  • 各リージョンのエンドポイントがすべて ".amazonaws.com" でリージョンを含まない
  • 各リージョンのエンドポイントで "us-east-1" をエンドポイントのみ提供している
  • "us-west-2" の全サービスのエンドポイントを取得して上記に該当するサービスをグローバルサービスとする
#!/bin/sh

SERVICES=`aws ssm get-parameters-by-path --path /aws/service/global-infrastructure/services --query Parameters[].Value --output text |sort`

for SERVICE in ${SERVICES}; do
  ENDPOINT=`aws ssm get-parameter --name /aws/service/global-infrastructure/regions/us-west-2/services/${SERVICE}/endpoint --query Parameter.Value`

  if [ "${ENDPOINT}" == "" ]; then
    echo ${SERVICE} >> global_service.txt
  else
    if [ `echo ${ENDPOINT} |grep "us-west-2"` ]; then
      echo ${SERVICE},${ENDPOINT} >> region_service.txt
    else
      echo ${SERVICE},${ENDPOINT} >> global_service.txt
    fi
  fi

done
$ wc -l |global_service.txt
      24 global_service.txt
$ wc -l |region_service.txt
     176 region_service.txt
$ cat global_service.txt |sort
alexaforbusiness
budgets,"budgets.amazonaws.com"
ce
cloudfront,"cloudfront.amazonaws.com"
cur
frauddetector
globalaccelerator,"globalaccelerator.amazonaws.com"
health
iam,"iam.amazonaws.com"
importexport,"importexport.amazonaws.com"
machinelearning
managedblockchain
marketplace-entitlement
marketplacecommerceanalytics
mobile,"mobile.us-east-1.amazonaws.com"
mturk
organizations,"organizations.us-east-1.amazonaws.com"
pricing
route53,"route53.amazonaws.com"
route53domains
savingsplans,"savingsplans.amazonaws.com"
shield
support,"support.us-east-1.amazonaws.com"
waf,"waf.amazonaws.com"

さいごに

他にもリージョン単位のサービス数を取得するなど、いろいろなことが行えそうです。最後のリージョンサービスとリージョンサービスについては前提含め違う方法や 誤りがあればコメントいただけますとありがたいです。

また本エントリが、どなたかのお役に立てれば幸いです。