Edited at

AWS SAM (Ruby) でLambda関数を非同期に呼び出す方法

AWSのSAM (Serverless Application Model) でAPIを開発していて、少し時間のかかる処理をバックグラウンドで実行したいことがありました。大規模な処理であればSQSなどを使う必要があると思いますが、今回は単一の処理だったのでLambda関数を非同期で呼び出すようにしました。

以下の例ではFunctionAがAPIの処理で、FunctionAからFunctionBを非同期で呼び出しています。

tempplate.yamlでFunctionAにLambdaInvokePolicyを設定します。


template.yaml

  FunctionA:

Type: AWS::Serverless::Function
Properties:
FunctionName: FunctionA
CodeUri: app/
Handler: main.function_a
Policies:
- LambdaInvokePolicy:
FunctionName: !Ref FunctionB
Events:
SlackCallback:
Type: Api
Properties:
Path: /function_a
Method: post
RestApiId: !Ref ApiGateway
FunctionB:
Type: AWS::Serverless::Function
Properties:
FunctionName: FunctionB
CodeUri: app/
Handler: main.function_b

Rubyのコードは以下のようになります。Lambda関数を直接操作するときと違って、SAMから利用する際はAws::Lambda::Client.newの引数にregion:を指定する必要はありません。


main.rb

require 'aws-sdk-lambda'

def function_a(event:, context:)
params = {'message': 'Hello World'}

client = Aws::Lambda::Client.new
client.invoke({
function_name: 'FunctionB',
invocation_type: 'Event',
log_type: 'None',
payload: params.to_json
})

return {
statusCode: 200,
}
end

def function_b(event:, context:)
#
# do_something(event)
#
return {
statusCode: 200,
}
end


参考:Lambda 関数の実行