5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

ハッカソン参加時の備忘録 ~ 第3回:【Python】AWS LambdaとAWS RDS(MySQL)を連携させてみよう ~(1)

Last updated at Posted at 2024-01-14

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

そもそもAWSには様々なデータベース(以降DB)が用意されており、
特にNonSQLをAWSはプッシュしている様に思いますが、
今回は使い慣れたRDSの中でもMySQLを使用していきたいと思います。
以下、今回作成するアーキテクチャイメージになります。
01.png

VPCの作成

使用するサービス:VPC
使用する機能:VPC

1.VPCの作成

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

2.VPCの設定をする

VPCの設定画面で以下のように設定する。
01.png

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

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

3.VPC作成完了

作成したVPCを確認してみましょう。
02.png

RDSの作成

使用するサービス:RDS
使用する機能:データベース(MySQL)

1.RDSにて「データベースの作成」をクリック

続いて、検索ボックスより「RDS」と入力し、開かれた『RDS』のダッシュボードより「データベースの作成」ボタンをクリックします。

2.RDSの設定

表示された設定画面に対して、以下の画面キャプチャ―のように設定し、「作成」ボタンを押下する。
※途中、上記で作成したVPCを使うように設定しているが、HeidiSQLが繋がらないようであれば、VPCも新規作成すると繋がる可能性が高い。
03.png

3.HeidiSQLをダウンロードする。

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

4.HeidiSQLをセットアップする。

インストーラをクリックし、インストールウィザードに沿って設定を行いましょう。
一通り設定を終え、ショートカットをクリックすると以下のような画面が表示されます。
image.png

5.接続情報を新規作成する。

以下の画面キャプチャーのように入力しましょう。
そして、入力を終えたら、「開く」ボタンをクリックする。
image.png

すると・・・
以下のような画面が表示されるので、表示されたら『AWS RDS』のDBに接続成功です。
image.png

RDSの権限周りの設定や、Lambdaにライブラリをインポートをしよう

使用するサービス:Lambda
使用する機能:レイヤー

1.レイヤー追加画面を表示する。

今回「pymysql」というライブラリを使用するため、「pymysql」をインポートする必要があるのだが、
AWSには「pymysql」がデフォルトでインストールされていない。
なので、Lambdaの各関数の設定の「コード」画面の一番下で、『レイヤー』を設定する必要がある。
『レイヤーの追加』をクリックする。
image.png

2.レイヤーの設定

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

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

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

image.png

NATインスタンスを設定して、外部接続できるようにする。

プライベートサブネットに配置したLambda関数は、インターネット等外部へのアクセスが制限されてしまう。その問題を改善する為、AWSでは『NAT GateWay』という仕組みが用意されている。
ただ、この『NAT GateWay』は高価であり、まあまあの利用料がかかってしまう。
そこで、もう一つの解決策が、EC2に『NATインスタンス』を用意する方法となります。
ここでは、その設定を記載する。
以下、再掲載となりますが作成するアーキテクチャイメージです。
image.png

★★(1).ルートテーブルを使って、パブリックサブネットにインターネットゲートウェイを紐づける★★

使用するサービス:VPC
使用する機能:ルートテーブル
1.ルートテーブルよりパブリックサブネットを選択。

VPCの左サイドメニューからルートテーブルを選択する。
image.png

2.「ルートを編集」ボタンを押下

image.png

3.「ルートを追加」ボタンを押下

image.png

4.インターネットゲートウェイを設定

画像の通り、インターネットゲートウェイを設定し、「保存」をクリック。
image.png

5.リソースマップでパブリックサブネットにインターネットゲートウェイが紐づいたことを確認。
使用するサービス:VPC
使用する機能:お使いのVPC

image.png

★★(2)セキュリティグループを作成する。★★

使用するサービス:VPC
使用する機能:セキュリティーグループ
1.「セキュリティグループ」を開く

VPCの左サイドメニューからセキュリティグループを選択する。
image.png

2.「セキュリティグループを作成」を選択。

image.png

3.インバウンドルールを設定する

画像の通り、インバウンドルールを設定する。
今回プライベートサブネットを2つ作っているはずなので、それぞれにHTTP/HTTPSを許可する設定を入れる。
  ※CIDR入力欄にプライベートサブネットのCIDRが出てこない場合は、直打ちするとよいです。
また、NATインスタンスにアクセスするために、自分のIPアドレスにだけSSHを許可します。
image.png

4.アウトバウンドルールを設定する

サーバーから外部アクセスするサイトのIPアドレスを登録するが、
「0.0.0.0/0」ですべてを許可してしまう方がハッカソンとしては安全。
image.png

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

★★(3)EC2にてNATインスタンスを作成する。★★

使用するサービス:EC2
使用する機能:インスタンス
1.EC2インスタンスを開いて、「インスタンスを起動」を押下。

image.png

2.キャプチャーのように設定し「インスタンスを起動」を押下する。

以下の画面キャプチャーのように設定し、「インスタンスを起動」を押下する。
※注意事項等は3.4.で記載します。
image.png

3.アプリケーション選択でNATインスタンスを選択します。

「Application and OS Images」という、OSを選ぶ箇所が最初の方にあるので、そこでは
amzn-ami-vpc-nat
と入力し、NATインスタンスを選択します。
image.png

4.『ネットワーク設定』欄でVPCとセキュリティグループを選択する。

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

注意
※※サブネットは『パブリックサブネット』を選択します。
※※パブリックIPの自動割り当ては『無効化』を選択します。
※※セキュリティグループも先ほど設定した「セキュリティグループ」を選択します。

image.png

5.『キーペアを作成』という画面が表示されるので「キーペア」を作成します。
6.再度「インスタンスを起動」を押下すると、作成完了。

image.png

★★(4)NATインスタンスを固定IPアドレスに紐づける★★

使用するサービス:VPC
使用する機能:Elastic IP
1.『Elastic IP アドレス』を開く

『VPC』を開き、左のメニューより『Elastic IP』を選択します。
その後、表示される「割り当てられたIPv4アドレス」を選択します。
IPアドレスは晒せないので、オブジェクトで隠してますが・・・
image.png

2.『Elastic IPアドレスの関連付け』をクリックする。

image.png

3.「関連付け」の設定をする。

リソースタイプは「インスタンス」を選択し、
「インスタンス」NATインスタンスを選択します。
プライベートIPアドレスは表示されたものを選択します。
image.png

4.「関連付ける」ボタンを押下。

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

★★(5)送信元/送信先チェックの無効化★★

使用するサービス:EC2
使用する機能:インスタンス
1.『アクション』を開く

EC2を開き、これまで設定してきたNATインスタンスを選択(チェックを入れる)し、
『アクション』をクリックします。
image.png

2.『ソース/宛先チェックを変更』をクリック

「ネットワーキング」⇒「ソース/宛先チェックを変更」の順でクリックします。
image.png

3.『送信元/送信先チェック』を「停止」

『送信元/送信先チェック』の「停止」にチェックを入れ、「保存」をクリックする。
image.png

(6)プライベートサブネットからのインターネット接続をNATインスタンス経由にする

使用するサービス:VPC
使用する機能:ルートテーブル
1.VPCのリソースマップより、プライベートサブネットの設定画面を開く。

image.png

2.サブネット詳細画面より「ルートテーブル」を開く

image.png

3.「ルート編集」を開く

対象のルートテーブルにチェックを入れて、「アクション」より「ルート編集」を選択する。
image.png

4.ルート編集でNATインスタンスを設定する。

「ルート」を追加し、送信先が「0.0.0.0/0」に対して、「インスタンス」-「(NATインスタンス)」を設定する。
image.png

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

★★(6)Lambdaと接続確認★★

使用するサービス:Lambda
使用する機能:関数

今回は、前回のLINEBotのオーム返しをVPCのプライベートサブネットに配置しましたので、
LINEアプリで接続確認をしてみます!!
image.png

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

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

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

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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?