PHPからAWS Lambdaを直接実行する

事前にComposerでaws-sdk-phpをrequireしておきます。

composer require aws/aws-sdk-php
<?php
require 'vendor/autoload.php';
use Aws\Lambda\LambdaClient;
use Aws\Lambda\Exception\LambdaException;

function invoke_lambda () {
    $client = LambdaClient::factory(array(
        'profile' => 'profileName',
        'region'  => 'ap-northeast-1',
        'version' => '2015-03-31'
    ));
    $result = $client->invoke(array(
        'FunctionName' => 'lambdaFunctionName',
        'InvocationType' => 'Event',
        'LogType' => 'Tail',
        'Payload' => '{"paramName": "abcdef"}'
    ));
    var_dump($result);
}

invoke_lambda();

FunctionName

実行したいLambdaの名前を設定します。

InvocationType

LambdaをPHPから呼び出す際InvocationTypeの設定値によってLambdaの実行終了まで待つか非同期で実行するか選択することができます。

InvocationType 動作
Event 非同期実行
RequestResponse 同期実行

LogType

同期実行をした場合のみLogTypeが有効になります。Tailを設定しておくとログの最後のほうがBASE64形式で返ってくるのでデバッグする際など便利です。

Payload

Payloadに指定した値がLambdaのeventに渡されます。

ポリシー設定

実行権限が必要なので下記のようなポリシーを作成してロールに付与しておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "invokeLambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:<アカウントID>:function:<function名>"
        }
    ]
}

ロールが設定できないとき

ローカルから実行などアクセスキーを使用したいときは以下のようにdefaultProviderを使用すると~/.aws/configの設定を読みにいってくれます。

<?php
require 'vendor/autoload.php';
use Aws\Credentials\CredentialProvider;
use Aws\Lambda\LambdaClient;
use Aws\Lambda\Exception\LambdaException;

function invoke_lambda () {
    $provider = CredentialProvider::defaultProvider();
    $client = LambdaClient::factory(array(
        'region'  => 'ap-northeast-1',
        'version' => '2015-03-31',
        'credentials' => $provider,
    ));

    $result = $client->invoke(array(
        'FunctionName' => 'lambdaFunctionName',
        'InvocationType' => 'Event',
        'LogType' => 'Tail',
        'Payload' => '{"paramName": "abcdef"}'
    ));
    var_dump($result);
}

invoke_lambda();

参照