はじめに

クラウドインテグレーション事業部の嶋﨑です。

今回はAPI GatewayをプライベートAPIで作成しLambdaを呼び出し、RDSにデータを格納するサーバレスアプリケーションの構築方法についてご紹介します。

構成の全体像

全体の流れ

VPC Aに配置されたプライベートサブネット内のEC2から、curlコマンドでAPIをPOSTで実行し、VPC Bに配置されたAPI Gateway (プライベートAPI)を通過してLambdaを呼び出し、RDSにデータを格納するといった流れになります。


前提条件

VPC周り、EC2、RDSは既に作成済み


手順

1.ピアリング接続をする

今回の構成は接続元と接続先が異なるVPCとなっている為、ピアリング接続が必要になります。

ピアリング接続について
https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/what-is-vpc-peering.html

AWSマネジメントコンソール画面にてピアリング接続画面を開き、「ピアリング接続の作成」をクリック。
項目に値を入力していきます。

項目 説明
ピアリング接続の名前 リソースを識別する為の任意の文字列を入力
ピアリング接続するローカル VPC を選択 接続元となるVPCを入力
アカウント 接続先VPCをAWSアカウントに応じて選択
リージョン 接続先VPCをリージョンに応じて選択
VPC ID (アクセプタ) 接続先のVPCのIDを入力

作成後、ピアリング接続のステータスが「承諾の保留中」となっているので、アクションからリクエストを承諾します。

2.ルートテーブルの設定

VPC1とVPC2は接続できましたが、ルートテーブルを定義してあげないと双方間で通信ができません。

それぞれのVPCのルートテーブルにルートを追加していきます。
VPC A

送信先 ターゲット
VPC BのCIDR VPC Bのピアリング接続(pcx-xxxxxxxxxx)

VPC B

送信先 ターゲット
VPC AのCIDR VPC Aのピアリング接続(pcx-xxxxxxxxxx)

3.VPCエンドポイント作成

今回作成するAPI GatewayはプライベートAPIなので、エンドポイントを設定しないとどの環境からも実行することができません。
API Gatewayを作成する際にこのVPCエンドポイントを指定する必要がありますので先に作成していきます。

「エンドポイントを作成」を選択し、エンドポイントのサービスcom.amazonaws.ap-northeast-1.execute-apiを選択します。

続いてVPCエンドポイントを配置するVPCやサブネット、VPCエンドポイントにアタッチするセキュリティグループを選択し「エンドポイントを作成」ボタンをクリックします。

4.Lambdaの作成

一から作成を選択後、関数名を入力、ランタイムは「Pytypn3.8」を選択しました。

アクセス権限は「基本的なLambdaアクセス権限で新しいロールを作成」を選択し「関数の作成」をクリックします。

VPCやRDSとの接続設定、Lambdaのコードの中身については割愛します。

5.API Gatewayの作成

API Gatewayを作成します。今回はプライベートAPIを作成するので「REST API プライベート」を選択します。

「新しいAPI」を選択し、API名に任意の名前を入力、「APIエンドポイントタイプ」は「プライベート」を選択します。

先ほど作成した「VPCエンドポイント」を指定し、「APIを作成」をクリックします。


APIが作成されました!

続いてメソッドを作成していきます。
メソッドタイプは「POST」で、作成したLambda関数を選択します。

続いてAPIをデプロイします。
「ステージ」と任意の「ステージ名」を選択し、デプロイをクリックします。


エラーメッセージが出てしまいました。

調べたところ、PRIVATEエンドポイントタイプでAPI Gatewayを作成するには、ResourcePolicy設定が必要のようです。

API Gateway リソースポリシーを作成して API にアタッチする
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-resource-policies-create-attach.html

リソースポリシーを設定後、無事デプロイできました!!

6.Session Manager でプライベート EC2 インスタンスへ接続

準備ができたのでAPIを実行していきたいところですが、EC2インスタンスはプライベート環境に配置されているので、そのままでは接続できません。
接続方法はいくつかありますが、今回はSession Managerを使って接続します。

Session Managerとは
Amazon EC2 Instance Connect Session Manager (Session Manager) は、AWS が提供するマネージドサービスで、EC2 インスタンスにセキュアかつ簡単にアクセスできるツールです。
Session Managerを使用すると、AWS マネジメントコンソールや AWS CLI から直接 EC2 インスタンスにアクセスできます。SSH キーを使わずに、WebブラウザやCLI経由でアクセス可能です。

AWS Systems Manager Session Manager
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

Session Managerを使用してプライベートEC2にアクセスするためにはいくつか準備が必要になります。

1. SSM Agentのインストール
セッションを介して接続するマネージドノードに AWS Systems Manager の SSM Agent バージョン 2.3.68.0 以降をインストールする必要があります。

2. EC2インスタンスにIAMロールをアタッチ
AmazonSSMManagedInstanceCoreというマネージドポリシーを持つIAMロールの作成が必要になります。

3. VPCエンドポイントの作成
セッションマネージャーを使用するには、以下の VPC エンドポイントを作成します。
com.amazonaws.[region].ec2messages
com.amazonaws.region.ssm
com.amazonaws.region.ssmmessages

詳細につきましては以下のAWSドキュメントをご確認ください。
インターネットにアクセスしなくても、 VPC エンドポイントを作成して、Systems Manager でプライベート EC2 インスタンスを管理するにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/ec2-systems-manager-vpc-endpoints

「セッションの開始」画面にて、ターゲットインスタンスが表示されましたら準備完了です!!
「Start session」をクリックしSession Manager画面へ遷移します。

7.APIの実行

準備が整いましたので、実際にEC2からcurlをPOSTで実行し、RDSへデータを格納します。

statusCode:200が返ってきました!!
送信したデータが正しく格納されているか確認します。

格納されていることを確認しました!!!

実行したcurlコマンドの中身:

curl -X POST "APIのURL" \ 
-H "x-api-key: APIキー" \
-H "Content-Type: application/json" \
-d '{"key1":"value1", "key2":"value2", "key3":"value3", "key4":"value4", "key5":"value5", "key6":"value6",  "key7":"value7"} '

ポイント
・APIキーは “x-api-key: xxxxxxxxxxx”の形式で指定します。
・オプション -H、または-(-)headでRequest Headerの内容を記述します。
・オプション -Dでデータを記述します。データはダブルクォーテーション“”で囲みます。

まとめ

今回の手順を通じて、VPC間のピアリング接続、VPCエンドポイントの作成、Lambda関数およびAPI Gatewayの構築、そしてプライベートなEC2インスタンスからのAPI実行によるRDSへのデータ格納までの一連の流れを解説しました。
これにより、プライベートなネットワーク環境内で安全かつ効率的にデータの処理と保存が行えるようになります。
本記事が環境構築する際に、少しでもお役に立てれば幸いです。
最後までご覧いただきありがとうございました!!