すべての AWS サービス(ただし名前空間を基準とする)をコマンド一発で一覧出力するワンライナーが完成した

AWS サービスを一覧で表示できます。でも Amazon VPC はそこに居ません。

コンバンハ、千葉(幸)です。

「結局 AWS サービスって何個あるの……?」「似た名前のものがあり過ぎない?」「よく名前を聞くあれはサービスの一つなの?機能なの?」

そんな疑問が思い浮かぶ場面は皆さん多々あるのではないでしょうか。

それらにバチッと応えてくれる唯一の手法、それはコマンドによる一覧出力を置いて他に存在しないですよね。そしてコマンドを実行するからには何回も打鍵したくない、一発で行いたいというのが便利さに慣れきった現代人が辿り着く至高の思考であり嗜好ですよね。

そんな要求に応えるため、私は調査に明け暮れました。そして苦節 74 分、ついにワンライナーでの出力に成功しました。今回はその内容をご紹介します。

(なお、動作確認ができているのはzshbashのみです。)

Windows は早々に諦めましたが詳しい方がいたら教えてください。 あっという間に社内のメンバーが作成してくれました!感謝!)

ちょっといろいろ条件付きなのはご容赦ください

目次

そもそも「AWS サービス」の定義はなんだ

本題に入る前に、前提をきちんと整理しておきましょう。

何をもって「AWS サービス」とするかについてです。ここの整理をきちんとせずに「すべての AWS サービスを出力できる」と言うと私は嘘つきになってしまうので、しばしお付き合いください。

Amazon VPC は AWS サービスなのか?

突然ですが、「Amazon VPC は AWS サービスのひとつです」と言われたら、皆さんはどのように思いますか?

「確かにそうだよね、有名だよね」と思うかもしれません。私も大体のケースにおいてそう思います。

しかし、「その根拠を教えてくれ」と言われたらどのように答えますか?改めて問われると少し難しい部分です。

いろいろな情報を見ると、Amazon VPC が AWS サービスの一つである、というのは揺るぎのない事実のように感ぜられます。

しかし、ちょっと待ってほしい。

また別の視点においては、Amazon VPC はサービスではない、と考えることもできます。

AWS サービスの名前空間に vpc はない

例えば、VPC や サブネット、NetworkACLといったリソースは、 Amazon VPC という括りに属すると考えるのが自然です。しかし、それらのリソースの Amazon リソースネーム (ARN)におけるサービスの名前空間は、vpcではなくec2です。

例えば VPC の ARN 例は以下です。左から 3 つ目のセクションがec2となっています。

arn:aws:ec2:region:account:vpc/vpc-11223344556677889

同じ観点で、 VPC に関連するアクションについて IAM で制御を行う際のサービスプレフィックスはec2です。

  • ec2:CreateVpc
  • ec2:ModifySubnetAttribute
  • ec2:DeleteNetworkAcl など

AWS CLI や 各種 SDK で VPC に関する API を実行する際も、それは ec2という括りの中で行われます。

こうなってくると、「もしかして Amazon EC2 というサービスの、単なるカテゴリの一つとして Amazon VPC が存在するのか……?」という疑念が湧き上がってきます。何を基準に考えればいいのかが悩ましくなってきます。

VPC の枠を飛び出してさらに広い領域で考えると、悩ましさポイントが発揮される観点はまだまだあります。

  • AWS WAF と AWS WAF v2 って別のサービスですか?
  • CLB と ALB って同じサービスの別のタイプのリソースってことでいいですか?
  • それとも ALB と NLB は ELB v2 なので CLB とは別サービスですか?
  • EC2 Instance Connect って EC2 というサービスの中の一つの括りですか?
  • AWS MarketPlace ってサービスですか?
  • Kinesis と Kinesis Firehose ってどういう関係ですか?

これらの問いを複数人に対して投げかけた時に、単一の答えが返ってくることは無いでしょう。人によって解釈はぶれ、そこには曖昧さが存在するはずです。

人間はあいまいさから逃れられない

人間として生きていくには、あいまいさは避けては通れません。デジタルのように 1 か 0 で割り切れるものではなく、その狭間で生きていく生き物が人間です。会話、思考、議論、表現、風土、課題、方針、至る所にあいまいさが発生します。

明確な着地点を持たない会議のソフトランディングを愛想笑いをしてそのまま流したり、ステークホルダー間の彼是を清濁あわせ呑んで窓の外を見つめてみたり、ビルの隙間から覗く空を見上げて「こんなに青かったんだな」と独りごちてみたり、そうやって生きていくほかありません。

「だと思います」と修飾をつけて解像度を下げてみたり、「だと思われます」というあたかも自身が主語でないようなブラー(ぼかし)のかけ方をしたりせずにはいられません。きっとそう思われます。

なのでせめてシステムにおいては、システムだけは、あいまいさから切り離された世界で動いて欲しいと願います。誰がいつどこから実行しても、同一の条件においては常に同一の結果が返ってくる、そんな明瞭性こそが、我々人類にとっての心の救済です。

ということで今回は名前空間を基準にします

AWS サービスにおけるある一つの明確な基準、それは名前空間です。名前空間とは何かをおさらいしておきましょう。

保持する項目 (名前、技術用語、または単語) のコンテキストを提供し、複数の異なる名前空間に存在する同音異義語項目のあいまい性解消を可能にする抽象的なコンテナ。

AWS の用語集 - AWS 全般のリファレンス

言っていることは難しいですが、あいまい性を解消してくれるそうです。

そして先ほども少し触れた ARN においては、service部について以下の説明がされています。

The service namespace that identifies the AWS product. For example, s3 for Amazon S3 resources.

AWS 製品を識別するサービスの名前空間」がここで定義されています。各種リソースがどのサービス(製品)に属するものなのか、ここでは明確になっています。

今回は、サービスの名前空間を持つものが AWS サービスである、という基準で考えます。

その基準に則ると、Amazon VPC は独自の名前空間を持たないため、 AWS サービスではありません。クラシックな WAF と WAF v2 は別のサービスですし、WAF リージョナルと グローバルな WAF も別サービスです。

感覚的には違和感が残りますが、今回はこの基準で行きます。「 ”AWS サービスかどうか”と”独自の名前空間を持つかどうか”は別の軸だろう」という声が聞こえてきそうですが、今回はこの基準で行きます。

AWS サービスを一覧出力するワンライナー

前置きが長くなりましたが、今回紹介するコマンドは以下です。

$ aws iam get-service-last-accessed-details --job-id `aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text` --max-items 1000  | jq '.ServicesLastAccessed[].ServiceName'

なお、以下がセットアップ済みであることが条件です。

  • AWS CLI(以下のアクションを実行可能な権限を持つこと)
    • iam:GenerateServiceLastAccessedDetails
    • iam:GetServiceLastAccessedDetails
  • jq

上記のコマンドを実行すると、このように出力されます。

折り畳み
% aws iam get-service-last-accessed-details --job-id `aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text` --max-items 1000  | jq '.ServicesLastAccessed[].ServiceName'
"Alexa for Business"
"IAM Access Analyzer"
"AWS Accounts"
"AWS Certificate Manager"
"AWS Certificate Manager Private Certificate Authority"
"AWS Amplify"
"Manage - Amazon API Gateway"
"AWS AppConfig"
"Amazon AppFlow"
"Application Auto Scaling"
"CloudWatch Application Insights"
"AWS App Mesh"
"AWS App Mesh Preview"
"Amazon AppStream 2.0"
"AWS AppSync"
"Application Discovery Arsenal"
"AWS Artifact"
"Amazon Athena"
"Amazon EC2 Auto Scaling"
"AWS Auto Scaling"
"AWS Marketplace"
"AWS Marketplace Management Portal"
"AWS Billing"
"AWS Connector Service"
"AWS Backup"
"AWS Backup storage"
"AWS Batch"
"Amazon Braket"
"AWS Budget Service"
"Amazon Keyspaces (for Apache Cassandra)"
"AWS Cost Explorer Service"
"AWS Chatbot"
"Amazon Chime"
"AWS Cloud9"
"Amazon Cloud Directory"
"AWS CloudFormation"
"Amazon CloudFront"
"AWS CloudHSM"
"Amazon CloudSearch"
"AWS CloudTrail"
"Amazon CloudWatch"
"AWS CodeArtifact"
"AWS CodeBuild"
"AWS CodeCommit"
"AWS CodeDeploy"
"Amazon CodeGuru"
"Amazon CodeGuru Profiler"
"Amazon CodeGuru Reviewer"
"AWS CodePipeline"
"AWS CodeStar"
"AWS CodeStar Connections"
"AWS CodeStar Notifications"
"Amazon Cognito Identity"
"Amazon Cognito User Pools"
"Amazon Cognito Sync"
"Amazon Comprehend"
"Comprehend Medical"
"Compute Optimizer"
"AWS Config"
"Amazon Connect"
"AWS Cost and Usage Report"
"AWS Data Exchange"
"Data Pipeline"
"DataSync"
"Amazon DynamoDB Accelerator (DAX)"
"Database Query Metadata Service"
"AWS DeepComposer"
"AWS DeepLens"
"AWS DeepRacer"
"Amazon Detective"
"AWS Device Farm"
"AWS Direct Connect"
"AWS Application Discovery Service"
"Amazon Data Lifecycle Manager"
"AWS Database Migration Service"
"AWS Directory Service"
"Amazon DynamoDB"
"Amazon Elastic Block Store"
"Amazon EC2"
"Amazon EC2 Instance Connect"
"Amazon Message Delivery Service"
"Amazon Elastic Container Registry"
"Amazon Elastic Container Service"
"Amazon Elastic Container Service for Kubernetes"
"Amazon Elastic Inference"
"Amazon ElastiCache"
"AWS Elastic Beanstalk"
"Amazon Elastic File System"
"Elastic Load Balancing"
"Amazon Elastic MapReduce"
"Amazon Elastic Transcoder"
"Elemental Activations"
"AWS Elemental Appliances and Software"
"Amazon Elasticsearch Service"
"Amazon EventBridge"
"Amazon API Gateway"
"Amazon Kinesis Firehose"
"AWS Firewall Manager"
"Amazon Forecast"
"Amazon Fraud Detector"
"Amazon FreeRTOS"
"Amazon FSx"
"Amazon GameLift"
"Amazon Glacier"
"AWS Global Accelerator"
"AWS Glue"
"AWS IoT Greengrass"
"AWS Ground Station"
"Amazon GroundTruth Labeling"
"Amazon GuardDuty"
"AWS Health APIs and Notifications"
"Amazon Honeycode"
"AWS Identity and Access Management"
"AWS Identity Store"
"Amazon EC2 Image Builder"
"AWS Import Export"
"Amazon Inspector"
"AWS IoT"
"AWS IoT Device Tester"
"AWS IoT 1-Click"
"AWS IoT Analytics"
"AWS IoT Events"
"AWS IoT SiteWise"
"AWS IoT Things Graph"
"AWS IQ"
"AWS IQ Permissions"
"Amazon Interactive Video Service"
"Amazon Managed Streaming for Apache Kafka"
"Amazon Kendra"
"Amazon Kinesis"
"Amazon Kinesis Analytics"
"Amazon Kinesis Video Streams"
"AWS Key Management Service"
"AWS Lake Formation"
"AWS Lambda"
"Launch Wizard"
"Amazon Lex"
"AWS License Manager"
"Amazon Lightsail"
"Amazon CloudWatch Logs"
"Amazon Machine Learning"
"Amazon Macie Classic"
"Amazon Macie"
"Amazon Managed Blockchain"
"Amazon Mechanical Turk"
"AWS Elemental MediaConnect"
"AWS Elemental MediaConvert"
"AWS Elemental MediaLive"
"AWS Elemental MediaPackage"
"AWS Elemental MediaPackage VOD"
"AWS Elemental MediaStore"
"AWS Elemental MediaTailor"
"AWS Migration Hub"
"Amazon Mobile Analytics"
"AWS Mobile Hub"
"Amazon Pinpoint"
"Amazon MQ"
"Amazon Neptune"
"Network Manager"
"AWS OpsWorks"
"AWS OpsWorks Configuration Management"
"AWS Organizations"
"AWS Outposts"
"Amazon Personalize"
"AWS Performance Insights"
"Amazon Polly"
"AWS Price List"
"AWS Purchase Orders Console"
"Amazon QLDB"
"Amazon QuickSight"
"AWS Resource Access Manager"
"Amazon RDS"
"Amazon RDS Data API"
"Amazon RDS IAM Authentication"
"Amazon Redshift"
"Amazon Redshift Data API"
"Amazon Rekognition"
"AWS Tag Editor"
"AWS Resource Groups"
"AWS RoboMaker"
"Amazon Route 53"
"Amazon Route53 Domains"
"Amazon Route 53 Resolver"
"Amazon S3"
"Amazon S3 on Outposts"
"Amazon SageMaker"
"AWS Savings Plans"
"Amazon EventBridge Schemas"
"Amazon SimpleDB"
"AWS Secrets Manager"
"AWS Security Hub"
"AWS Serverless Application Repository"
"AWS Service Catalog"
"AWS Cloud Map"
"Service Quotas"
"Amazon SES"
"AWS Shield"
"AWS Code Signing for Amazon FreeRTOS"
"AWS Server Migration Service"
"Amazon Pinpoint SMS and Voice Service"
"AWS Snowball"
"Amazon SNS"
"Amazon SQS"
"AWS Systems Manager"
"Amazon Session Manager Message Gateway Service"
"AWS SSO"
"AWS SSO Directory"
"AWS Step Functions"
"Amazon Storage Gateway"
"AWS Security Token Service"
"Amazon Sumerian"
"AWS Support"
"Amazon Simple Workflow Service"
"Amazon CloudWatch Synthetics"
"Amazon Resource Group Tagging API"
"Amazon Textract"
"AWS Timestream"
"Amazon Transcribe"
"AWS Transfer for SFTP"
"Amazon Translate"
"AWS Trusted Advisor"
"AWS WAF"
"AWS WAF Regional"
"AWS WAF V2"
"Amazon WorkSpaces Application Manager"
"AWS Well-Architected Tool"
"Amazon WorkDocs"
"Amazon WorkLink"
"Amazon WorkMail"
"Amazon WorkMail Message Flow"
"Amazon WorkSpaces"
"AWS X-Ray"

つい先日 GA となった Amazon Timestream も結果に表れてきていますね。

お前は何をやっているんだ

コマンドの内容を説明します。

先にざっくり言うと、以下と同じことを AWS CLI でやっています。

マネジメントコンソールからアクセスアドバイザーを利用して AdministratorAccessがアクセス可能な AWS サービスを確認する、というのとやっていることは同じです。

改行を挟んで見やすくしたものが以下です。

$ aws iam get-service-last-accessed-details \
 --job-id \
    `aws iam generate-service-last-accessed-details \
      --arn arn:aws:iam::aws:policy/AdministratorAccess \
      --output text` \
 --max-items 1000 \
 | jq '.ServicesLastAccessed[].ServiceName'

アクセスアドバイザーにおいては IAM リソースがアクセス可能なサービスを確認できます。対象の IAM リソースがその時点でアクセス可能なサービス、およびそのアクセス履歴の断面を取得したものをジョブと呼びます。

今回は、以下の一連の作業をまとめて行なっています。

  • AWS 管理ポリシーAdministratorAccessに対してジョブを作成
  • 作成したジョブの詳細を確認
  • 出力のうち、サービス名のみフィルタリングして表示

AdministratorAccessはその時点で使用可能な AWS サービス全てに対してアクセス権を持ちますので、このコマンドにより「すべての AWS サービス」が確認できるというわけです。

実は先日ほとんど同じことを試していて、その際は「数が足りないな……」と思っていたのですが、それはジョブの詳細を取得する際のデフォルトのアイテム数が200であったためでした。今回は明示的に--max-items 1000を指定しているため、この数を超えない限りは全量をカバーできます。

名前空間も一緒に確認する

サービス名だけだと物足りないので、名前空間も併記させましょう。jq による処理を一部変更します。

% aws iam get-service-last-accessed-details --job-id `aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text` --max-items 1000 \
  | jq -c '.ServicesLastAccessed[] | [.ServiceName,.ServiceNamespace]'

コマンドの結果は名前空間を基準にアルファベットの昇順で出力されていたことが分かります。

% aws iam get-service-last-accessed-details --job-id `aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text` --max-items 1000   | jq -c '.ServicesLastAccessed[] | [.ServiceName,.ServiceNamespace]'
["Alexa for Business","a4b"]
["IAM Access Analyzer","access-analyzer"]
["AWS Accounts","account"]
["AWS Certificate Manager","acm"]
["AWS Certificate Manager Private Certificate Authority","acm-pca"]
["AWS Amplify","amplify"]
["Manage - Amazon API Gateway","apigateway"]
["AWS AppConfig","appconfig"]
["Amazon AppFlow","appflow"]
["Application Auto Scaling","application-autoscaling"]
["CloudWatch Application Insights","applicationinsights"]
["AWS App Mesh","appmesh"]
["AWS App Mesh Preview","appmesh-preview"]
["Amazon AppStream 2.0","appstream"]
["AWS AppSync","appsync"]
["Application Discovery Arsenal","arsenal"]
["AWS Artifact","artifact"]
["Amazon Athena","athena"]
["Amazon EC2 Auto Scaling","autoscaling"]
["AWS Auto Scaling","autoscaling-plans"]
["AWS Marketplace","aws-marketplace"]
["AWS Marketplace Management Portal","aws-marketplace-management"]
["AWS Billing","aws-portal"]
["AWS Connector Service","awsconnector"]
["AWS Backup","backup"]
["AWS Backup storage","backup-storage"]
["AWS Batch","batch"]
["Amazon Braket","braket"]
["AWS Budget Service","budgets"]
["Amazon Keyspaces (for Apache Cassandra)","cassandra"]
["AWS Cost Explorer Service","ce"]
["AWS Chatbot","chatbot"]
["Amazon Chime","chime"]
["AWS Cloud9","cloud9"]
["Amazon Cloud Directory","clouddirectory"]
["AWS CloudFormation","cloudformation"]
["Amazon CloudFront","cloudfront"]
["AWS CloudHSM","cloudhsm"]
["Amazon CloudSearch","cloudsearch"]
["AWS CloudTrail","cloudtrail"]
["Amazon CloudWatch","cloudwatch"]
["AWS CodeArtifact","codeartifact"]
["AWS CodeBuild","codebuild"]
["AWS CodeCommit","codecommit"]
["AWS CodeDeploy","codedeploy"]
["Amazon CodeGuru","codeguru"]
["Amazon CodeGuru Profiler","codeguru-profiler"]
["Amazon CodeGuru Reviewer","codeguru-reviewer"]
["AWS CodePipeline","codepipeline"]
["AWS CodeStar","codestar"]
["AWS CodeStar Connections","codestar-connections"]
["AWS CodeStar Notifications","codestar-notifications"]
["Amazon Cognito Identity","cognito-identity"]
["Amazon Cognito User Pools","cognito-idp"]
["Amazon Cognito Sync","cognito-sync"]
["Amazon Comprehend","comprehend"]
["Comprehend Medical","comprehendmedical"]
["Compute Optimizer","compute-optimizer"]
["AWS Config","config"]
["Amazon Connect","connect"]
["AWS Cost and Usage Report","cur"]
["AWS Data Exchange","dataexchange"]
["Data Pipeline","datapipeline"]
["DataSync","datasync"]
["Amazon DynamoDB Accelerator (DAX)","dax"]
["Database Query Metadata Service","dbqms"]
["AWS DeepComposer","deepcomposer"]
["AWS DeepLens","deeplens"]
["AWS DeepRacer","deepracer"]
["Amazon Detective","detective"]
["AWS Device Farm","devicefarm"]
["AWS Direct Connect","directconnect"]
["AWS Application Discovery Service","discovery"]
["Amazon Data Lifecycle Manager","dlm"]
["AWS Database Migration Service","dms"]
["AWS Directory Service","ds"]
["Amazon DynamoDB","dynamodb"]
["Amazon Elastic Block Store","ebs"]
["Amazon EC2","ec2"]
["Amazon EC2 Instance Connect","ec2-instance-connect"]
["Amazon Message Delivery Service","ec2messages"]
["Amazon Elastic Container Registry","ecr"]
["Amazon Elastic Container Service","ecs"]
["Amazon Elastic Container Service for Kubernetes","eks"]
["Amazon Elastic Inference","elastic-inference"]
["Amazon ElastiCache","elasticache"]
["AWS Elastic Beanstalk","elasticbeanstalk"]
["Amazon Elastic File System","elasticfilesystem"]
["Elastic Load Balancing","elasticloadbalancing"]
["Amazon Elastic MapReduce","elasticmapreduce"]
["Amazon Elastic Transcoder","elastictranscoder"]
["Elemental Activations","elemental-activations"]
["AWS Elemental Appliances and Software","elemental-appliances-software"]
["Amazon Elasticsearch Service","es"]
["Amazon EventBridge","events"]
["Amazon API Gateway","execute-api"]
["Amazon Kinesis Firehose","firehose"]
["AWS Firewall Manager","fms"]
["Amazon Forecast","forecast"]
["Amazon Fraud Detector","frauddetector"]
["Amazon FreeRTOS","freertos"]
["Amazon FSx","fsx"]
["Amazon GameLift","gamelift"]
["Amazon Glacier","glacier"]
["AWS Global Accelerator","globalaccelerator"]
["AWS Glue","glue"]
["AWS IoT Greengrass","greengrass"]
["AWS Ground Station","groundstation"]
["Amazon GroundTruth Labeling","groundtruthlabeling"]
["Amazon GuardDuty","guardduty"]
["AWS Health APIs and Notifications","health"]
["Amazon Honeycode","honeycode"]
["AWS Identity and Access Management","iam"]
["AWS Identity Store","identitystore"]
["Amazon EC2 Image Builder","imagebuilder"]
["AWS Import Export","importexport"]
["Amazon Inspector","inspector"]
["AWS IoT","iot"]
["AWS IoT Device Tester","iot-device-tester"]
["AWS IoT 1-Click","iot1click"]
["AWS IoT Analytics","iotanalytics"]
["AWS IoT Events","iotevents"]
["AWS IoT SiteWise","iotsitewise"]
["AWS IoT Things Graph","iotthingsgraph"]
["AWS IQ","iq"]
["AWS IQ Permissions","iq-permission"]
["Amazon Interactive Video Service","ivs"]
["Amazon Managed Streaming for Apache Kafka","kafka"]
["Amazon Kendra","kendra"]
["Amazon Kinesis","kinesis"]
["Amazon Kinesis Analytics","kinesisanalytics"]
["Amazon Kinesis Video Streams","kinesisvideo"]
["AWS Key Management Service","kms"]
["AWS Lake Formation","lakeformation"]
["AWS Lambda","lambda"]
["Launch Wizard","launchwizard"]
["Amazon Lex","lex"]
["AWS License Manager","license-manager"]
["Amazon Lightsail","lightsail"]
["Amazon CloudWatch Logs","logs"]
["Amazon Machine Learning","machinelearning"]
["Amazon Macie Classic","macie"]
["Amazon Macie","macie2"]
["Amazon Managed Blockchain","managedblockchain"]
["Amazon Mechanical Turk","mechanicalturk"]
["AWS Elemental MediaConnect","mediaconnect"]
["AWS Elemental MediaConvert","mediaconvert"]
["AWS Elemental MediaLive","medialive"]
["AWS Elemental MediaPackage","mediapackage"]
["AWS Elemental MediaPackage VOD","mediapackage-vod"]
["AWS Elemental MediaStore","mediastore"]
["AWS Elemental MediaTailor","mediatailor"]
["AWS Migration Hub","mgh"]
["Amazon Mobile Analytics","mobileanalytics"]
["AWS Mobile Hub","mobilehub"]
["Amazon Pinpoint","mobiletargeting"]
["Amazon MQ","mq"]
["Amazon Neptune","neptune-db"]
["Network Manager","networkmanager"]
["AWS OpsWorks","opsworks"]
["AWS OpsWorks Configuration Management","opsworks-cm"]
["AWS Organizations","organizations"]
["AWS Outposts","outposts"]
["Amazon Personalize","personalize"]
["AWS Performance Insights","pi"]
["Amazon Polly","polly"]
["AWS Price List","pricing"]
["AWS Purchase Orders Console","purchase-orders"]
["Amazon QLDB","qldb"]
["Amazon QuickSight","quicksight"]
["AWS Resource Access Manager","ram"]
["Amazon RDS","rds"]
["Amazon RDS Data API","rds-data"]
["Amazon RDS IAM Authentication","rds-db"]
["Amazon Redshift","redshift"]
["Amazon Redshift Data API","redshift-data"]
["Amazon Rekognition","rekognition"]
["AWS Tag Editor","resource-explorer"]
["AWS Resource Groups","resource-groups"]
["AWS RoboMaker","robomaker"]
["Amazon Route 53","route53"]
["Amazon Route53 Domains","route53domains"]
["Amazon Route 53 Resolver","route53resolver"]
["Amazon S3","s3"]
["Amazon S3 on Outposts","s3-outposts"]
["Amazon SageMaker","sagemaker"]
["AWS Savings Plans","savingsplans"]
["Amazon EventBridge Schemas","schemas"]
["Amazon SimpleDB","sdb"]
["AWS Secrets Manager","secretsmanager"]
["AWS Security Hub","securityhub"]
["AWS Serverless Application Repository","serverlessrepo"]
["AWS Service Catalog","servicecatalog"]
["AWS Cloud Map","servicediscovery"]
["Service Quotas","servicequotas"]
["Amazon SES","ses"]
["AWS Shield","shield"]
["AWS Code Signing for Amazon FreeRTOS","signer"]
["AWS Server Migration Service","sms"]
["Amazon Pinpoint SMS and Voice Service","sms-voice"]
["AWS Snowball","snowball"]
["Amazon SNS","sns"]
["Amazon SQS","sqs"]
["AWS Systems Manager","ssm"]
["Amazon Session Manager Message Gateway Service","ssmmessages"]
["AWS SSO","sso"]
["AWS SSO Directory","sso-directory"]
["AWS Step Functions","states"]
["Amazon Storage Gateway","storagegateway"]
["AWS Security Token Service","sts"]
["Amazon Sumerian","sumerian"]
["AWS Support","support"]
["Amazon Simple Workflow Service","swf"]
["Amazon CloudWatch Synthetics","synthetics"]
["Amazon Resource Group Tagging API","tag"]
["Amazon Textract","textract"]
["AWS Timestream","timestream"]
["Amazon Transcribe","transcribe"]
["AWS Transfer for SFTP","transfer"]
["Amazon Translate","translate"]
["AWS Trusted Advisor","trustedadvisor"]
["AWS WAF","waf"]
["AWS WAF Regional","waf-regional"]
["AWS WAF V2","wafv2"]
["Amazon WorkSpaces Application Manager","wam"]
["AWS Well-Architected Tool","wellarchitected"]
["Amazon WorkDocs","workdocs"]
["Amazon WorkLink","worklink"]
["Amazon WorkMail","workmail"]
["Amazon WorkMail Message Flow","workmailmessageflow"]
["Amazon WorkSpaces","workspaces"]
["AWS X-Ray","xray"]

2020年10月5日の時点で、232個の「AWS サービス」が存在します。

たまにエラーが発生しない?

ここまで紹介してきたコマンドを実際に試して、うまくいかなかった方がいるかもしれません。

その場合には、以下のようなエラーが発生していたかと思います。

jq: error (at <stdin>:5): Cannot iterate over null (null)

原因は、「ジョブの作成」を行なってからそれが完了するまでに若干のラグが発生することです。

ジョブが読み取れる場合、以下のような結果が返ってきます。これのServicesLastAccessedの中身をフィルタリングしているのが今回のワンライナーです。

{
    "JobStatus": "COMPLETED",
    "JobType": "SERVICE_LEVEL",
    "JobCreationDate": "2020-09-04T13:12:55.537000+00:00",
    "ServicesLastAccessed": [
        {
            "ServiceName": "Alexa for Business",
            "ServiceNamespace": "a4b",
            "TotalAuthenticatedEntities": 0
        },
        {
            "ServiceName": "IAM Access Analyzer",
            "LastAuthenticated": "2020-08-27T13:56:23+00:00",
            "ServiceNamespace": "access-analyzer",
            "LastAuthenticatedEntity": "arn:aws:iam::000000000000:role/cm-chiba.yukihiro",
            "LastAuthenticatedRegion": "ap-northeast-1",
            "TotalAuthenticatedEntities": 1
        },
        {
            "ServiceName": "AWS Accounts",
            "ServiceNamespace": "account",
            "TotalAuthenticatedEntities": 0
        },
---以下略---

ジョブの作成を実行してから間も無い場合、以下のような結果が返ってきます。ServicesLastAccessed部が存在しないため、エラーが発生します。

{
  "JobStatus": "IN_PROGRESS",
  "JobCreationDate": "2020-09-04T02:59:47.132000+00:00",
  "IsTruncated": false
}

それを回避するために作り替えたものが以下です。ひとまず 1 秒スリープするようにしてみました。

i=`aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text` && sleep 1 && aws iam get-service-last-accessed-details --job-id $i --max-items 1000  | jq -c '.ServicesLastAccessed[] | [.ServiceName,.ServiceNamespace]'

大抵の場合ジョブはすぐ完了ステータスに遷移するため、冒頭のコマンドを数回試行すれば結果は返ってくるかと思いますが、失敗が続く場合はスリープを挟むパターンを試してみてください。

追記: PowerShell でのワンライナー

ふじい(大) さんに作成いただいたワンライナーです。

PowerShell 5 と 7 で動作確認いただいています。

(aws iam get-service-last-accessed-details --job-id (aws iam generate-service-last-accessed-details --arn arn:aws:iam::aws:policy/AdministratorAccess --output text) --max-items 1000 | ConvertFrom-Json).ServicesLastAccessed | ForEach-Object { return $_.ServiceName }

Takuya Shibataさんからは AWS Tools for PowerShell を使用したパターンを教えてもらいました。

Import-Module AWS.Tools.IdentityManagementが済んでいる前提で)

Request-IAMServiceLastAccessedDetail -Arn arn:aws:iam::aws:policy/AdministratorAccess |
    Get-IAMServiceLastAccessedDetail -Select ServicesLastAccessed.ServiceName

名前空間も出力したいときはこう。

Request-IAMServiceLastAccessedDetail -Arn arn:aws:iam::aws:policy/AdministratorAccess |
    Get-IAMServiceLastAccessedDetail -Select ServicesLastAccessed |
    Select-Object ServiceName, ServiceNamespace

ありがたや!

終わりに

AWS サービスをすべて出力するワンライナー(ただし名前空間を基準とする)のご紹介でした。

コマンドを叩いて結果が返ってくる、というのはいつ試しても楽しいですよね。とはいえ Amazon VPC を初めとしたいくつかの「サービス」が含まれていなかったり、「これ別物として扱われるのか……」というものがあったりして、これだけで万事OK、という完璧なものではありません。

サービスの一覧を確認したい、というよりは、 IAM の条件キーであったり ARN であったりを確認するために、名前空間の一覧を出力したい、というケースによりマッチしているかと思います。

何かの役に立てば幸いです。

ちなみに私が「 AWS サービス」を確認したいときは、大体以下のあたりを見ます。あわせてチェックしてみてください。

以上、千葉(幸)がお送りしました。