新卒のIT未経験がRDSをPrivateLinkでつなげる際につまずいたこと

## 概要
こんにちは。今年度新卒でIT業界に入ったものです。

今回はタイトルの通り、AWSのRDSをPrivateLink経由で接続する際に私が遭遇した課題とその解決策を共有します。
この記事は、AWS初学者がつまずきやすいポイントを示すとともに、これからAWSを始める方々の助けになることを目指しています。

## 目次
- 全体像
- RDSをNLBのターゲットに登録できない
- NLBのヘルスチェックが正常にならない
- 作成したRDSを他のVPCリソースから呼び出せない
- 最後に

## 全体像
今回作成したアーキテクチャの全体像は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/820f60a4-bd38-b0a2-4f8e-295ab0c10a21.png)


<br>
目的は、RDSをVPC内に作成し、別のVPCとPrivateLinkで接続することで、異なるVPCからRDSにセキュアにアクセスすることです。

:::note info
今回の場合、別のVPCとはHULFT SquareというAWS上で動作するクラウドデータ連携基盤のVPCのことです。
HULFT Squareには「コネクション」という機能があり、コネクションで自身が作ったRDSとの接続検証ができれば成功としました。
:::

<br>
実際に行った作業内容は以下の通りです。

VPCを作る
→サブネットを作る
　→DBサブネットグループを作る
　　→RDSのセキュリティグループを作る
　　　→ターゲットとなるRDSを作る
　　　　→ターゲットグループを作る
　　　　　→NLBのセキュリティグループを作る
　　　　　　→NLBを作る
　　　　　　　→自身のAWS側でVPCエンドポイントサービスを作る
　　　　　　　　→HSQでVPCエンドポイントを作る
　　　　　　　　　→HSQでコネクションを作る

<br>
以下、これらの作業中につまずいたポイントとその解決策を説明していきます。

## 作成したRDSをNLBのターゲットに登録できない

まずぶち当たった壁がこれです。

作成したRDSとNLBをつなげるべく、NLBで指定したターゲットグループにRDSを登録しようとしたところ、「Target is in an Availability Zone that is not enabled for the load balancer」というエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/3d718c8f-3e2f-abc4-49ad-6a7457479b4e.png)


### 原因 RDSが作成されているAZと異なるAZにNLBを作ってしまった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/b02935ce-1d53-cdbb-3f55-880e89d75ff6.png)

エラーメッセージが示す通り、RDSが作成されているAvailability Zone (AZ)と異なるAZにNLBを作成してしまったことが原因です。

NLBでターゲットを指定する際は、原則として同じリージョンの同じAZ内にある必要があります。

:::note info
NLBの設定画面の「属性」から「クロスゾーン負荷分散」を有効にすることで、異なるAZのリソースをターゲットにすることが可能です。ただし、この設定には追加料金が発生する場合があります。
:::

RDSを作成する際、「単一のDBインスタンス」を選ぶと、アベイラビリティゾーンを選択するオプションが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/29a1ee5c-3a61-770b-b062-606c428dd0dd.png)

![{202AC692-EBEA-43EB-B149-F4FEB3CF139B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/b047ba21-c02a-3150-0dcd-10ea02ae1594.png)

ここで、アベイラビリティゾーンを「指定なし」または「NLBと異なるAZ」に設定してしまったことが原因と考えられます。

**RDSを単一のAZに作成し、クロスゾーン負荷分散を使用しない場合、作成するNLBはRDSと同じAZを選択する必要があります。**

<br>
また、他のVPCとPrivateLinkを使用する際にも、VPCエンドポイントとNLBは同じAZに存在する必要があります。

![{B6176768-7E15-4EC8-BEEC-C5608F25566C}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/2a998c89-85e6-628c-a87c-808c0c21630c.png)


## NLBのヘルスチェックが正常にならない

次に直面した問題は、RDSを作成し、ターゲットグループのターゲットとしてRDSを指定し、NLBでそのターゲットグループを選択しても、NLBのヘルスチェックが正常（Healthy）にならないことでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/20323a6e-e1f1-a8ad-3fa3-41d640199ce3.png)

### 原因　セキュリティグループが適切に設定されてない

根本的な原因は、セキュリティグループの設定にありました。

セキュリティグループでは、タイプ、プロトコル、ポート範囲、ソースを指定することで特定の通信を許可します。

↓RDSのセキュリティグループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/cb1c47ca-4981-c039-c0ac-44c37527159d.png)

ソースについては、許可したいリソースのIPv4アドレスやセキュリティグループIDを指定するため、理解しやすいと思います。

一方で私はポートについてあまり理解しておらず、ソースのように許可したい相手のポート番号があり、それを選択すると勘違いしていました。
そしてよくわからないポート番号を設定していたため、ヘルスチェックがUnhealthyとなっていたのです。

ポートについては以下のサイトがイメージつきやすいと思います。

https://wa3.i-3-i.info/word171.html

ポート番号は、セキュリティグループという防御層のどこに穴をあけるか（例：「HTTPなら80」のような規約）を指定するイメージです。

今回はRDS for PostgreSQLを作成しており、PostgreSQLは標準で5432ポートを使用します。そのため、ポート範囲に5432を指定する必要があります。
（「タイプ」でPostgreSQLを選択すると、自動的に5432が設定されます。）

<br>

**通信経路を確保したにもかかわらず接続に失敗する場合は、まずセキュリティグループの設定を確認しましょう。**

## 作成したRDSを他のVPCリソースから呼び出せない
ここまでで、PrivateLinkの通信経路は確保し、セキュリティグループも正しく設定しました。
しかし、作成したはずのRDSを別のVPCリソースから呼び出そうとすると、「指定したデータベースが存在しない」というエラーが発生しました。

:::note info
今回の場合、別のVPC上で動作しているHULFT Sqareというサービスの「コネクション」機能を使用して、作成したRDSを指定したところ、「database "○○○○" does not exist」というエラーが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/048dfc5a-6c96-49d4-6ce1-05802834b222.png)

:::

### 原因　RDS作成の際にデータベースを作成していなかった

私はRDSの作成とともにデータベースも作成されるものだと思っていました。
しかしRDSを作成する際、**デフォルトではデータベースは作成されません。**

データベースが作成されていなかったため、通信経路が確保されていたにも関わらず、RDSを呼び出すことができなかったのです。

RDSの作成時にデータベースも同時に作成するには、RDSの作成画面の「追加設定」セクションで、「最初のデータベース名」を入力する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833984/a38712e4-eb96-eea7-280d-9f2dfab93246.png)

<br>

**RDS作成時に初期データベースを作成するか、作成後に手動でデータベースを作成することを忘れないようにしましょう。**

## 最後に
最後まで読んでいただきありがとうございます。
本記事は私にとって初めての技術記事執筆であり、AWS初学者の方々や、同じような課題に直面している方々の助けになれば幸いです。
AWSの学習は複雑で難しい面もありますが、一つずつ課題を克服していくことで、確実にスキルアップできると信じています。
皆様のAWS学習の一助となれば幸いです。