【Route 53】サブドメインを別AWSアカウントに権限委譲し、CloudFront経由でホスティングする【AWS】

## 概要
 - ドメイン所有者ではないアカウントがサブドメインを使用するために、別のホストゾーンにサブドメインの権限を移譲する
 - 権限移譲したサブドメインとCloudFrontを紐付ける
 - CloudFrontからホスティングしたサイトのHTTPS化

## 背景&要件
 - 案件で弊社CloudFrontでホスティングしているサービスを取引先企業の所有しているドメインのサブドメインでもホスティング出来るようにしなければいけないことがありました。

## 前提
アカウントA: ドメイン所有者
アカウントB: サーバー所有者、サブドメイン使用者、CloudFrontでHTTPS公開済み

## 流れ
 1. アカウントB: Route53でサブドメインを含んだホストゾーンを新規作成
 1. アカウントB: 手順1で作成されたホストゾーンからNSレコードをメモする
 1. アカウントB: 企業AにNSレコードの値を渡す
 1. アカウントA: ドメインのホストゾーンにサブドメインのNSレコードを作成、値は手順３で取得したNSレコードの値を入力
 1. サブドメインの名前解決の伝播を待つ
 1. S3 + Cloudfrontの作成
 1. アカウントB: SSL証明書を作成
    1. アカウントB: Route53で手順1で作成したホストゾーンにサブドメインでCloudFrontにアクセス出来るようにAレコードを作成
    1. アカウントB: SSL証明書をサブドメインで作成
    1. アカウントB: SSL証明書の検証用レコード(CNAME)をホストゾーンに追加
    1. SSL証明書の検証を完了を待つ
    1. アカウントB: CloudFrontに代替ドメインを設定
    1. アカウントB: 検証されたSSL証明書(ACMで作成した)をアタッチ
 1. サブドメインがHTTPS化されることを確認

## 手順
## 今回使用するドメイン名
ドメイン名: `snsnap.net`
サブドメイン名: `qiita-sample.snsnap.net`

### アカウントB: サブドメインを含んだホストゾーンの作成
まずは、`Route５３`でサブドメインを含んだホストゾーンを作成します。
![スクリーンショット 2023-03-02 14.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/78bf2c5c-063f-b44f-4ef1-4a2e4cb4fffa.png)

### アカウントB: NSレコードの確認
ホストゾーンを作成すると、NSレコードとSOAレコードが生成されます。

NSレコードの値をアカウントAに渡します。

![スクリーンショット 2023-03-02 14.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/e837a467-a9f9-82f2-9090-38b4c976aa8b.png)


### アカウントA: サブドメインのNSレコードの作成
`snsnap.net`のホストゾーンにサブドメイン`qiita-sample.snsnap.net`を作成します。
レコードタイプをNSレコードに選択し、アカウントBから受け取ったNSレコードの値を入力します。

![スクリーンショット 2023-03-02 14.36.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/adb8396b-ab1c-9861-101d-32b9931daeca.jpeg)

レコードの作成が完了し、しばらくすると、サブドメインの伝播が行われます。

### アカウントB: S3+ Cloudfrontの作成
ホスティングする静的サイトの作成を行います。
今回はメインではないので、割愛します。

### アカウントB: SSL証明書の作成
CloudFrontに代替カスタムドメインを割り当てるにはACMでSSL証明書を作成します。
ここで注意しなければならないことは、SSL証明書を作成するリージョンは`バージニア北部:us-east-1`でなければいけないことです。
CloudFrontにカスタムSSL証明書をアタッチする際は、バージニア北部を選択しないといけません。
詳しくは[こちら](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html)を参照ください。

`バージニア北部`を選択し、ACMからSSL証明書のリクエストを行います。
![スクリーンショット 2023-03-02 14.58.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/30b2467b-5f48-aaab-e6b5-a656055036c6.png)



### アカウントB: SSL証明書の検証用レコード(CNAME)をホストゾーンに追加
リクエストが完了すると、証明書一覧に証明書が追加されますが、検証(使用可能な状態)が完了していないので、検証を行うために、CNAMEを追加します。

![スクリーンショット 2023-03-02 14.59.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/73a00875-e7b3-d78d-d2f5-2ef90f77cc67.jpeg)

上記画像の`Route53でレコードを作成`を選択し、CNAMEのレコードを作成します。
しばらくすると検証が完了し、SSL証明書が使用出来るようになります。


### アカウントB: サブドメインのAレコードを作成
サブドメインからのアクセスをCloudFrontのURLに名前解決が出来るように、Aレコードを追加します。
`Route53`から`qiita-sample.snsnap.net`を選択し、レコードを作成します。

エイリアスを選択し、CloudFrontのディストリビューションを選択します。
![スクリーンショット 2023-03-02 15.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/98d34739-8cf7-63b2-baaf-b2151468c487.png)

### アカウントB: 代替ドメインの設定とSSL証明書のアタッチ
作成済みの`CloudFront`のディストリビューションを編集します。
代替ドメイン名と検証済みのSSL証明書を選択し、更新します。

![スクリーンショット 2023-03-02 15.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/98d7e9a5-029c-a333-5959-1c5d649bd94c.png)



### 接続確認
これで、サブドメインでサイトにアクセスすることが出来るようになりました！

![スクリーンショット 2023-03-02 14.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/83bfb84b-1b3f-15e5-a255-563ce90cf5c1.png)
(弊社サービスの紹介する静的ページを使用しました。)


### まとめ
以上が、サブドメインを別AWSアカウントに権限移譲しCloudFrontでホスティングする方法でした。
頻繁に起こることはあまりないと思いますが、自分の場合はDNSの理解が足りておらず、実際にやってみるまでサブドメインをどのように委譲すればいいのか分かりませんでした。
参考になれば幸いです。