VMware Cloud on AWSとAWSアカウントをリンクする際に何が起きるかを徹底解説してみる

# はじめに
<!-- 発端や概要を記載 -->
VMware Cloud on AWS (VMC) の Software Defined Data Center (SDDC) を作成する際に AWS アカウントとリンクするステップがあります。[以前の記事](https://qiita.com/mtoyoda/items/99c9b5af4392fdc3c170)で Elastic Network Interface (ENI) 経由での接続の詳細について記載しましたが、今回はその前段階の AWS アカウントとリンクする際に実際に何が行われているかを、実際の環境を見ながら確認していきたいと思います。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [VMware Cloud on AWS のアカウント構造](#vmware-cloud-on-awsのアカウント構造)
1. [顧客所有の AWS アカウントとのリンク](#顧客所有のawsアカウントとのリンク)
1. [CloudFormation の実行](#cloudformationの実行)
1. [CloudFormation の実行で何が作成されるのか？](#cloudformationの実行で何が作成されるのか)
    1. [IAM ロール](#iamロール)
    1. [Lambda](#lambda)
1. [まとめ](#まとめ)
1. [参考文献](#参考文献)
1. [関連記事](#関連記事)

<!-- 各チャプター -->
# VMware Cloud on AWSのアカウント構造

VMC では大きく分けて 2つの AWS アカウントが利用されます。まず 1つ目は VMC の SDDC が稼働する為の AWS アカウントです。VMC は AWS 上でデプロイされますので、もちろんそのリソース（例えば EC2 ベアメタルインスタンス）用の AWS アカウントが存在しますが、これは VMware が所有し、運用を行います。VMware が管理を行う為、VMC を利用するユーザーは、この AWS アカウントのマネジメントコンソールへはアクセスできません。

2つ目のアカウントは、顧客（ユーザー）が所有する AWS アカウントです。ユーザーが所有、運用を行い、もしそのアカウント内でAWSサービスを利用した場合の費用の支払いを行います。このアカウントは通常 AWS を利用する場合も全く同じものになります。

2つのアカウントをまとめると以下の表、図のようになります！

| VMware Cloud on AWS SDDC アカウント | 顧客所有の AWS アカウント |
| --- | --- |
| SDDC リソースを実行するための専用の AWS アカウント <br> VMware による所有、運用、支払い | AWS のサービスへのアクセス <br> 顧客による所有、運用、支払い |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/21efeff7-693a-e17c-43fb-b75af04c9879.png)

1つ目の SDDC アカウントについては、ユーザーがアクセスする事はないので、VMC を利用するにあたって特に意識をする必要はありません。必要な操作は VMC コンソールを通じて行います。


# 顧客所有のAWSアカウントとのリンク
SDDC を作成する際に以下のように AWS アカウントとリンクをさせるステップがあります。

初めて使用する Org の場合、Org に紐づけられた AWS アカウントがまだない為、「AWS アカウントの選択」が**新しい AWS アカウントに接続**という表示になっており、**CLOUDFORMATION テンプレートを使用して、AWS コンソールを開く**ボタンが表示されます。
アカウントのリンクの為にこのボタンをクリックして次のステップに進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/52cb59bd-a878-be69-87bf-65c850dca6c8.png)

:::note info
尚、検証用途で利用可能なシングルホスト（1ホスト） SDDC の場合、14日間このアカウントのリンクをスキップする事ができます。
シングルホストの場合は以下のように**今はスキップ**が選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/7d087ece-babb-a4ae-7236-4f6884a5a0de.png)
:::

# CloudFormationの実行
先ほどの**CLOUDFORMATION テンプレートを使用して、AWS コンソールを開く**ボタンをクリックすると AWS のマネジメントコンソールへのサインイン画面が表示されますので、リンクさせたい AWS アカウントにてサインインを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/1bed84ce-e9d3-494b-86be-f0854b2ec58f.png)

サインインをすると CloudFormation の作成の画面が表示されます。
IAM ロールの作成の承認のチェックボックスにチェックを入れ、それ以外は変更せずに**スタックの作成**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/0e44bf99-3bc4-8a9b-7e99-64b26ed100c5.png)

:::note warn
CloudFormation の展開先としてオレゴンリージョンが選択されています。特に要件がない場合、オレゴンリージョンのままにしておきましょう。SDDC を作成するリージョンに関係なく、オレゴンリージョンで実行して問題ありません。

> VMware Cloud on AWS CloudFormation テンプレート (CFT) は、AWS US West（オレゴン）リージョンで実行されます。必要な権限はすべてのリージョンで有効であるため、生成された SDDC の作成場所は影響を受けませんが、CFT を実行する AWS アカウントからオレゴン リージョンへのアクセスが AWS サービス コントロール ポリシー (SCP) によって制限されないようにする必要があります。CFT がロードされたら、必要に応じて編集し、リージョンを変更することができます。CFT は任意のリージョンで実行できますが、実行された場所を記録した内部ドキュメントを保持する必要があります。オレゴン リージョンにアクセスできるメンバーが組織にいない場合は、[CloudFormation テンプレートを使用して、AWS コンソールを開く] をクリックしたときに指定したリンクから CFT をダウンロードすることができます。また、VMC 組織への AWS アカウントのリンクは 1 回のみ行われるため、実行する AWS 管理者にこのリンクを送信することもできます。
> *From [VMware Cloud on AWS ドキュメント](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-operations/GUID-DE8E80A3-5EED-474C-AECD-D30534926615.html?hWord=N4IghgNiBcIWBbARgEzCAvkA)*
:::

CloudFormation の実行が完了し、VMC コンソールに戻ると「接続が正常に確立されました。」と表示され、次のステップに進む事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/eaca39cc-e172-6820-f4fa-6dd37a1686e6.png)

そして AWS アカウントとの接続が確立されると、その AWS アカウントの VPC、サブネット情報が取得できるようになるので、以下のように VPC、サブネットの指定をドロップダウンからできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/da5e9318-2eaf-23aa-3330-f775fc54d652.png)

::: note
ちなみに一度 CloudFormation にて、その AWS アカウントをリンクさせれば、次回の SDDC 作成以降は CloudFormation を実施する必要はありません。以下のようにドロップダウンから選択できるようになります。新しい AWS アカウントをリンクさせたい場合のみ、「新しい AWS アカウントに接続」を選択し、CloudFormation スタックの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/3db6ddbd-0be6-0e91-bb84-a774b0320580.png)
:::

# CloudFormationの実行で何が作成されるのか？

実行された CloudFormation のスタックのリソースを見ると 4つの Identity and Access Management (IAM) ロールと 1つの Lambda 関数が作成されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/932cb8f8-0f73-8220-b9ff-58eac0057066.png)

## IAMロール

以下 4つの IAM ロールが作成されます。
1. **RemoteRole**
1. **RemoteRolePlayer**
1. **RemoteRoleService**
1. **BasicLambdaRole**

3つのRemoteRole〜 のIAM ロールは **AmazonVPCCrossAccountNetworkInterfaceOperations** という AWS 管理のポリシーがアタッチされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/f2b24376-0f73-e7da-0cde-31ebb297a050.png)

ポリシーの詳細は以下の通りとなっています。
```json:AmazonVPCCrossAccountNetworkInterfaceOperations
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeRouteTables",
                "ec2:CreateRoute",
                "ec2:DeleteRoute",
                "ec2:ReplaceRoute"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeNetworkInterfaces",
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DescribeNetworkInterfacePermissions",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:DescribeNetworkInterfaceAttribute",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeRegions",
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AssignPrivateIpAddresses",
                "ec2:UnassignPrivateIpAddresses"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

3つのロールはそれぞれ別の AWS アカウントが信頼されたエンティティとして指定されています。このロールが作成されている為、SDDC 作成時に AWS アカウントをリンク後、そのアカウントが持っている VPC やサブネットの情報が見れるようになるんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/dc296916-f8e1-31ec-876d-878ef37b8f4a.png)

4つ目の BasicLambdaRole ロールは Lambda の実行ロールです。
2つのインラインポリシーが付与されていました。CloudWatch Logs への書き込みや、VPC の情報の取得の許可が含まれています。
```json:ExecRolePolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        }
    ]
}
```
```json:root
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ec2:DescribeVpcs",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSubnets"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

## Lambda

CloudFormation スタックにて作成された Lambda 関数はインベント通知用として利用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/2ccf0019-2a3a-ffe7-4d7a-c7f0d9b05826.png)
この Lambda 関数に先ほどの BasicLambdaRole ロールがアタッチされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441095/26f59704-e584-0187-65eb-15fb6c9b1281.png)


# まとめ
今回は SDDC を作成する際の AWS アカウントとリンクする際に実際に何が行われているかを、実際の環境を見ながら解説をしてみました。普段は CloudFormation のスタックをただ実行するだけで裏でどういった処理がされているか意識する事なく利用できる為、あまり気にしない部分かもしれませんが、詳細を知ることで、どう VMC と　AWS サービスが連携されるかより詳細を理解できるようになるかと思います！
SDDC 作成の次のステップとして、指定したVPC・サブネット・ルートテーブルに何が追加されるのかは[別記事](https://qiita.com/mtoyoda/items/99c9b5af4392fdc3c170)でまとめておりますので、そちらも是非参照下さい。


# 参考文献
- [AWS ブログ: VMware Cloud on AWSのアカウントとVPCに関する考慮事項](https://aws.amazon.com/jp/blogs/news/account-and-vpc-considerations-for-vmware-cloud-on-aws/)
- [アカウントのリンクと VMware Cloud on AWS CloudFormation テンプレート](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-operations/GUID-DE8E80A3-5EED-474C-AECD-D30534926615.html)

# 関連記事
https://qiita.com/mtoyoda/items/99c9b5af4392fdc3c170