【Laravel】Guzzle、API Gateway、Lambdaを使って外部APIを叩く

読んで欲しい方

この記事では以下の方に読んでいただきたいです。

  • Guzzleを使ってPOST通信をしたい
  • API Gateway、Lambdaを使って簡単なアプリケーションを作りたい
  • Lambdaから外部APIを叩きたい

環境は以下の通りです。

  • PHP:7.3
  • Guzzle:6.3
  • Lambda:node14

取得したEmailを外部APIを使って、スパムに該当するメールアドレスかどうかをチェックするシステムを構築しました。

データの流れとしては、Laravel → API Gateway → Lambda → 外部API

となります。Laravelの部分は具体例で、複数の箇所からLambdaに処理を送っています。

実装順序としては下記の通り追っていきます。

  1. GuzzleでPOST送信を実装
  2. Lambda関数の作成
  3. 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を使っていきたいです。

コメント

タイトルとURLをコピーしました