AWS Systems Manager パラメーターストアを利用してAWSサービス一覧を取得してみる

AWS Systems Manager パラメーターストアを利用してAWSのサービス一覧が取得できるのでは、と考え付いたのでやってみました。
2019.05.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

AWS Systems Manager パラメーターストアからリージョンやエンドポイントの情報を取得する方法について書きました。

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

書いている途中で、longName のパラメーターを使えばサービス一覧が作れるのでは?と考え付いたのでさっそくやってみました。

最初に思いついた愚直な方法

パラメーターストアのキーに使われるサービス名は、やはりパラメーターストア自身から取得できます。そのため、一覧取得をしたらあとは繰り返しlongNameを取得すればいいのかな。と考えました。つまり次のようなコマンドです。

$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services' --output json \
  | jq -r '.Parameters[].Value' \
  | xargs -I{} aws ssm get-parameter --name '/aws/service/global-infrastructure/services/{}/longName' --output json \
  | jq -r '.Parameter.Value'

ただこれはよくない気がしました。典型的な N+1のクエリ に見えるためです。実際に試してはいませんが。何か方法はないのかなとドキュメントを眺めていたらよさそうなオプションがありました。

get-parameters-by-pathで再帰的に取得する方法

get-parameters-by-path — AWS CLI 1.16.155 Command Referenceのページを眺めていると--recursiveというオプションがありました。これを使用することで、階層直下のパラメーターだけでなく、より深く掘って取得できます。試しに付けて叩いてみたところ、longNameのほかにもendpointやprotocolsなども一緒に取得していました。これらを踏まえて次のようなコマンドを組み立てました。

$ aws ssm get-parameters-by-path --path '/aws/service/global-infrastructure/services' --recursive --output json \
  | jq -r '.Parameters[] | select(.Name | endswith("longName")) | .Value' \
  | sort

実行結果として、次のサービス一覧が取得できました。

AWS App Mesh
AWS AppSync
AWS Application Discovery Service
AWS Auto Scaling Plans
AWS Backup
AWS Batch
AWS Budgets
AWS Certificate Manager
AWS Certificate Manager Private Certificate Authority
AWS Cloud Map
AWS Cloud9
AWS CloudFormation
AWS CloudHSM V2
AWS CloudTrail
AWS CodeBuild
AWS CodeCommit
AWS CodeDeploy
AWS CodePipeline
AWS CodeStar
AWS Comprehend Medical
AWS Config
AWS Cost Explorer Service
AWS Cost and Usage Report Service
AWS Data Pipeline
AWS DataSync
AWS Database Migration Service
AWS Device Farm
AWS Direct Connect
AWS Directory Service
AWS Elastic Beanstalk
AWS Elemental MediaConvert
AWS Elemental MediaLive
AWS Elemental MediaPackage
AWS Elemental MediaStore
AWS Elemental MediaStore Data Plane
AWS Global Accelerator
AWS Glue
AWS Greengrass
AWS Health APIs and Notifications
AWS Identity and Access Management
AWS Import/Export
AWS IoT
AWS IoT 1-Click Devices Service
AWS IoT 1-Click Projects Service
AWS IoT Analytics
AWS IoT Data Plane
AWS Key Management Service
AWS Lambda
AWS License Manager
AWS Marketplace Commerce Analytics
AWS Marketplace Entitlement Service
AWS MediaConnect
AWS MediaTailor
AWS Migration Hub
AWS Mobile
AWS OpsWorks
AWS OpsWorks for Chef Automate
AWS Organizations
AWS Performance Insights
AWS Price List Service
AWS Resource Access Manager
AWS Resource Groups
AWS Resource Groups Tagging API
AWS RoboMaker
AWS S3 Control
AWS Secrets Manager
AWS Security Token Service
AWS SecurityHub
AWS Server Migration Service
AWS Service Catalog
AWS Shield
AWS Signer
AWS Step Functions
AWS Storage Gateway
AWS Support
AWS Transfer for SFTP
AWS WAF
AWS WAF Regional
AWS X-Ray
AWSMarketplace Metering
AWSServerlessApplicationRepository
Alexa For Business
Amazon API Gateway
Amazon AppStream
Amazon Athena
Amazon Chime
Amazon CloudFront
Amazon CloudHSM
Amazon CloudSearch
Amazon CloudWatch
Amazon CloudWatch Events
Amazon CloudWatch Logs
Amazon Cognito Identity
Amazon Cognito Identity Provider
Amazon Cognito Sync
Amazon Comprehend
Amazon Connect Service
Amazon Data Lifecycle Manager
Amazon DocumentDB with MongoDB compatibility
Amazon DynamoDB
Amazon DynamoDB Accelerator (DAX)
Amazon DynamoDB Streams
Amazon EC2 Container Registry
Amazon EC2 Container Service
Amazon ElastiCache
Amazon Elastic Compute Cloud
Amazon Elastic Container Service for Kubernetes
Amazon Elastic File System
Amazon Elastic MapReduce
Amazon Elastic Transcoder
Amazon Elasticsearch Service
Amazon FSx
Amazon GameLift
Amazon Glacier
Amazon GuardDuty
Amazon Import/Export Snowball
Amazon Inspector
Amazon Kinesis
Amazon Kinesis Analytics
Amazon Kinesis Firehose
Amazon Kinesis Video Streams
Amazon Lex Model Building Service
Amazon Lex Runtime Service
Amazon Lightsail
Amazon Machine Learning
Amazon Macie
Amazon Mechanical Turk
Amazon Neptune
Amazon Pinpoint
Amazon Pinpoint Email Service
Amazon Pinpoint SMS and Voice Service
Amazon Polly
Amazon Redshift
Amazon Rekognition
Amazon Relational Database Service
Amazon Route 53
Amazon Route 53 Domains
Amazon Route 53 Resolver
Amazon SageMaker Runtime
Amazon SageMaker Service
Amazon Simple Email Service
Amazon Simple Notification Service
Amazon Simple Queue Service
Amazon Simple Storage Service
Amazon Simple Systems Manager (SSM)
Amazon Simple Workflow Service
Amazon SimpleDB
Amazon Textract
Amazon Transcribe Service
Amazon Translate
Amazon WorkDocs
Amazon WorkLink
Amazon WorkMail
Amazon WorkSpaces
AmazonMQ
Application Auto Scaling
Auto Scaling
Elastic Load Balancing
Firewall Management Service
Managed Streaming for Kafka

まとめ

--recursiveオプションを付けるとレスポンスを受け取るまでそれなりに待たされました。ただHistoryで確認してみると、リクエストは一度しかしていませんので、おそらく行儀はよいと思われます(よいと信じたい)。

ところで、 AWS Systems ManagerAmazon Simple Systems Manager (SSM) だったり、 AWS Firewall ManagerFirewall Management Service だったりとやや取得できるサービス名に古いものがあるようです。おそらく順次更新されていくものと思われますので、必ずしも最新のサービス名ではないということは覚えておくとよさそうです。