aws lambda invoke の使い方徹底解説!コマンドで関数を実行する方法


AWS Lambda invoke コマンド徹底解説! コマンドラインから関数を実行する方法

はじめに

クラウドコンピューティングの進化に伴い、サーバーレスアーキテクチャは多くの開発者や組織にとって不可欠な要素となりました。その中心的なサービスの一つが、Amazon Web Services (AWS) の AWS Lambda です。Lambdaを使用すると、サーバーのプロビジョニングや管理なしにコードを実行できます。イベントに応答してコードを実行し、使用したコンピューティング時間に対してのみ料金が発生します。

Lambda関数は、様々なAWSサービス(S3、DynamoDB、API Gatewayなど)からのイベントや、カスタムアプリケーションからのイベントによってトリガーされます。これらのトリガーとは別に、開発やテスト、デバッグ、あるいは特定の自動化タスクのために、コマンドラインからLambda関数を直接実行したい場合があります。ここで活躍するのが、AWS CLI (Command Line Interface) の aws lambda invoke コマンドです。

aws lambda invoke コマンドは、Lambda関数をオンデマンドで実行するための強力なツールです。本番環境でのAPI Gateway経由の呼び出しやイベント駆動型のワークフローとは異なり、このコマンドを使用することで、開発者はローカル環境から直接、またはスクリプトを通じて関数を呼び出し、その振る舞いをテストし、出力を検証することができます。

この記事では、aws lambda invoke コマンドの使い方を徹底的に解説します。基本的な構文から始まり、必須・オプションパラメータ、呼び出しタイプ(同期/非同期)、ペイロードの指定方法、レスポンスの処理、バージョンやエイリアスの利用、そして高度な使い方やトラブルシューティングに至るまで、このコマンドをマスターするために必要なすべての情報を提供します。

このコマンドを使いこなすことで、Lambda開発の効率を格段に向上させ、より堅牢なサーバーレスアプリケーションを構築できるようになるでしょう。さあ、aws lambda invoke の世界へ深く潜り込んでいきましょう。

AWS CLI のセットアップ

aws lambda invoke コマンドを使用するためには、まずお使いの環境にAWS CLIがインストールされ、適切に設定されている必要があります。まだセットアップがお済みでない場合は、以下の手順を参考にインストールと設定を行ってください。

AWS CLI のインストール

AWS CLI は、Windows、macOS、Linux など、主要なオペレーティングシステムで利用可能です。インストール方法は各OSによって異なります。最新かつ推奨されるインストール方法は、AWSの公式ドキュメントを参照するのが最も確実ですが、一般的には以下の方法が用いられます。

  • Windows: AWS CLIインストーラー (.msi ファイル) をダウンロードして実行します。
  • macOS: curl を使用してパッケージをダウンロードし、インストーラーを実行するか、Homebrew を使用します (brew install awscli)。
  • Linux: curl を使用してバンドルをダウンロードし、インストールスクリプトを実行するか、パッケージマネージャー (aptyum) を使用します。Python と pip がインストールされている場合は、pip install awscli でもインストール可能ですが、公式のバンドルインストーラーが推奨されています。

インストールが完了したら、ターミナルやコマンドプロンプトを開き、以下のコマンドを実行してバージョンを確認します。

bash
aws --version

バージョン情報が表示されれば、インストールは成功です。

AWS CLI の設定

AWS CLI をインストールしたら、AWSアカウントへのアクセスを設定する必要があります。これには、認証情報(アクセスキーIDとシークレットアクセスキー)とデフォルトリージョンの設定が含まれます。最も一般的な設定方法は aws configure コマンドを使用することです。

bash
aws configure

コマンドを実行すると、以下の情報の入力を求められます。

  1. AWS Access Key ID: AWSアカウントのIAMユーザーのアクセスキーIDを入力します。
  2. AWS Secret Access Key: IAMユーザーのシークレットアクセスキーを入力します。
  3. Default region name: デフォルトで使用するAWSリージョンを指定します (例: ap-northeast-1 for Tokyo, us-east-1 for N. Virginia)。
  4. Default output format: コマンドの出力形式を指定します (例: json, text, table)。特に指定がなければ json が一般的です。

これらの情報は ~/.aws/credentials ファイルと ~/.aws/config ファイルに保存されます。セキュリティのため、本番環境で使用するアクセスキーは、aws lambda invoke の実行に必要な最小限の権限のみを持つIAMユーザーに紐づけるべきです。具体的には、Lambda関数に対する lambda:InvokeFunction アクションの許可が必要です。

aws lambda invoke コマンドの基本

aws lambda invoke コマンドは、指定したLambda関数を実行します。基本的な構文は以下の通りです。

bash
aws lambda invoke \
--function-name <関数名> \
[オプション...] \
[出力先ファイル]

  • --function-name <関数名>: 呼び出すLambda関数の名前(またはARN、または部分的なARN)を指定する必須パラメータです。
  • [オプション...]: 呼び出しタイプ、ペイロード、バージョンなどを指定する様々なオプションです。
  • [出力先ファイル]: 同期呼び出しの場合に、Lambda関数のレスポンスボディを保存するファイルパスを指定します。これは必須ではありませんが、レスポンスを取得するためによく使用されます。

簡単な実行例

aws lambda invoke コマンドの動作を確認するために、簡単なLambda関数を作成してみましょう。例えば、以下のようなPython関数を考えます。

“`python

lambda_function.py

import json

def lambda_handler(event, context):
print(“Lambda function invoked!”)
print(f”Received event: {json.dumps(event)}”)

return {
    'statusCode': 200,
    'body': json.dumps({
        'message': 'Hello from Lambda!',
        'input_event': event
    })
}

“`

この関数をAWS Lambdaにデプロイし、関数名を MyTestFunction と仮定します。

デプロイ後、コマンドラインからこの関数を呼び出してみましょう。最もシンプルな呼び出しは、引数なしの同期呼び出しです。同期呼び出しでは、Lambda関数の実行が完了するまでコマンドは待ち、その結果を返します。結果を取得するために、出力先ファイルを指定します。

bash
aws lambda invoke \
--function-name MyTestFunction \
output.json

このコマンドを実行すると、Lambda関数が実行され、そのレスポンス(関数の return の内容)が output.json というファイルに保存されます。コマンド自体の出力には、実行のステータスコード(例えば 200)と、レスポンスの一部(ログテールのハッシュなど)が表示されます。

成功した場合のコマンド出力例:

{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}

output.json ファイルの内容例:

json
{
"statusCode": 200,
"body": "{\"message\": \"Hello from Lambda!\", \"input_event\": {}}"
}

Lambda関数のCloudWatch Logsを確認すると、「Lambda function invoked!」と「Received event: {}」というログが出力されていることが確認できます。初期状態ではペイロードを指定していないため、空のイベント {} が関数に渡されています。

呼び出しタイプ (--invocation-type)

aws lambda invoke コマンドでLambda関数を呼び出す際、その呼び出し方法を制御できます。これは --invocation-type オプションで指定します。指定可能な値は以下の3つです。

  1. RequestResponse (同期呼び出し)
  2. Event (非同期呼び出し)
  3. DryRun (ドライラン)

デフォルトは RequestResponse です。

1. RequestResponse (同期呼び出し)

RequestResponse は、最も一般的な呼び出しタイプであり、デフォルトの動作です。

  • 動作原理: クライアント(この場合はAWS CLI)がLambda関数を呼び出し、関数が実行を完了して結果を返すまで待ちます。Lambdaサービスは、関数の戻り値をクライアントに直接返します。
  • ユースケース: API Gatewayからの呼び出し、CLIからのテスト、モバイルアプリケーションやウェブアプリケーションからのバックエンド呼び出しなど、即座に結果が必要な場合に適しています。
  • レスポンスの取得: 関数の戻り値はHTTPレスポンスのボディとして返されます。aws lambda invoke コマンドでは、これを指定したファイルに保存します(前述の例の output.json)。コマンドの標準出力には、レスポンスヘッダーに含まれる情報(ステータスコード、実行されたバージョンなど)が表示されます。
  • エラー処理: 関数内でエラーが発生した場合、エラー情報を含む特別なペイロードが返されます。また、HTTPステータスコードがエラーを示す値(例: 500)になることがあります。Lambdaサービスの実行環境自体でエラーが発生した場合(例: 関数が見つからない、権限不足など)、そのエラー情報が返されます。

使用例:

bash
aws lambda invoke \
--function-name MyTestFunction \
--invocation-type RequestResponse \
response.json # 結果をresponse.jsonに保存

--invocation-type RequestResponse はデフォルトなので省略可能ですが、明示的に指定することもできます。

2. Event (非同期呼び出し)

Event タイプは、Lambda関数を非同期で呼び出します。

  • 動作原理: クライアント(AWS CLI)がLambda関数を呼び出すと、Lambdaサービスはリクエストを受け取り、そのリクエストを処理するための内部キューに登録します。CLIコマンドは、リクエストが正常に受け付けられたことを確認したら、すぐに完了して戻ります。Lambda関数はキューからリクエストを取得し、後で実行されます。クライアントは関数の実際の実行結果を直接受け取りません。
  • ユースケース: イベントソース(S3、SNS、SQSなど)からのイベント処理、バッチ処理、長時間かかる処理のトリガーなど、即座の応答が不要な場合に適しています。
  • レスポンス: aws lambda invoke コマンドを実行した直後には、Lambdaサービスがリクエストをキューに正常に登録したかどうかの確認応答(HTTP 202 Accepted)が返されます。関数の実際の実行結果や戻り値はコマンドラインには返されません。
  • エラー処理: 非同期呼び出しで関数実行中にエラーが発生した場合、Lambdaサービスはデフォルトで数回リトライします。リトライしても成功しない場合、そのイベントは破棄されるか、設定されていればデッドレターキュー(DLQ)やオンイベント失敗宛先に送信されます。CLIコマンドの実行時点では、関数の実行エラーは通知されません。

使用例:

bash
aws lambda invoke \
--function-name MyTestFunction \
--invocation-type Event \
--payload '{"message": "This is an async message"}' \
# 非同期なので出力ファイルは不要(指定しても中身は空)
/dev/null # 結果を破棄する場合

--invocation-type Event を指定すると、コマンドはすぐに完了し、例えば以下のような出力になります。

json
{
"StatusCode": 202
}

これはリクエストが正常に受け付けられたことを示しており、関数が実際に実行されたかどうかは保証しません。実行状況はCloudWatch Logsなどで確認する必要があります。

3. DryRun (ドライラン)

DryRun タイプは、Lambda関数を実際に実行せずに、呼び出しに必要な権限があるかなどをテストします。

  • 動作原理: Lambdaサービスはリクエストを受け取ると、呼び出し元のプリンシパル(IAMユーザーなど)が指定されたLambda関数を呼び出す権限を持っているか、関数が存在するかなどをチェックします。権限があればHTTP 204 No Contentを返し、権限がなければHTTP 403 Forbiddenのようなエラーを返します。関数自体は実行されません。
  • ユースケース: デプロイ後の権限確認、IAMポリシーのテストなど。
  • レスポンス: 権限があればHTTP 204 No Content、なければエラーが返されます。
  • エラー処理: 主に権限に関するエラーが検出されます。

使用例:

bash
aws lambda invoke \
--function-name MyTestFunction \
--invocation-type DryRun \
/dev/null # 結果はボディがないので不要

成功した場合の出力例:

json
{
"StatusCode": 204
}

これは、指定したユーザーが MyTestFunction を呼び出す権限を持っていることを示しています。

ペイロード (--payload)

Lambda関数の入力データは「イベント」と呼ばれ、JSON形式で関数に渡されます。aws lambda invoke コマンドでは、--payload オプションを使用してこのイベントデータを指定します。

--payload オプションには、以下の2つの方法でJSONデータを指定できます。

  1. JSON文字列を直接指定:
    bash
    aws lambda invoke \
    --function-name MyTestFunction \
    --payload '{"key1": "value1", "key2": 123}' \
    output.json

    この場合、JSON文字列は単一引用符 (') で囲むのが一般的です。JSON文字列内に含まれるダブル引用符 (") はエスケープする必要はありません。ペイロードが複雑な場合や、特殊文字が含まれる場合は、後述のファイルからの読み込みの方が便利です。

  2. ファイルからJSONデータを読み込む:
    まず、JSONデータを含むファイルを作成します。例えば、event.json というファイルに以下の内容を記述します。
    json
    {
    "name": "Alice",
    "age": 30,
    "city": "Tokyo"
    }

    次に、aws lambda invoke コマンドでこのファイルを指定します。ファイルパスの前に file:// プレフィックスを付けます。
    bash
    aws lambda invoke \
    --function-name MyTestFunction \
    --payload file://event.json \
    output.json

    この方法は、ペイロードが大きい場合や、複雑な構造を持つ場合に非常に有効です。

ペイロードの受け取り方(Lambda関数側):

Lambda関数では、このペイロードが関数のハンドラに渡される event 引数として渡されます。ランタイムによって、event 引数の型は異なります。

  • Python: dict 型として渡されます。json.loads() を行う必要はありません。
    python
    import json
    def lambda_handler(event, context):
    print(f"Received event: {json.dumps(event)}")
    # event['name'] などでアクセス可能
    return {
    'statusCode': 200,
    'body': json.dumps({'input_name': event.get('name', 'N/A')})
    }
  • Node.js: JavaScriptオブジェクト(JSONパース済み)として渡されます。
    javascript
    exports.handler = async (event) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    // event.name などでアクセス可能
    const response = {
    statusCode: 200,
    body: JSON.stringify({ input_name: event.name || 'N/A' }),
    };
    return response;
    };
  • Java: POJO (Plain Old Java Object) にマッピングできます(設定による)。または InputStreamOutputStream として扱えます。
  • Go: 構造体 (struct) にアンマーシャルできます。
  • .NET: POCO (Plain Old CLR Object) にマッピングできます。

aws lambda invoke で渡されたJSONペイロードは、Lambdaサービスによってパースされ、適切なデータ型に関数のハンドラへ渡されるため、開発者はペイロードの構造を把握していれば、それを直接コード内で利用できます。

バイナリペイロードの扱い (--cli-binary-format)

場合によっては、Lambda関数にバイナリデータを渡したいことがあります(例: 画像ファイル、オーディオデータなど)。AWS CLI v2では、デフォルトのバイナリ形式が変更されたため、バイナリデータをペイロードとして渡す際には --cli-binary-format オプションが必要になることがあります。

例えば、バイナリファイルをペイロードとして渡す場合:

“`bash

payload.bin はバイナリデータを含むファイル

aws lambda invoke \
–function-name MyBinaryFunction \
–payload fileb://payload.bin \
–cli-binary-format raw-in-base64-out \
output.json
“`

  • fileb://: ファイルパスの前に付けると、ファイルをバイナリデータとして読み込みます。
  • --cli-binary-format raw-in-base64-out: AWS CLI v2でバイナリデータを扱う際の推奨フォーマットです。CLIは入力(raw-in)をそのまま扱い、もし出力がバイナリならBase64エンコード(base64-out)しますが、Lambdaのinvokeコマンドの入力ペイロードは通常JSONなので、これは入力の処理に影響します。Lambda関数側でバイナリを受け取る場合は、Base64デコードが必要になります。

Lambda関数でバイナリペイロードを受け取る際は、通常Base64エンコードされた文字列として渡されるため、関数内で適切にデコードする必要があります。

レスポンスの処理

aws lambda invoke コマンドで RequestResponse タイプを使用した場合、Lambda関数の実行結果を取得できます。レスポンスは、主に以下の2つの部分から構成されます。

  1. コマンドの標準出力: HTTPレスポンスヘッダーに含まれるメタデータが表示されます。これには、HTTPステータスコード、実行された関数のバージョン、ログのタイプなどが含まれます。
  2. 指定したファイル: HTTPレスポンスボディ(Lambda関数の return の内容)が保存されます。

前述の例で見たように、成功した場合のコマンド出力は以下のようになります。

json
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}

  • StatusCode: Lambdaサービスの呼び出しのステータスコードです。200は成功、202は非同期呼び出しの受付成功、204はドライラン成功、その他はエラーを示します。
  • ExecutedVersion: 呼び出しによって実行された関数のバージョンまたはエイリアスを示します。$LATEST は最新バージョンです。

指定したファイル(例: output.json)には、Lambda関数のハンドラから返されたデータ(PythonやNode.jsでは return の内容)がJSON形式で保存されます。

json
{
"statusCode": 200,
"body": "{\"message\": \"Hello from Lambda!\", \"input_event\": {}}"
}

この例では、関数がAPI Gatewayプロキシ統合の形式でレスポンスを返しています。関数の戻り値が単なるJSONオブジェクトであれば、ファイルの内容はそれにそのままなります。

“`python

単純な戻り値の関数

def simple_handler(event, context):
return {“result”: “success”, “data”: event}
“`

これを呼び出した場合の output.json の内容:

json
{
"result": "success",
"data": {}
}

エラーレスポンスの解釈

Lambda関数が実行時にエラーを発生させた場合(例: 例外の発生)、同期呼び出しではそのエラー情報がレスポンスとして返されます。

例えば、Python関数で意図的にエラーを発生させてみます。

python
def error_handler(event, context):
raise Exception("Something went wrong!")

この関数を呼び出し、結果を error_output.json に保存します。

bash
aws lambda invoke \
--function-name ErrorTestFunction \
error_output.json

コマンド出力には、StatusCode が 200 と表示される場合がありますが、これは呼び出しリクエスト自体は成功したことを意味します。関数の 実行 中のエラーは、レスポンスボディや特別なヘッダーで通知されます。

error_output.json の内容は以下のようになります。

json
{
"errorType": "Exception",
"errorMessage": "Something went wrong!",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 2, in error_handler\n raise Exception(\"Something went wrong!\")\n"
]
}

また、HTTPレスポンスヘッダーには、X-Amz-Function-Error-Type というヘッダーが含まれることがあります。aws lambda invoke コマンドでは、このヘッダー情報の一部がコマンドの標準出力に表示されることもあります(CLIのバージョンによる)。エラーが発生した場合、StatusCode は 200 であっても、このエラータイプヘッダーやレスポンスボディの内容を確認して、関数が成功したのか、実行時エラーが発生したのかを判断する必要があります。

ログの取得 (--log-type Tail)

Lambda関数の実行中に発生したログ(print文やconsole.logなど)は、通常CloudWatch Logsに非同期で送信されます。しかし、aws lambda invoke コマンドで同期呼び出しを行う場合、--log-type Tail オプションを使用することで、関数の実行ログをBase64エンコードされた形式でレスポンスの一部として取得できます。

bash
aws lambda invoke \
--function-name MyTestFunction \
--log-type Tail \
output_with_log.json

このコマンドを実行すると、output_with_log.json ファイルにレスポンスボディが保存されるのに加えて、コマンドの標準出力に以下のような情報が表示されます。

json
{
"StatusCode": 200,
"LogResult": "ZnVuY3Rpb24gbG9ncwoyMDIzL...", // Base64エンコードされたログ
"ExecutedVersion": "$LATEST"
}

LogResult の値はBase64エンコードされた文字列です。これをデコードすると、関数の実行ログが表示されます。Base64デコードは、OSのコマンドやプログラミング言語の機能を使用して行えます。

Linux/macOS でのデコード例:

“`bash

invoke コマンドで取得した LogResult の Base64 文字列をデコード

echo “ZnVuY3Rpb24gbG9ncwoyMDIzL…” | base64 –decode
“`

Python でのデコード例:

python
import base64
encoded_log = "ZnVuY3Rpb24gbG9ncwoyMDIzL..."
decoded_log = base64.b64decode(encoded_log).decode('utf-8')
print(decoded_log)

--log-type Tail オプションは、ローカルでの開発やデバッグ時に、CloudWatch Logsを確認する手間を省き、即座に実行ログを確認できるため非常に便利です。ただし、取得できるログのサイズには制限があります。

様々なオプションの詳細

aws lambda invoke コマンドには、上記以外にもLambda関数の呼び出しをより詳細に制御するための様々なオプションがあります。

--qualifier

このオプションを使用すると、呼び出すLambda関数の特定のバージョンまたはエイリアスを指定できます。

  • バージョンの指定: 関数がデプロイされるたびに新しいバージョンが作成されます(手動または自動)。バージョンは数値で識別されます(例: 1, 2)。特定のバージョンを指定して呼び出すことで、過去のコードバージョンの動作を確認できます。
    bash
    aws lambda invoke \
    --function-name MyTestFunction \
    --qualifier 1 \
    output_v1.json
  • エイリアスの指定: エイリアスは、特定のバージョンを指す名前付きポインタです(例: PRODUCTION, DEVELOPMENT)。エイリアスを使用すると、基盤となるバージョンを変更しても、呼び出し元は同じエイリアスを参照し続けることができます。これはデプロイ戦略(カナリアリリースなど)や環境分離に便利です。
    bash
    aws lambda invoke \
    --function-name MyTestFunction \
    --qualifier PRODUCTION \
    output_prod.json

--qualifier を指定しない場合、デフォルトで $LATEST バージョンが呼び出されます。$LATEST バージョンが最も頻繁に変更されるため、本番運用ではエイリアスや特定のバージョンを指定することが推奨されます。

--cli-binary-format

前述の「バイナリペイロードの扱い」で説明したように、AWS CLI v2でバイナリデータを扱う際のフォーマットを指定します。raw-in-base64-out が一般的な選択肢です。

--endpoint-url

このオプションを使用すると、AWS Lambdaサービスのデフォルトエンドポイント以外を指定できます。これは、ローカルでLambda関数をエミュレートしてテストできるツール(例: LocalStack, AWS SAM CLI の sam local invoke)を使用する場合に便利です。

“`bash

LocalStack が起動している場合(デフォルトのLambdaポートは4574など)

aws lambda invoke \
–function-name MyTestFunction \
–endpoint-url http://localhost:4574 \
output.json
“`

--region

AWS CLI の設定でデフォルトリージョンを設定している場合でも、このオプションを使用して特定のコマンドに対して異なるリージョンを指定できます。

bash
aws lambda invoke \
--function-name MyTestFunctionInOsaka \
--region ap-northeast-3 \
output.json

--profile

複数のAWSアカウントやユーザーの認証情報が設定されている場合、このオプションを使用して使用するプロファイルを指定できます。プロファイルは ~/.aws/credentials または ~/.aws/config ファイルで設定されます。

“`bash

~/.aws/credentials に [dev-account] というプロファイルがある場合

aws lambda invoke \
–function-name MyTestFunction \
–profile dev-account \
output.json
“`

その他の一般的なAWS CLIオプション

aws lambda invoke コマンドも、他のAWS CLIコマンドと同様に、AWS CLIが提供する一般的なオプションをサポートしています。

  • --output: コマンド自体の出力形式を指定します(json, text, table)。これはLambda関数のレスポンスボディの形式ではなく、StatusCode などが表示される標準出力の形式です。
  • --color: 出力の色付けを制御します(on, off, auto)。
  • --query: コマンドの出力から特定の情報を抽出するためにJMESPathクエリを指定します。これは、スクリプトでコマンド出力の一部を処理する際に非常に便利です。
    bash
    # StatusCode のみを取得
    aws lambda invoke --function-name MyTestFunction --output json /dev/null --query 'StatusCode'
  • --no-paginate: ページネーションが行われる可能性があるコマンド(invokeは通常ページネーションしませんが、他のコマンドで)で、すべての結果を一度に取得します。

これらのオプションを組み合わせることで、より柔軟かつ自動化に適した形で aws lambda invoke コマンドを使用できます。

Lambda関数と invoke コマンドの連携例

aws lambda invoke コマンドは、Lambda関数の開発ライフサイクルにおいて様々な場面で活用できます。

1. シンプルなテストの実行

最も基本的な使い方は、作成・更新したLambda関数が期待通りに動作するかをテストすることです。

例えば、ユーザー情報を処理する関数 processUser があるとします。

“`python

process_user.py

import json

def lambda_handler(event, context):
try:
user_id = event[‘userId’]
user_data = fetch_user_from_database(user_id) # 仮の関数
if user_data:
processed_data = process_data(user_data) # 仮の関数
return {
‘statusCode’: 200,
‘body’: json.dumps(processed_data)
}
else:
return {
‘statusCode’: 404,
‘body’: json.dumps({‘message’: ‘User not found’})
}
except KeyError:
return {
‘statusCode’: 400,
‘body’: json.dumps({‘message’: ‘Missing userId in event’})
}
except Exception as e:
print(f”Error processing user: {e}”)
return {
‘statusCode’: 500,
‘body’: json.dumps({‘message’: ‘Internal server error’})
}

仮の関数

def fetch_user_from_database(user_id):
if user_id == ‘user123’:
return {‘id’: ‘user123’, ‘name’: ‘Alice’, ‘status’: ‘active’}
return None

def process_data(data):
return {‘id’: data[‘id’], ‘processedName’: data[‘name’].upper(), ‘status’: data[‘status’]}

“`

この関数をデプロイし、processUser という名前で利用可能になったとします。以下のコマンドでテストできます。

有効なユーザーIDでテスト:

bash
aws lambda invoke \
--function-name processUser \
--payload '{"userId": "user123"}' \
output_success.json

output_success.json の内容を確認すると、処理されたデータが含まれているはずです。

存在しないユーザーIDでテスト:

bash
aws lambda invoke \
--function-name processUser \
--payload '{"userId": "user999"}' \
output_notfound.json

output_notfound.json の内容を確認すると、”User not found” のメッセージが含まれているはずです。

ペイロードが不正な場合(userIdなし)でテスト:

bash
aws lambda invoke \
--function-name processUser \
--payload '{}' \
output_badrequest.json

output_badrequest.json の内容を確認すると、”Missing userId in event” のメッセージが含まれているはずです。

このように、様々な入力パターンを試すことで、関数のエラーハンドリングも含めた基本的な動作確認が容易に行えます。

2. 特定のイベント構造を模倣したテスト

Lambda関数は、様々なAWSサービスからのイベントをトリガーとして実行されます。これらのイベントはそれぞれ固有のJSON構造を持っています(S3イベント、SQSメッセージ、API Gatewayプロキシリクエストなど)。aws lambda invoke コマンドを使用する際には、これらの実際のイベント構造を模倣したJSONファイルを payload として渡すことで、トリガーサービスからの呼び出しをシミュレーションできます。

例えば、S3バケットにファイルがアップロードされたときにトリガーされるLambda関数 processS3Upload をテストしたい場合、実際のS3 PutイベントのJSON構造を模倣した s3_put_event.json ファイルを作成します。

json
{
"Records": [
{
"eventVersion": "2.1",
"eventSource": "aws:s3",
"awsRegion": "us-east-1",
"eventTime": "2023-10-27T10:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "AWS:AIDAINVALID"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "REQUESTID",
"x-amz-id-2": "HOSTEDID"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigId",
"bucket": {
"name": "my-test-bucket",
"ownerIdentity": {
"principalId": "AWS:AIDAINVALID"
},
"arn": "arn:aws:s3:::my-test-bucket"
},
"object": {
"key": "path/to/my/uploaded_file.txt",
"size": 1024,
"eTag": "etagvalue",
"sequencer": "sequencer"
}
}
}
]
}

このファイルをペイロードとして使用して関数を呼び出します。

bash
aws lambda invoke \
--function-name processS3Upload \
--payload file://s3_put_event.json \
output_s3.json

これにより、S3イベントによって関数がトリガーされたかのように、そのハンドラが実行され、event 引数に s3_put_event.json の内容が渡されます。これは、ローカル開発環境やCI環境で、実際のAWSサービスに依存せずにLambda関数のイベント処理ロジックをテストするのに非常に効果的です。AWSドキュメントや実際にトリガーされるイベントのCloudWatch Logs出力を参照して、正確なイベント構造を把握することが重要です。

3. 非同期処理のトリガー

--invocation-type Event を使用することで、Lambda関数を非同期でトリガーできます。これは、CLIコマンドを実行した後に完了を待たずに、バックグラウンドで処理を実行させたい場合に便利です。

例えば、レポート生成やデータのクリーンアップなど、時間がかかるバッチ処理をLambda関数 runBatchJob で実行する場合、以下のように非同期呼び出しを行います。

bash
aws lambda invoke \
--function-name runBatchJob \
--invocation-type Event \
--payload '{"date": "2023-10-27", "type": "daily_report"}' \
/dev/null

このコマンドはすぐに完了し、Lambdaサービスは指定されたペイロードを含むイベントを内部キューに登録します。関数は後で実行されます。コマンドの出力は StatusCode: 202 となるだけです。実際の処理の進捗や結果は、CloudWatch Logsや関数内で別途設定した通知(SNS、SQSなど)を通じて確認する必要があります。

4. CI/CDパイプラインでの利用

aws lambda invoke コマンドは、CI/CDパイプラインにおいて自動化されたテストやデプロイ後の検証ステップとして組み込むことができます。

  • デプロイ後の健全性チェック (Sanity Check): 新しいバージョンのLambda関数をデプロイした後、invoke コマンドを使用して簡単なテストペイロードで関数を呼び出し、正常に実行されるか、予期せぬエラーが発生しないかを確認します。同期呼び出し (RequestResponse) を使用し、ステータスコードやレスポンスボディの内容をチェックします。
  • 統合テスト: 複数のLambda関数や他のAWSサービスが連携するシステムにおいて、エンドツーエンドの統合テストの一部として特定のLambda関数をトリガーするために invoke コマンドを使用します。
  • データ生成や設定: テスト環境の構築やデータ投入のために、特定の処理を行うLambda関数を invoke コマンドで呼び出すことができます。

CI/CDスクリプト内で aws lambda invoke コマンドを使用する場合、--output json オプションと --query オプションを組み合わせて、コマンドの出力から必要な情報(StatusCodeLogResult、レスポンスボディの内容など)をプログラム的に抽出し、その後の処理や結果の判定に利用することが多いです。また、エラー発生時には非ゼロの終了コードを返すようにスクリプトを記述し、パイプラインの失敗として検出できるようにします。

高度な使い方と応用例

VPC内Lambdaの呼び出し

Lambda関数がVPC内に配置されている場合、その関数を呼び出すAWS CLIは、Lambdaサービスエンドポイントにアクセスできる必要があります。Lambdaサービスエンドポイントはパブリックに利用可能なので、通常は問題なく呼び出せます。

しかし、Lambda関数がVPC内のリソース(RDSデータベース、ElastiCacheなど)にアクセスする場合、関数の実行環境はVPC内のサブネットに関連付けられ、セキュリティグループが適用されます。aws lambda invoke コマンド自体はLambdaサービスのAPIエンドポイントを呼び出すだけであり、関数の実行環境がどこにあるかは直接的には影響しません。

セキュリティグループとIAM:

  • Lambda関数がVPC内のリソースにアクセスできるようにするには、関数の実行ロールにVPC関連のリソースを作成・管理するためのIAM権限が必要です。
  • Lambda関数に関連付けられたセキュリティグループは、関数が必要なリソース(データベースなど)にアクセスできるように、適切なアウトバウンドルールを持つ必要があります。

aws lambda invoke コマンドを実行するIAMユーザー(またはロール)には、対象のLambda関数に対する lambda:InvokeFunction 権限が必要です。VPC内に配置された関数であっても、この権限の要件は変わりません。

エラー処理とデバッグ

aws lambda invoke コマンドは、Lambda関数のデバッグに非常に役立ちます。

  • 同期呼び出し時のエラー情報: 前述のように、RequestResponse 呼び出し時に発生した関数内のエラー(例外)は、レスポンスボディや X-Amz-Function-Error-Type ヘッダーを通じて確認できます。これらの情報を基に関数内の問題を特定できます。
  • 非同期呼び出し時のエラー追跡: Event 呼び出しでエラーが発生した場合、直接的な通知はありません。デバッグにはCloudWatch Logs、X-Rayトレース、および設定されたDLQやオンイベント失敗宛先(SQS/SNS)を確認する必要があります。aws lambda invoke コマンド自体は非同期呼び出しがLambdaサービスに受け付けられたかどうかの確認にとどまります。
  • --log-type Tail を活用したデバッグ: 同期呼び出し時に --log-type Tail オプションを使用すると、関数の実行ログを即座に確認できます。これにより、print文やロガー出力を使ったデバッグが効率的に行えます。エラー発生時のスタックトレースもログに含まれるため、問題の原因特定に役立ちます。
  • 特定の入力でエラーを再現: aws lambda invoke コマンドと --payload オプションを使用すると、問題が発生した特定のイベントデータを正確に関数に渡して、エラーをローカルで再現させることができます。これにより、本番環境で発生したエラーを開発環境で調査・修正しやすくなります。

AWS SAM CLI や CDK との連携

サーバーレスアプリケーションの開発には、AWS SAM (Serverless Application Model) CLI や AWS CDK (Cloud Development Kit) といったフレームワークがよく利用されます。これらのツールも内部的に aws lambda invoke コマンド(またはそれと同等のAPI呼び出し)を使用して、ローカルでのテストやデプロイされた関数の呼び出しを行います。

  • AWS SAM CLI: sam local invoke コマンドは、Lambda関数をローカルのDockerコンテナ内で実行し、あたかも aws lambda invoke で呼び出されたかのようにテストできます。また、sam invoke コマンドは、デプロイ済みのLambda関数を呼び出す際に内部で aws lambda invoke を利用しています。
  • AWS CDK: CDKで構築したLambda関数も、デプロイ後に aws lambda invoke コマンドを使用して呼び出すことができます。CDKは関数の物理名やARNを出力できるため、それを invoke コマンドの --function-name に指定します。

これらのツールと aws lambda invoke コマンドを組み合わせることで、開発からデプロイ、テスト、デバッグに至るまで、サーバーレス開発のワークフロー全体を効率化できます。

トラブルシューティング

aws lambda invoke コマンドを使用する際に遭遇する可能性のある一般的な問題とその対処法をいくつか紹介します。

1. 認証情報または権限のエラー

  • エラー例: An error occurred (UnrecognizedClientException) when calling the Invoke operation: The security token included in the request is invalid.
    • 原因: AWS CLIが使用している認証情報が無効または期限切れです。
    • 対処法: aws configure コマンドを再実行して、正しいアクセスキーIDとシークレットアクセスキーを設定してください。環境変数やIAMロールを使用している場合は、それらが正しく設定されているか確認してください。
  • エラー例: An error occurred (AccessDeniedException) when calling the Invoke operation: User: arn:aws:iam::ACCOUNT_ID:user/YOUR_USER is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME
    • 原因: AWS CLIを使用しているIAMユーザーまたはロールに、対象のLambda関数に対する lambda:InvokeFunction 権限がありません。
    • 対処法: IAMコンソールまたはIAM CLIを使用して、該当するIAMユーザー/ロールに lambda:InvokeFunction アクションを許可するポリシーがアタッチされているか確認し、必要であれば追加してください。リソースARNが正しいことを確認してください(特にバージョンやエイリアスを指定している場合)。

2. 関数が見つからないエラー

  • エラー例: An error occurred (ResourceNotFoundException) when calling the Invoke operation: Function not found: arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME
    • 原因: 指定した関数名、ARN、またはエイリアス/バージョンが存在しません。
    • 対処法: 関数名やARNが正しいことを確認してください。--qualifier オプションを使用している場合は、指定したバージョンやエイリアスが関数に存在するか確認してください。デプロイが完了しているかどうかも確認してください。

3. ペイロード形式のエラー

  • エラー例: An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unexpected character ('<' (code 60)) at index 0
    • 原因: --payload オプションに指定したJSON文字列またはファイルの内容が、有効なJSON形式ではありません。
    • 対処法: ペイロードとして指定したJSON文字列やファイルの内容をエディタやJSONバリデーターで確認し、構文エラーがないか修正してください。特に、引用符の不一致や不正な文字がないか確認してください。

4. Lambda関数の実行エラー

  • エラー例: 同期呼び出しで StatusCode: 200 が返されるが、output.json ファイルにエラー情報が含まれている場合や、--log-type Tail でエラーログが表示される。
    • 原因: Lambda関数自体のコード内で例外が発生したか、実行環境の問題が発生しました(例: メモリ不足、タイムアウト)。
    • 対処法:
      • --log-type Tail オプションで実行ログを確認し、エラーメッセージやスタックトレースから原因を特定してください。
      • CloudWatch Logsで関数のロググループを確認し、より詳細なログやエラー情報を取得してください。
      • 関数に割り当てられたメモリやタイムアウト設定を確認し、必要であれば増やしてください。
      • VPC内に配置された関数の場合、セキュリティグループやネットワークACLの設定が原因で外部リソースにアクセスできない可能性も考慮してください。

5. 非同期呼び出し時の確認

  • 問題: Event タイプで呼び出したが、関数が実行されたかどうかわからない。
    • 対処法: 非同期呼び出しでは、コマンドの成功(StatusCode: 202)はリクエストの受付成功のみを意味します。関数の実際の実行状況は、CloudWatch Logsの関数ロググループで確認する必要があります。ログが出力されていない場合は、関数の設定(トリガー、権限など)やリトライ設定、DLQ設定を確認してください。

6. CLIバージョンに関する問題

AWS CLI v1とv2では、特にバイナリデータの扱いや一部のデフォルト挙動が異なります。もし古いドキュメントやスクリプトを参照している場合は、使用しているAWS CLIのバージョンに合った使い方をしているか確認してください。特に --cli-binary-format オプションはv2で追加されたものです。

セキュリティに関する考慮事項

aws lambda invoke コマンドを使用する際には、セキュリティについて以下の点を考慮することが重要です。

  • IAM権限の管理: lambda:InvokeFunction 権限は、任意のユーザーが指定した関数を実行できてしまうため、非常に強力です。この権限は、 Lambda関数を呼び出す必要のあるIAMユーザーやロールにのみ、最小限の範囲(特定のリソース、条件付きなど)で付与すべきです。特に本番環境の関数を開発者全員が自由に呼び出せるようにするのは避けるべきです。
  • ペイロードに含まれる機密情報: aws lambda invoke コマンドの --payload オプションで渡すデータに、パスワードやAPIキーなどの機密情報を含めないように注意してください。もし関数が機密情報を必要とする場合は、AWS Secrets ManagerやAWS Systems Manager Parameter Storeなどの安全な方法で取得するように関数を設計し、ペイロードではIDなどの非機密情報のみを渡すようにしてください。ペイロードはCloudWatch Logsなどに出力される可能性もあります。
  • VPC内のLambdaとセキュリティグループ: Lambda関数をVPC内に配置する場合、関連付けられたセキュリティグループのアウトバウンドルールを適切に設定し、関数が必要とするリソース(データベースなど)へのアクセスのみを許可するようにしてください。不要なポートやIPアドレスへのアクセスを許可しないことが重要です。
  • CLI履歴のセキュリティ: コマンドラインの履歴には、実行したコマンド(ペイロードを含む場合もある)が保存されることがあります。機密情報を含むペイロードを直接コマンドラインで指定することは避けるべきです。ファイルからペイロードを読み込む (file://) 方が、履歴に残りにくいためより安全です。また、共有環境の端末を使用する場合は、コマンド履歴の設定を確認することも推奨されます。

まとめ

この記事では、AWS Lambdaの aws lambda invoke コマンドについて、その基本的な使い方から高度な応用例、そしてトラブルシューティングに至るまで、詳細に解説しました。

aws lambda invoke コマンドは、Lambda関数を開発、テスト、デバッグする上で非常に強力で便利なツールです。

  • 開発段階: 作成中の関数に様々な入力(ペイロード)を与え、期待通りの出力が得られるか、エラーハンドリングが適切かなどを素早く確認できます。
  • テスト段階: 実際のイベントソースからのイベントを模倣したペイロードを作成し、本番に近いシナリオでの関数の動作を検証できます。CI/CDパイプラインに組み込んで自動テストの一部とすることも可能です。
  • デバッグ段階: エラーが発生した際の特定の入力パターンを再現したり、--log-type Tail オプションで即座に実行ログを確認したりすることで、問題の原因特定と修正を効率化できます。
  • 手動実行/自動化: 特定のタスク(バッチ処理の開始など)をオンデマンドで実行したり、スクリプトを通じて自動化されたワークフローの一部として関数を呼び出したりできます。

同期呼び出し (RequestResponse)、非同期呼び出し (Event)、ドライラン (DryRun) といった呼び出しタイプを理解し、ペイロードの指定方法、レスポンスの処理、そして --qualifier などの各種オプションを適切に使い分けることが、aws lambda invoke コマンドをマスターする鍵です。

サーバーレス開発において、Lambda関数の外部からの呼び出し方法を深く理解することは、アプリケーション全体の設計、テスト、運用において非常に重要です。この記事で解説した内容が、皆様のAWS Lambda開発の一助となれば幸いです。

さらに詳細な情報や最新の機能については、AWS公式ドキュメントのAWS CLIコマンドリファレンス(特に aws lambda invoke のページ)を参照することをお勧めします。継続的な学習と実践を通じて、サーバーレスアーキテクチャの可能性を最大限に引き出してください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール