ARN情報とリソースURLの紐づけ

# そもそもの要件（なぜやりたいのか）

AWS Security HubやTrusted Advisorのダッシュボードは多数のサービスと統合しており、これらのサービスに対応するリソースへの直接リンクが提供されています。これはサービスにより異なりますが、Security HubやTrusted Advisorから直接AWS Management Consoleの該当ページにアクセスできるときには非常に便利です。

その一方で、AWS Security HubやTrusted Advisorの情報からリソースへの直接リンクがないものも沢山ありました。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521205/e886e1f3-48b8-6da4-ce33-bca1bcb7a6bb.png)



CLIやSDKで取得しても良いのですが、「やっぱりコンソールから見れたほうがいいかも」という要件があったので、少し確認してみました。

# AWS Security Hubについて
AWS環境全体のセキュリティとコンプライアンス状態を網羅的に確認できるサービスです。多くのAWSサービスと統合しており、その中でARN(Amazon Resource Name)情報を提供しています。ARNはAWSリソースを一意に識別するための情報ですが、Security Hubでは、リソースへの直接リンクは提供されていないケースが多いようです。

■2023年7月現在では、以下のようなサービスリソースに直接リンクを提供しているようです：

・AWS IAM
・Amazon EC2インスタンス
・Amazon S3バケット
・AWS CloudTrail
・Amazon セキュリティグループ

※AWS Security Hubから「リソースの詳細」選択でリンクがあります
※Trusted Advisor内のSecurity Hubチェックではリンクはありません
※他にもあれば追記していきます

# Trusted Advisorついて
ベストプラクティスに基づいてAWS環境をスキャンし、パフォーマンス、セキュリティ、料金最適化に関する具体的なアドバイスを提供します。Trusted Advisorでは、そのアドバイスと一緒に、対象のリソースへの直接リンクも提供していますが、こちらも提供されていないケースが多いようです。

■2023年7月現在では、以下のようなサービスリソースに直接リンクを提供しているようです：

・AWS IAM
・Amazon EC2インスタンス
・Amazon S3バケット
・AWS CloudTrail
・Amazon セキュリティグループ
・Amazon RDSデータベースインスタンス
・AWS Lambda 関数
・Route 53ホストゾーン
・CloudFrontディストリビューション
・Amazon EBSボリューム
・Auto Scaling グループ
・Amazon VPC
・Amazon ECSクラスター/ECS サービス
・Amazon EFSファイルシステム

※Security HubよりTrusted Advisorのほうがリソースへのリンクが多い状況のようです
※他にもあれば追記していきます


# Security HubやTrusted Advisorで識別されたリソースのURLを取得するためには、どうすればよい？
ARN情報から直接リンクを作成することを検討してみます。

以下に、その手順を説明します。

1. Security HubやTrusted AdvisorからARN情報を取得します。
この情報は、各警告や見つかった問題の詳細部分に含まれています。

2. 取得したARN情報を分解します。
ARNは、基本的に以下の構成要素からなります。
`arn:partition:service:region:account-id:（もしくは/）resource-id`
※各部分は、それぞれリソースの所在地やアカウントID、リソースIDなどを示します

3. これらの情報を元に、AWS Management ConsoleのURLを構築します。
たとえば、特定のEC2インスタンスへのリンクは、以下のような形式になります`https://console.aws.amazon.com/ec2/v2/home?region=<region>#Instances:search=<instance-id>;sort=instanceId`
※`<region>`と`<instance-id>`には、それぞれ2.で取得したリソースのリージョンとIDを指定します

この方法を使えば、Security Hub/Trusted Advisorで得られたARN情報をもとに、対象のリソースへ直接アクセスするリンクを作成することができます。ただし、この方法はすべてのAWSリソースに対して通用するわけではなく、各リソースタイプによってURLの形式が異なる可能性があるため、注意が必要です。

下記の表に、それぞれのリソースタイプに関するARN情報と、URL形式内でそのARNから抽出した情報がどの位置に該当するかを記載します。

<details><summary>EC2 インスタンス</summary><div>

#### ARN形式
`arn:aws:ec2:<region>:<account-id>:instance/<instance-id>`
#### URL形式
`https://console.aws.amazon.com/ec2/home?region=<region>#InstanceDetails:instanceId=<instance-id>`
#### ARN項目のURLでの位置
`<region>: リージョン, <instance-id>: インスタンスID`

</div></details>

| AWSリソースタイプ | ARN形式 | URL形式 | ARN項目のURLでの位置 |
|---|---|---|---|
| EC2 インスタンス | `arn:aws:ec2:<region>:<account-id>:instance/<instance-id>` | `https://console.aws.amazon.com/ec2/home?region=<region>#InstanceDetails:instanceId=<instance-id>` | `<region>`: リージョン, `<instance-id>`: インスタンスID |
| S3 バケット | `arn:aws:s3:::<bucket-name>` | `https://s3.console.aws.amazon.com/s3/buckets/<bucket-name>?region=<region>&tab=overview` | `<region>`: リージョン ,`<bucket-name>`: バケット名 |
| Lambda 関数 | `arn:aws:lambda:<region>:<account-id>:function:<function-name>` | `https://console.aws.amazon.com/lambda/home?region=<region>#/functions/<function-name>?tab=configuration` | `<region>`: リージョン, `<function-name>`: 関数名 |
| DynamoDB テーブル | `arn:aws:dynamodb:<region>:<account-id>:table/<table-name>` | `https://console.aws.amazon.com/dynamodb/home?region=<region>#table?name=<table-name>` | `<region>`: リージョン, `<table-name>`: テーブル名 |
| RDS インスタンス | `arn:aws:rds:<region>:<account-id>:db:<db-instance-id>` | `https://console.aws.amazon.com/rds/home?region=<region>#database:id=<db-instance-id>;is-cluster=false` | `<region>`: リージョン, `<db-instance-id>`: DBインスタンスID |
| VPC | `arn:aws:ec2:<region>:<account-id>:vpc/<vpc-id>` | `https://console.aws.amazon.com/vpc/home?region=<region>#VpcDetails:VpcId=<vpc-id>` | `<region>`: リージョン, `<vpc-id>`: VPC ID |
| SQS キュー | `arn:aws:sqs:<region>:<account-id>:<queue-name>` | `https://console.aws.amazon.com/sqs/home?region=ap-northeast-1#/queues/https%3A%2F%2Fsqs.<region>.amazonaws.com%2F<account-id>%2F<queue-name>` | `<region>`: リージョン, `<queue-name>`: キュー名 |
| SNS トピック | `arn:aws:sns:<region>:<account-id>:<topic-name>` | `https://console.aws.amazon.com/sns/v3/home?region=<region>#/topic/arn:aws:sns:<region>:<account-id>:<topic-name>` | `<region>`: リージョン, `<account-id>`: アカウントID, `<topic-name>`: トピック名 |
| CloudWatch ロググループ | `arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>` | `https://console.aws.amazon.com/cloudwatch/home?region=<region>#logsV2:log-groups/log-group/<log-group-name>` | `<region>`: リージョン, `<log-group-name>`: ロググループ名 <br>※URLエンコードx2 が必要|
| CloudFront ディストリビューション| `arn:aws:cloudfront::<account-id>:distribution/<distribution-id>`	| `https://console.aws.amazon.com/cloudfront/home?region=<region>#distributions/<distribution-id>`	|`<region>`:リージョン, `<distribution-id>`:ディストリビューションID |
| Route 53ホストゾーン | `arn:aws:route53:::hostedzone/<hosted-zone-id>` | `https://console.aws.amazon.com/route53/v2/hostedzones#ListRecordSets/<hosted-zone-id>` |`<region>`:リージョン, `<hosted-zone-id>`:ホストゾーンID |
| Application Load Balancer | `arn:aws:elasticloadbalancing:<region>:<account-id>:loadbalancer/app/<load-balancer-name>/<load-balancer-id>` | `https://console.aws.amazon.com/ec2/v2/home?region=<region>#LoadBalancers:search=<load-balancer-name>` |`<region>`:リージョン, `<load-balancer-name>`:ロードバランサ名 <br>※直接指定の場合はARN名が必要|
| IAM ユーザ | `arn:aws:iam::<account-id>:user/<username>` | `https://console.aws.amazon.com/iamv2/home#/users/details/<username>` |`<region>`:リージョン, `<username>`: ユーザ名 |
| IAM グループ | `arn:aws:iam::<account-id>:group/<group-name>` | `https://console.aws.amazon.com/iamv2/home#/groups/details/<group-name>` |`<region>`:リージョン, `<group-name>`:グループ名 |
| IAM ロール | `arn:aws:iam::<account-id>:role/<role-name>` | `https://console.aws.amazon.com/iamv2/home#/roles/details/<role-name>` |`<region>`:リージョン, `<role-name>`:ロール名 |
| IAM ポリシー | `arn:aws:iam::<account-id>:policy/<policy-name>` | `https://console.aws.amazon.com/iam/home?region=<region>#/policies/<policy-arn>` |`<region>`:リージョン, `<policy-arn>`:ポリシーARN <br>※ポリシー指定はarn記載が必要 |
| ECSクラスター | `arn:aws:ecs:<region>:<account-id>:cluster/<cluster-name>` | `https://console.aws.amazon.com/ecs/home?region=<region>#/clusters/<cluster-name>/services` | `<region>`:リージョン, `<cluster-name>`:クラスター名 |
| ECSタスク定義 | `arn:aws:ecs:<region>:<account-id>:task-definition/<task-definition>` | `https://console.aws.amazon.com/ecs/home?region=<region>#/taskDefinitions/<task-definition>` | `<region>`:リージョン, `<task-definition>`:タスク定義 |
| ECSサービス | `arn:aws:ecs:<region>:<account-id>:service/<cluster-name>/<service-name>` | `https://console.aws.amazon.com/ecs/home?region=<region>#/clusters/<cluster-name>/services/<service-name>/details` | `<region>`:リージョン, `<cluster-name>`:クラスター名, `<service-name>`:サービス名 |
| ECRプライベートリポジトリ | `arn:aws:ecr:<region>:<account-id>:repository/<repository-name>` | `https://console.aws.amazon.com/ecr/repositories/private/<account-id>/<repository-name>?region=<region>` | `<region>`:リージョン, `<account-id>`:アカウントID, `<repository-name>`:リポジトリ名 |
| SQSキュー | `arn:aws:sqs:<region>:<account-id>:<queue-name>` | `https://console.aws.amazon.com/sqs/v2/home?region=<region>#/queues/https%3A%2F%2Fsqs.<region>.amazonaws.com%2F<account-id>%2F<queue-name>` |`<region>`:リージョン, `<account-id>`: アカウントID, `<queue-name>`:キュー名 |
| DynamoDBテーブル | `arn:aws:dynamodb:<region>:<account-id>:table/<table-name>` | `https://console.aws.amazon.com/dynamodb/home?region=<region>#table?name=<table-name>` | `<region>`:リージョン, `<table-name>`:テーブル名 |
| EKSクラスター | `arn:aws:eks:<region>:<account-id>:cluster/<cluster-name>` | `https://console.aws.amazon.com/eks/home?region=<region>#/clusters/<cluster-name>` | `<region>`:リージョン, `<cluster-name>`:クラスター名 |
| API | `arn:aws:execute-api:<region>:<account-id>:<api-id>` | `https://console.aws.amazon.com/apigateway/home?region=<region>#/apis/<api-id>/resources/` | `<region>`:リージョン, `<api-id>`:APIのID |
| セキュリティグループ | `arn:aws:ec2:<region>:<account-id>:security-group/<security-group-id>` | `https://console.aws.amazon.com/ec2/v2/home?region=<region>#SecurityGroup:groupId=<security-group-id>` | `<region>`:リージョン, `<security-group-id>`:セキュリティグループID |
| ネットワークACL | `arn:aws:ec2:<region>:<account-id>:network-acl/<network-acl-id>` | `https://console.aws.amazon.com/vpc/home?region=<region>#NetworkAclDetails:networkAclId=<network-acl-id>` | `<region>`:リージョン, `<network-acl-id>`:ネットワークACL ID |


## 注意
- ARNの構造は一般的には `arn:partition:service:region:account-id:resource-type/resource-id` となりますが、リソースタイプやサービスによってはこれが異なる場合があります。また、URLに必要な情報がARNから直接取得できない場合もあるため、特定のサービスやリソースタイプについては、AWS公式ドキュメンテーションを参照することをお勧めします。
- ARNの`account-id`はログインアカウントとなるため、基本的にURL形式には含まれません(必要なリソースもありるようです)。事前のログインが必要です。
- `<region>`、`<instance-id>`、`<bucket-name>`、`<function-name>`、`<table-name>`、`<db-instance-id>`、`<vpc-id>`など、適切な情報に置き換えが必要です。
- この方法では、ARNから直接リンクを生成するため、リンクが常に最新であることを保証するものではありません。リソースが削除されたり、リージョンが変更されたりすると、リンクは無効になります。
- この情報は2023年7月時点のものであり、AWSの更新により変更される可能性があります。
---

いかがだったでしょうか。

ARN情報からリソースへの直接リンクを生成することで、利用ユーザが直接リソースにアクセスできると便利かもしれません。
他にもっと良いやり方をご存じの方がいらっしゃいましたら、是非教えてくださいm(__)m