本記事は以下アドベントカレンダー8日目の投稿です。
投稿が遅れてしまい申し訳ありません。
はじめに
以下のようなアプリケーションを業務で作成したので、
そのアプリケーションを一般化してサーバレスで申請系のアプリとして数回の記事に分けて作るイメージです。
今回は構成図の中でAPI GatewayからLambdaを呼び出すところ(疎通確認)まで作りたいと思います。
※構成図が突貫工事のためひどいのでいつか作り直します。。。
本記事の前提条件は次のとおりです。
- リージョンは ap-northeast-1(東京)
- VPC は AWS アカウント作成時に自動作成されるデフォルト VPC を使用
- API Gateway は REST API(HTTP API ではない)
- 疎通確認用の EC2 は同じ VPC の任意のサブネットに作成済み
Lambda関数の作成
関数の作成
関数の作成から関数を作成する。
関数名はvalidation-app-v1-test-requestにしましたが、皆さんは任意の名前を付けてください。
その他の項目はデフォルトで大丈夫です!

今回は疎通確認までなので、Lambdaは殆どデフォルト
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps({
'message': 'Validation OK',
})
}
VPCエンドポイントの作成
次にマネジメントコンソールからVPCを検索する。
(エンドポイントがすでに作成されている方はスキップしていただいて結構です。)

エンドポイントの設定
名前タグ:my-test-01
名前タグは皆さんの任意の名前で大丈夫です。
タイプはAWSのサービスを選択

ネットワーク設定
任意のVPCを選択してください。
デフォルトでも問題ありません。
今回は検証用ということもあり、特別なネットワーク要件はないのでデフォルト VPC を使っています。
本番環境では、パブリック/プライベートサブネットを分けた専用の VPC を用意することをおすすめします。
サブネット
セキュリティグループ
ポリシー
ここはフルアクセスでOK
VPC エンドポイントポリシーはフルアクセスのままにしておき、
実際のアクセス制御は API Gateway のリソースポリシー側で行うのがシンプルだからです。
ここまで来たら作成を実行!
エンドポイントが作成されたら、IDをメモする!

API Gateway
API名:my-test-api-gateway
任意のAPI名を設定します。

VPCエンドポイントIDは先ほど作成したエンドポイントを選択します。

残りの設定はデフォルトのままAPIを作成!
リソース
リソースが以下になるように、階層ができるたびにその階層でリソースを追加していく。

メソッドの作成
メソッドタイプ:POST
Lambdaプロキシ結合:true
Lambda関数:作成したLambdaを選ぶ(validation-app-v1-test-request)

リソースポリシー
リソースポリシーを編集する。
左側のメニューからリソースポリシーを選択する。

以下の値は自分の環境に合わせて置き換えてください。
| プレースホルダー | 意味 |
|---|---|
123456789012 |
自分の AWS アカウントID |
abcdefghij |
API Gateway の API ID |
vpce-0123456789abcdef0 |
作成した VPC エンドポイント ID |
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowInvokeFromSpecificVPCEndpoint",
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:abcdefghij/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-0123456789abcdef0"
}
}
}
]
}
ステージ
ステージの作成を選択
ステージ名をdevとして作成します。
デプロイ:先ほどデプロイした時間のデプロイがあるので選択する。
その他:デフォルトでOKです。

疎通確認
以下は VPC 内の EC2 から Private REST API を呼び出すテストコマンドです。
※ {YOUR_API_ID} の部分は自分の API Gateway の ID に置き換えてください。
curl -i \
-X POST \
-H "Content-Type: application/json" \
-d '{"test":"ok"}' \
https://{YOUR_API_ID}.execute-api.ap-northeast-1.amazonaws.com/dev/api/v1/test/request
レスポンスに以下のようなものがあれば成功です!
HTTP/1.1 200 OK
{"message":"Validation OK"}
まとめ
本記事では、サーバレスな申請系アプリの土台として、
- バリデーション用の Lambda 関数を作成する
- API Gateway の Private REST API を作成する
- execute-api 用の VPC エンドポイントを作成し、リソースポリシーで紐付ける
- VPC 内の EC2 から
curlで疎通確認を行う
というところまでを作りました。
大変だったと思いますが、APIの疎通確認までできました。
次回以降は、この土台の上に追加のAPIや実際のLambdaとワークフローを作成していきたいと思います。














