AWS Resource Access Manager について

# AWS Resource Access Managerとは

AWS Resource Access Manager(以下 RAM)とは、AWS の異なるアカウント間でリソースの共有が行えるサービスです。複数アカウントを運用している場合、RAM を使用することで容易にリソースの共有を行うことができます。

以下公式説明文

> AWS Resource Access Manager (RAM) は、組織内の AWS アカウント間または AWS Organizations 内の組織単位 (OU) 間で、ならびにサポートされているリソースタイプの IAM ロールおよび IAM ユーザーとの間で、リソースを安全に共有するのに役立ちます。AWS RAM を使用して、トランジットゲートウェイ、サブネット、AWS License Manager ライセンス設定、Amazon Route 53 Resolver ルール、およびその他のリソースタイプを共有できます。

> 多くの組織では、管理や請求の分離を行い、エラーの影響を制限するために複数のアカウントを使用しています。AWS RAM を使用すると、複数の AWS アカウントで重複するリソースを作成する必要はありません。これにより、所有するすべてのアカウントのリソースを管理するための運用上のオーバーヘッドが削減されます。代わりに、マルチアカウント環境では、リソースを 1 回作成し、AWS RAM を使用して、リソース共有を作成することでアカウント間でそのリソースを共有できます。リソース共有を作成するときは、共有するリソースを選択し、リソースタイプごとに AWS RAM マネージド許可を選択し、リソースにアクセスできるユーザーを指定します。AWS RAM は追加料金なしでご利用いただけます。

https://aws.amazon.com/jp/ram/

共有可能なリソースタイプは現時点で以下の通りです。

- AWS App Mesh
- Amazon Aurora
- AWS Certificate Manager Private Certificate Authority
- AWS CodeBuild
- Amazon EC2
- EC2 Image Builder
- AWS Glue
- AWS License Manager
- AWS Network Firewall
- AWS Outposts
- AWS Resource Groups
- Amazon Route 53
- AWS Systems Manager Incident Manager
- Amazon VPC

https://docs.aws.amazon.com/ram/latest/userguide/shareable.html

ユースケースとしては、1アカウントでリソースを見られるようにすることによって複数アカウントのリソースを一元管理したいという場合が考えられます。また、Auroraでは[集中管理 DB クラスターのクローンを作成できる][link-1]など、いくつかのリソースタイプではアカウント間に渡った操作を行えます。

[link-1]:https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Clone.html#Aurora.Managing.Clone.Cross-Account

## やってみる
AccountAにあるリソースをAccountBへ共有したいと思います。

1. AccountAで共有するリソースの立ち上げ
    - AccountAでAuroraを立ち上げます。
    - コンソールから作成しました。

1. AWS Resource Access Managerのコンソールにアクセスし、リソースの共有を作成
    - リソース：Aurora クラスターを選択
    - 対象のDB識別子を選択
    ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/d4d1a01e-b979-943b-6c6f-921f4884f3e4.png)
    - アクセス許可は変更できなさそうなのでそのまま
    - アクション：rds:RestoreDbClusterToPointInTime,rdsDescribeDbClusters
    ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/bc982dc6-bb7c-7b2a-c5cd-fc3cb5d6d624.png)
    - 共有先(AccountB)の情報を入力
    - 今回はAWSアカウントを指定して連携しました。
    ![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/e0b24703-fdcc-f5a4-ba79-8a09572d4d28.png)

1. AccountBで招待を許可し、RDSが見られるか確認
    - 招待が来ているので許可を行う
    ![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/4b139d3c-a5eb-122d-f686-7422e0e70730.png)
    - RDSのコンソールにアクセスすると、DBを確認することができる
    ![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/82175f98-e5d8-3533-0fd0-a46bd722623a.png)


# 最近の発表(6/15の発表)について
最近、RAMについて以下のアップデートが発表されました。

> 今回のリリースでは、共有リソースにアクセスできるユーザーをより柔軟に定義できるようにもなりました。組織全体または AWS Organizations の OU、および任意の AWS アカウントとリソースを共有することに加えて、サポートされているリソースタイプの IAM ロールおよび IAM ユーザーとリソースを共有できるようにもなりました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/06/aws-resource-access-manager-enables-granular-access-control-additional-managed-permissions/

これにより、アカウント単位ではなくユーザ単位・ロール単位でアクセス権限を指定することができるようになったようなので試してみます。
アカウント内のこのユーザだけにアクセスさせたいといった場合に有効だと思われます。

尚、ユーザ単位・ロール単位がサポートされているサービスは以下です。

- AWS App Mesh 
- AWS Certificate Manager Private Certificate Authority
- AWS CodeBuild
- Amazon EC2 Image Builder
- AWS Network Firewall
- Amazon Route 53
    - route53resolver:FirewallRuleGroup
    - route53resolver:ResolverQueryLogConfig
- AWS Systems Manager Incident Manager

## 確認してみる
ユーザ単位でのアクセス制限を試してみます。
共有アカウント先に2つのユーザを作成しそれぞれで確認してみます。

- test_1 AdminAccess
- test_2 AdminAccess

1. CodeBuildプロジェクトを共有
    ![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/6b8a60b0-0fe6-a4ad-2121-55c5169f58fe.png)


2. test_1のみにアクセス権限を付与
    - プリンシパルで「IAM ユーザ」を指定し、ARNを記載します。
    ![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/40accec5-205b-ec14-cecf-7706e57c6677.png)

3. test_1にログインし、閲覧
    - RAMのページから招待を許可します。
    ![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/b2a54597-0a7b-46c4-b4b9-547182921db8.png)
    - CodeBuildにアクセスし、プロジェクトを閲覧します。
    - ビルドプロジェクトから「共有のプロジェクト」を選択すると表示されます。
    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/2304a63d-e308-ba41-4c2d-c89bfc4289e0.png)

4. test_2にログインし、閲覧
    - 3と同様にCodeBuildにアクセスし、プロジェクトを閲覧します。
    - 閲覧権限がなく、アクセスができないことを確認します。
    ![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/7d881fe4-563d-3301-956e-d52077dbedb8.png)

# まとめ
別アカウントと簡単にリソースを共有することができました。
ですが、すべてのアクションが行えるわけではなく、共有するリソースごとにできるアクションが異なっているのでやりたいことができるのかどうかは事前に確認する必要があるかなと思います。