読んで欲しい方
この記事では以下の方に読んでいただきたいです。
- Guzzleを使ってPOST通信をしたい
- API Gateway、Lambdaを使って簡単なアプリケーションを作りたい
- Lambdaから外部APIを叩きたい
環境は以下の通りです。
- PHP:7.3
- Guzzle:6.3
- Lambda:node14
取得したEmailを外部APIを使って、スパムに該当するメールアドレスかどうかをチェックするシステムを構築しました。
データの流れとしては、Laravel → API Gateway → Lambda → 外部API
となります。Laravelの部分は具体例で、複数の箇所からLambdaに処理を送っています。
実装順序としては下記の通り追っていきます。
- GuzzleでPOST送信を実装
- Lambda関数の作成
- API GatewayでAPIを作成
まずはAPI GatewayとLambdaの簡単な機能確認をします。
API Gateway
REST APIをノーコーディングで管理することのできるサービス。
APIの入口部分以降の処理は別で用意する必要があり、今回はLambdaに処理を実装していきます。
Lambda
サーバーレスでコードを実行することの出来るサービス。
今回はリクエストを受け取り、外部APIへGET送信を実装します。
GuzzleでPOST送信を実装
PHP/LaravelとGuzzleを利用して、API Gatewayで作成したURL(後述する)に対して、POST送信を実装します。
$client = new \GuzzleHttp\Client();
//ここではフロントエンドからリクエストされたemailを使用してPOST送信を行う。
$body = ["email" => $email];
//API Gatewayでエンドポイントを作成しurlを取得
$response = $client->request('POST', url, [
'json' => $body,
//self::TIMEOUTは事前に定義
"connect_timeout" => self::TIMEOUT,
"timeout" => self::TIMEOUT,
]);
以上の処理でemailをパラメータとしてエンドポイントにPOST送信します。
Lambdaで関数を実装
AWSにてLambda関数を実装していきます。
Lambdaのメニューにを開き、関数の作成を押下します。
一から作成を選択
関数名と使用言語を決定します。今回はnode.js 14を選択しました。
残りはロール等を決定し、関数を作成すると以下のようなサンプル関数が生成されます。
あとはこのサンプルを修正していきます。
const https = require('https')
exports.handler = async (event) => {
//外部api_key取得やguzzleでPOSTしたパラメータを受け取り加工
const url = //外部APIのurl
try {
const response = await request(url)
return {
statusCode: 200,
body: response
}
}
catch (error) {
return {
//responseとして返したいstatusCodeと内容
}
}
}
async function request(url) {
return new Promise((resolve, reject) => {
https.get(url,{timeout:10000}, (response) => {
let data = ‘’
response.on(‘data’, (chunk) => {
data += chunk
})
response.on(‘end’, () => {
resolve(data)
})
})
.on(‘error’, (error) => {
console.log(error)
reject(error)
})
.on(‘timeout’, () => {
console.log(“request timeout”)
reject(“timeout”)
})
})
}
外部ライブラリに依存せずリクエストを送りたいため下記を選択。
const https = require('https')
ここまで来たらAPI GatewayでREST APIを作成します。
API GatewayでREST APIを作成
今回はタイプはREST、新しいAPIを選択し、APIを作成します。
APIが作成されたら、エンドポイントを作成します。
リソース画面が表示され、リソース名とパスを決定します。
GETを選択し、チェックマークをクリック、リクエストを受けた時Lambda関数に処理を渡すよう設定してきます。Lambda関数に先ほど作成した関数名を設定します。
そしてデプロイすると
URLが生成され、APIを叩けるようになります。
このURLをguzzleから叩くように処理を書くと無事に
Laravel(Guzzle) → API Gateway → Lambda → 外部APIの流れが完了します。
以上、実装手順のご紹介でした。
初めて、API GatewayやLambdaを触りましたが、サーバーレスで少ない工数で実装できる事を実感しました。
簡単なアプリケーションでは今後もLambdaを使っていきたいです。
コメント