ブラウザから直接AWS Lambdaファンクションを実行

2015.07.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回はLambdaファンクションをブラウザからAWS SDK for JavaScriptを利用して直接実行してみたいと思います。全体の流れとしてはAWS Lambda のファンクションをモバイルアプリから呼び出せるようになりました!と変わりません。LambdaはCORSにも対応しているので単にJavaScript SDKからLambdaのInvoke APIを呼び出すだけです。

Lambdaファンクションの作成

今回はHello Worldテンプレートをそのまま利用します。またファンクションのNameはHelloWorldとしました。ちなみに、今回は東京リージョンで作成しています。

invoke-lambda-from-browser1

IAM ユーザーの作成

JavaScript SDKからInvoke APIを実行するためのアクセスキーが欲しいので、IAMユーザーを作成します。必要なActionはlambda:InvokeFunctionだけです。予め用意されているAWSLambdaRoleが使えます。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": ["*"]
    }]
}

なお、アクセスキーのハードコードは推奨されていません。実際に利用する際はCognitoかWeb Identity Federationの利用を検討して下さい。

ブラウザからLambdaファンクションの実行

では実際にブラウザからLambdaファンクションを実行してみたいと思います。以下の様なHTMLファイルを作成します。Lambdaクラスを生成してinvokeメソッドを実行します。invokeメソッドの詳細はドキュメントをご参照下さい。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Invoke Lambda</title>
</head>
<body>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.36.min.js"></script>
  <script type="text/javascript">
            AWS.config.update({
                accessKeyId : '{your_access_key_id}',
                secretAccessKey : '{your_secret_access_key}'
            });
            AWS.config.region = 'ap-northeast-1';
            var lambda = new AWS.Lambda();
            var params = {
                FunctionName : 'HelloWorld',
                Payload : JSON.stringify({
                    "key1": "value1",
                    "key2": "value2",
                    "key3": "value3"
                  })
            };
            
            lambda.invoke(params, function(err, data) {
                if (err)
                    console.log(err, err.stack);
                else
                    alert(JSON.parse(data.Payload));
            });
        </script>
</body>
</html>

実際にアクセスするとkey1の値がアラートとして表示されました。

invoke-lambda-from-browser2

まとめ

Lambdaは東京リージョンでも利用できるようになりましたし、今後はEC2インスタンスを利用しないシステムも増えていきそうですね!