VPC peeringを介したprivate subnet中のCloud9とRDSの連携

こんにちは
AAKEL 瀧本です。

今回から仕事で必要になった技術をQiitaで共有したいと思います。

##1.簡単な自己紹介
　2020年10月、AAKEL Technologiesへ第二新卒で入社しました。仕事は主にデータ分析と機械学習モデルの作成、AWSでのシステム構築です。AWSのCLF、SAAを取得していますが、記事執筆2週間前から本格的にAWSで0からシステムを構築し始めたのでようやくペーパードライバーの状態から脱却できそうです。


##2.この記事の内容
　本記事では、二つの異なるAWSアカウントにある同一リージョン内のVPC同士をVPCピアリングによって接続し、片方にあるVPC_1のプライベートサブネット中のCloud9インスタンスからもう片方のVPC_2のプライベートサブネット中のRDSに接続しようというシステムをハンズオン形式で紹介します。
　用途としては、あらかじめ構築していた環境に常時データが更新しているRDSが存在しており、そのRDSを他のアカウントでも活用したいという時だと思います。また、System Managerを使ってエンドポイントを作成し、Cloud9インスタンスをプライベートサブネット配下に置くことでよりセキュリティ面で安全な設計にしています。構成を以下に示します。
![VPCピアリング_Qiita (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/fb39663e-9513-62be-c1a7-0a7161f8333c.png)






　今回は、アカウントBの詳細な設計は省き、主にアカウントAの設計をメインに進めていきます。順番は

①、VPCピアリング作成
②、各サブネットのルートテーブル作成
③、pvt_2のRDSセキュリティグループ設定
④、Cloud9 instanceを作成
⑤、Cloud9用のエンドポイント作成


になります。

##3.ハンズオン

###①ピアリング作成
　VPC_1(10.0.0.0/16)を作成し、その後［AWSマネジメントコンソール→VPC→ピアリング接続］の順で移動し、ピアリング接続の作成を行います。

![スクリーンショット 2021-07-05 11.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/36907c95-086a-6566-eb67-521d28561db3.png)

ピアリング接続ネームタグ：任意の名前
VPC(リクエスタ)：VPCピアリング接続したいVPCを選択
アカウント ID：接続先（VPC_2）の12桁のアカウントID
VPC ID(アクセプタ)：接続先（VPC_2）のVPC ID(vpc-xxxxxx...)
【ピアリング接続の作成】

　ピアリングを接続したら、次はアカウントBに移動し、［AWSマネジメントコンソール→VPC→ピアリング接続］と移動すると、ピアリング接続の依頼が届いているので許可します。

これでピアリング接続は完了です！なんて簡単
![VPCピアリング_Qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/9ae26cb2-f11b-16a5-cc9c-5e1d88959257.png)


　しかし、これだけではプライべートサブネットに導線がありません。そこで、ルートテーブルを作ってプライベートサブネットにルーティングをしてあげましょう！!

###②各サブネットのルートテーブル作成
　次に、pvt_1とpvt_2にルートテーブルを作ります。pvt_1のルートテーブルはアカウントAに移動して作成し、pvt_2のルートテーブルはアカウントBに移動して作成しましょう！作り方を以下に示します。
　［AWSマネジメントコンソール→VPC→ルートテーブル］と移動し、ルートテーブルを作成します。
![スクリーンショット 2021-07-05 11.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/61625699-11d0-4055-1c00-4bd06a91917b.png)

名前：任意
VPC：今回使うVPCを選択
【ルートテーブルを作成】

　作成したルートテーブルの左側にチェックを入れると、何やら下から詳細な情報が出てきます。そいつの「ルート」を選択し、「ルートを編集」を押します。
そして、各ルートテーブルを以下のように設定します。
![QIITA用 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/d6fe693a-9d7d-b856-2601-af2fc474891e.png)

　その後、再度ルートテーブルを選択をして、「サブネットの関連付け」を選択し、「サブネットの関連付けを編集」を押します。その後、対応するサブネットを選択して【関連付けを保存】をして完了です。

　これにより、pvt_1からpvt_2へのコネクションができました。
![VPCピアリング_Qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/79870102-715d-05d6-53d6-42e036e4954e.png)





　しかし、pvt_2に存在するRDSへの接続はまだ確立していません。そこで、RDSのセキュリティグループを作成しましょう！

###③pvt_2のRDSセキュリティグループ設定
　VPC PeeringによってVPC_1からRDSに来るトラフィックを許可する必要があるので、Postgre DBのセキュリティグループのインバウンド設定を行います。
　　［AWSマネジメントコンソール→RDS→データベース→対象のRDSをクリック→「接続とセキュリティ」タブのセキュリティグループを選択→「インバウンドルール」タブを選択→「インバウンドルールを編集」をクリック］と移動します。VPCピアリングのトラフィックを許可するには、以下のように設定します。![スクリーンショット 2021-07-05 12.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/46d2f6d1-5d3b-7371-ea4f-0893b9bfbaf1.png)

　もしもVPC_2のあらゆるリソースからRDSに接続させたい場合、![スクリーンショット 2021-07-05 12.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/a325809c-d3f2-84de-7468-01cf70e32ff0.png)

と設定すると良いかと思います。例えばLambdaを使ってDBをいじったり
　これでpvt_1からRDSへの接続が確立しました！
![VPCピアリング_Qiita (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/bd9c8b8b-7608-0779-a4de-028ca283ed70.png)



次は、Cloud9を作成していきます。

###④Cloud9 instanceを作成
 2020年の8月あたりから、Cloud9をプライベートサブネットで利用できるようになったそうです。厳密に言うと、パブリックサブネットのインバウンドを閉じた状態で使えるということらしいですが、、こちらの方法については以下のクラスメソッドさんの記事を参考にしました。

[プライベートサブネットで Cloud9 が利用可能！Cloud9 が Session Manager に対応しました！](https://dev.classmethod.jp/articles/cloud9-sessionmanager/)

どうやってプライベートネットワーク上のCloud9へアクセスできるかと言うと、Session Managerを使ってエンドポイントを設定しているんです。それでは、Cloud9インスタンスを立ち上げましょう。
［AWSマネジメントコンソール→Cloud9］と移動し、「Create environment」をクリックすると以下の画面になります。
![スクリーンショット 2021-07-05 12.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/eda1ea96-d889-f733-2aa3-4eb4af16c8ef.png)
Name：任意
Description：任意
【Next step】
![スクリーンショット 2021-07-05 13.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/dfe6a0ce-e14c-9d8c-13a2-e4cf7398025b.png)
Environment type：Create a new no-ingress EC2 instance for environment (access via Systems Manager)を選択
Instance type：任意
Platform：任意
Cost-saving setting：任意
![スクリーンショット 2021-07-05 13.34.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/203a8339-8852-9e15-17f9-7c84749c97aa.png)
IAM role：AWSServiceRoleForAWSCloud9
Network (VPC)：VPC_1を選択
Subnet：pvt_1を選択
【Next step】
【Create environment】

これでCloud9インスタンスをpvt_1に配置できました！しかし、作成したCloud9の「Open IDE」をクリックして開発環境を開いても、中に入れないです。
![VPCピアリング_Qiita (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/b28ca672-a223-0a48-baf8-672b354a7205.png)


　最後は、中に入るためにエンドポイントを作成してCloud9からCloud9 instanceにアクセスしてみましょう！

###⑤Cloud9用のエンドポイント作成
［AWSマネジメントコンソール→VPC→エンドポイント］と移動し、「エンドポイントの作成」をクリックすると以下の画面になります。
![スクリーンショット 2021-07-05 13.57.8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/6a303341-60e9-57c8-783e-420ecff53d95.png)
サービスは、以下の3つを選択してください。（同時にはできないので一つずつエンドポイントを作ってください。）

com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.ec2messages

VPC:VPC_1を選択
![スリーンショット 2021-07-05 14.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/bd0e1379-e14f-c259-4513-e96c17c78e10.png)

サブネット：対応するAZのpvt_1を選択
プライベートDNS名を有効にする：チェックを入れてください。ただし、VPC_1がDNSホスト名有効化をしていない場合、有効化にしてください。DNS名を有効にすると便利ですよね。
セキュリティグループ：Cloud9のセキュリティグループを選択してください。
![スクリーンショット 2021-07-05 14.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/30d9acc6-1454-6159-c082-61e028168307.png)
ポリシー：フルアクセス
【エンドポイントの作成】

3つのエンドポイントを作成したら、設定完了です！
Cloud9からpvt_1にあるCloud9 instanceへアクセスできます。
![VPCピアリング_Qiita (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/b0b61326-0063-630c-2fef-4653b594baf8.png)


あとは、Postgre DBにアクセスして好きにいじってください！

##4.終わりに
随分普通なことをニッチな例で紹介しましたが、自分のような状況の人に記事が届けばと思います。