ハッカソン参加時の備忘録 ～ 第３回：【Python】AWS LambdaとAWS RDS（MySQL）を連携させてみよう ～（１）

こんにちは。ITエンジニアのきゅうです。
第３回目は業務アプリケーションでは必ずと言っていいほど使うデータベースに接続させてみたいと思います。

そもそもAWSには様々なデータベース（以降DB）が用意されており、
特にNonSQLをAWSはプッシュしている様に思いますが、
今回は使い慣れたRDSの中でもMySQLを使用していきたいと思います。
以下、今回作成するアーキテクチャイメージになります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/8b73423b-f55c-73be-cd20-c430198e107f.png)

# VPCの作成
```
使用するサービス：VPC
使用する機能：VPC
```
### １．VPCの作成
RDSはVPCを設定する必要があるので、事前にVPCを作成しておきます。
AWSにログインしたら、まずは検索ボックスより「VPC」と入力し、開かれた『VPC』のダッシュボードより「VPCを作成」ボタンをクリックします。

### ２．VPCの設定をする
VPCの設定画面で以下のように設定する。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/a8f5fa98-80a0-1532-1a98-a86b0e7c4f47.png)

●『作成するリソース』：「VPCなど」を選択することで、サブネットやルートテーブルなどを自動作成してくれます。
●『名前タグの自動生成』：今回は「test2023」にしましたが、任意の名前でOKです。
●『アベイラビリティゾーンの数』：「２」を設定する。「１」とすると、RDS作成時に警告が発生し、RDSを作成できない。

●『プライベートサブネットの数』：ハッカソンであればプライベートサブネットは１で十分だと思います。
●『NATゲートウェイ』：なし。設定すると書きされるようですので・・・
●『VPCエンドポイント』：とりあえずS3ゲートウェイを選択。
上記以外はデフォルトでOKです。『VPC作成』を押下しましょう。

### ３．VPC作成完了
作成したVPCを確認してみましょう。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/79dcc59f-11d6-4271-79ff-438f196ce696.png)


# RDSの作成
```
使用するサービス：RDS
使用する機能：データベース（MySQL）
```
### １．RDSにて「データベースの作成」をクリック
続いて、検索ボックスより「RDS」と入力し、開かれた『RDS』のダッシュボードより「データベースの作成」ボタンをクリックします。

### ２．RDSの設定
表示された設定画面に対して、以下の画面キャプチャ―のように設定し、「作成」ボタンを押下する。
※途中、上記で作成したVPCを使うように設定しているが、HeidiSQLが繋がらないようであれば、VPCも新規作成すると繋がる可能性が高い。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/a88c9fb7-0edf-95dc-5d61-0cb808883160.png)

### ３．HeidiSQLをダウンロードする。
「２．」で空のRDS（データベース）を作成したが、値が入っていないと意味がない。
だが、値を入れるためにSQLを作成するのも一苦労。。。
そんな時『HeidiSQL』を使ってみてはどうだろうか？
『SQLServer』のようにGUIでレコードを参照できるだけでなく、INSERTやUPDATE、DELETEなどは画面からエクセルのように入力出来るだけでなく、画面の項目設定など『CREATE TABLE』もGUI上から可能です。
ということで、早速HeidiSQLを使ってみましょう。
以下のサイトより、HeidiSQLをダウンロードする。

https://www.heidisql.com/download.php?download=installer

### ４．HeidiSQLをセットアップする。
インストーラをクリックし、インストールウィザードに沿って設定を行いましょう。
一通り設定を終え、ショートカットをクリックすると以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3542dc64-cba5-8b0c-515e-949021e6dc13.png)

### ５．接続情報を新規作成する。
以下の画面キャプチャーのように入力しましょう。
そして、入力を終えたら、「開く」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/ac3b9fd8-e127-9902-3a6c-c45b3cf0766c.png)

すると・・・
以下のような画面が表示されるので、表示されたら『AWS RDS』のDBに接続成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/96a6887c-566c-d958-dfd1-788f6b1c4866.png)


# RDSの権限周りの設定や、Lambdaにライブラリをインポートをしよう
```
使用するサービス：Lambda
使用する機能：レイヤー
```
### １．レイヤー追加画面を表示する。
今回「pymysql」というライブラリを使用するため、「pymysql」をインポートする必要があるのだが、
AWSには「pymysql」がデフォルトでインストールされていない。
なので、Lambdaの各関数の設定の「コード」画面の一番下で、『レイヤー』を設定する必要がある。
『レイヤーの追加』をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b64286a4-bdd8-c1b6-32e2-e2de19164089.png)

### ２．レイヤーの設定
レイヤーの設定には「AWSレイヤー」「カスタムレイヤー」「ARNを指定」の３種類があり、
『AWSレイヤー』：ローカルやAWSの『Cloud9』を使って、必要なライブラリをZip化する方法。
『カスタムレイヤー』：AWS アカウントまたは組織によって作成され、関数のランタイムと互換性があるレイヤー。（ほとんど使用しないので詳しくは分かりません。）
『ARNを指定』：有志によってインターネットにアップロードされたライブラリをARNを指定することで、呼び出す。

当方としては、まず「ARNを指定」を考えます。
以下のGitHubページから、
deployments/python3.9
と進み、自分のリージョンの「html」リンクをクリックする。
すると、現在色々な人によって作られたレイヤーのARNが展開されているため、
レイヤー追加したいものがあれば、こちらを使うのが得策です。

https://github.com/Jeff-Junfang/Klayers-aws-layer-

今回はARN上記のサイトの
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p311-pymysql:1
を使用する。
以下、設定例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/ac117a6e-512d-c1e2-9093-d4daaddf206d.png)


# NATインスタンスを設定して、外部接続できるようにする。
プライベートサブネットに配置したLambda関数は、インターネット等外部へのアクセスが制限されてしまう。その問題を改善する為、AWSでは『NAT GateWay』という仕組みが用意されている。
ただ、この『NAT GateWay』は高価であり、まあまあの利用料がかかってしまう。
そこで、もう一つの解決策が、EC2に『NATインスタンス』を用意する方法となります。
ここでは、その設定を記載する。
以下、再掲載となりますが作成するアーキテクチャイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/8b73423b-f55c-73be-cd20-c430198e107f.png)


### ★★（１）．ルートテーブルを使って、パブリックサブネットにインターネットゲートウェイを紐づける★★
```
使用するサービス：VPC
使用する機能：ルートテーブル
```
##### １．ルートテーブルよりパブリックサブネットを選択。
VPCの左サイドメニューからルートテーブルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/baaa3fd7-bba7-f54f-3eb3-8139093b9ce1.png)

##### ２．「ルートを編集」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/c1a1931d-1054-922c-b77d-c9f2a45b0e4c.png)

##### ３．「ルートを追加」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b1a56156-a60d-ea65-b391-4dfc7adcfc0e.png)

##### ４．インターネットゲートウェイを設定
画像の通り、インターネットゲートウェイを設定し、「保存」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/1021a52f-582b-291e-0aa3-70753ae1c212.png)

##### ５．リソースマップでパブリックサブネットにインターネットゲートウェイが紐づいたことを確認。
```
使用するサービス：VPC
使用する機能：お使いのVPC
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/78c807c7-be9b-0b68-d8e3-cd2ffc2408de.png)

### ★★（２）セキュリティグループを作成する。★★
```
使用するサービス：VPC
使用する機能：セキュリティーグループ
```
##### １．「セキュリティグループ」を開く
VPCの左サイドメニューからセキュリティグループを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/bff0acf4-1e2d-a75c-2f09-d149d9805876.png)

##### ２．「セキュリティグループを作成」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/7ea95367-095f-b36d-f22f-ff37ee237b54.png)

##### ３．インバウンドルールを設定する
画像の通り、インバウンドルールを設定する。
今回プライベートサブネットを２つ作っているはずなので、それぞれにHTTP／HTTPSを許可する設定を入れる。
　　※CIDR入力欄にプライベートサブネットのCIDRが出てこない場合は、直打ちするとよいです。
また、NATインスタンスにアクセスするために、自分のIPアドレスにだけSSHを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/47f7ebe1-1013-1f02-6410-955128f12f44.png)


##### ４．アウトバウンドルールを設定する
サーバーから外部アクセスするサイトのIPアドレスを登録するが、
「0.0.0.0/0」ですべてを許可してしまう方がハッカソンとしては安全。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/4cbcf8a6-093c-803c-1c1e-c8f73e97eed2.png)


##### ５．「セキュリティグループを作成」ボタンを押下。



### ★★（３）EC2にてNATインスタンスを作成する。★★
```
使用するサービス：EC2
使用する機能：インスタンス
```
##### １．EC2インスタンスを開いて、「インスタンスを起動」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/c92359e1-c56d-3a46-fa90-82b3c0d5c095.png)


##### ２．キャプチャーのように設定し「インスタンスを起動」を押下する。
以下の画面キャプチャーのように設定し、「インスタンスを起動」を押下する。
※注意事項等は３．４．で記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b358839e-35ad-d7b3-cb84-476d28ecde95.png)


### ３．アプリケーション選択でNATインスタンスを選択します。
「Application and OS Images」という、OSを選ぶ箇所が最初の方にあるので、そこでは
```amzn-ami-vpc-nat```
と入力し、NATインスタンスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/76134e71-e5b3-5a7b-99c6-f7056d8fe1ce.png)

##### ４．『ネットワーク設定』欄でVPCとセキュリティグループを選択する。
『ネットワーク設定』欄で『編集』ボタンを押し、「VPC」を上記の『VPCの作成』で作成したVPCを選択する。
ここを見逃すと、セキュリティグループでデフォルトしか選択できずに、「なんでだぁぁぁ～～！！！」となるので注意しよう！！

:::note warn
注意
※※サブネットは『パブリックサブネット』を選択します。
※※パブリックIPの自動割り当ては『無効化』を選択します。
※※セキュリティグループも先ほど設定した「セキュリティグループ」を選択します。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/389a11c2-4322-e39e-dca4-8de2636261e2.png)


##### ５．『キーペアを作成』という画面が表示されるので「キーペア」を作成します。

##### ６．再度「インスタンスを起動」を押下すると、作成完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/b43fee1c-d3bf-23cb-893e-f17a0e43d356.png)

### ★★（４）NATインスタンスを固定IPアドレスに紐づける★★
```
使用するサービス：VPC
使用する機能：Elastic IP
```
##### １．『Elastic IP アドレス』を開く
『VPC』を開き、左のメニューより『Elastic IP』を選択します。
その後、表示される「割り当てられたIPv4アドレス」を選択します。
IPアドレスは晒せないので、オブジェクトで隠してますが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/07a8c295-aea7-8978-8e54-77b4ee746665.png)

##### ２．『Elastic IPアドレスの関連付け』をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/7d4bac6e-52af-a281-181d-33fde3b5196a.png)

##### ３．「関連付け」の設定をする。
リソースタイプは「インスタンス」を選択し、
「インスタンス」NATインスタンスを選択します。
プライベートIPアドレスは表示されたものを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3e10add9-3785-531b-39ac-9d2463c7da9a.png)

##### ４．「関連付ける」ボタンを押下。
「関連付ける」ボタンを押下すれば完成です。



### ★★（５）送信元/送信先チェックの無効化★★
```
使用するサービス：EC2
使用する機能：インスタンス
```
##### １．『アクション』を開く
EC2を開き、これまで設定してきたNATインスタンスを選択（チェックを入れる）し、
『アクション』をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/9f05228c-fa4c-9ff3-da84-64513f407b3a.png)

##### ２．『ソース/宛先チェックを変更』をクリック
「ネットワーキング」⇒「ソース/宛先チェックを変更」の順でクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/67698182-13f9-e8d1-ee41-a6097e54c1bf.png)

##### ３．『送信元/送信先チェック』を「停止」
『送信元/送信先チェック』の「停止」にチェックを入れ、「保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/0f127514-6597-9655-ef5b-527303618847.png)

### （６）プライベートサブネットからのインターネット接続をNATインスタンス経由にする
```
使用するサービス：VPC
使用する機能：ルートテーブル
```
##### １．VPCのリソースマップより、プライベートサブネットの設定画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/8a252898-ae49-8321-db93-b1407d295e13.png)

##### ２．サブネット詳細画面より「ルートテーブル」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/28add787-7d5f-ae87-1e88-cbfdd41b645f.png)


##### ３．「ルート編集」を開く
対象のルートテーブルにチェックを入れて、「アクション」より「ルート編集」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/8dfe3e80-59e6-5ad2-5db7-7a9bc3d53fb1.png)


##### ４．ルート編集でNATインスタンスを設定する。
「ルート」を追加し、送信先が「0.0.0.0/0」に対して、「インスタンス」－「（NATインスタンス）」を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/e0219ae1-ca40-3b16-e70a-ae517201661c.png)

##### ５．もう一方のプライベートサブネットも同様の設定を行う。


### ★★（６）Lambdaと接続確認★★
```
使用するサービス：Lambda
使用する機能：関数
```
今回は、前回のLINEBotのオーム返しをVPCのプライベートサブネットに配置しましたので、
LINEアプリで接続確認をしてみます！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/eb5f3e92-0154-7d1c-4ad2-f3b1cce6f2c7.png)

恥ずかしい限りですが、私のLINE履歴を見ると一度オーム返し出来なくなってから、
再度オーム返し出来るようになったのが分かると思います。


ということで、、、
ここまでで、やっとLmabdaが外部接続できましたので、
一旦今回の備忘録はここまでとしたいと思います。
次回はLambdaのLINEbotを書き換えて、データベースに格納したものをLINEに表示させるbotを作っていきたいと思います！！

ということで、本日はここまでです。
少しでも参考になったと思いましたら、「いいね」や「ストック」を押していただけますと、今後の励みになりますので、是非とも宜しくお願い致します。

最後までお読み頂きありがとうございました。