【AWS】.NET LambdaでPython LambdaをInvokeしてみた【サーバーレス】
この記事は.NET Core 3.1 の LambdaによるPython 3.9 の LambdaのInvokeについて解説したものです。
こんにちは!らびです。今回は.NET Core 3.1 の LambdaからPython 3.9 の LambdaをInvokeしていきます。
API Gatewayへのレスポンスは.NET、計算はPythonの構成でアプリが作れるようになります。
Python Lambdaの作成
まずはInvokeされる側、Python Lambdaを作成します。template.yamlはこんな感じです。
template.yaml内でLambdaのファンクション名を指定しているジョ。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app-20220118-01 Sample SAM Template for sam-app-20220118-01 # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 FunctionName: my_function_20220120_gpy_hello_nomurabbit Outputs: HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn
template.yamlの修正が終わったら、プログラムの修正です。hello_nomurabbitという文字列を返します。Pythonのコードはこんな感じです。
import json # import requests def lambda_handler(event, context): """Sample pure Lambda function Parameters ---------- event: dict, required API Gateway Lambda Proxy Input Format Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format context: object, required Lambda Context runtime methods and attributes Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html Returns ------ API Gateway Lambda Proxy Output Format: dict Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html """ # try: # ip = requests.get("http://checkip.amazonaws.com/") # except requests.RequestException as e: # # Send some context about this error to Lambda Logs # print(e) # raise e return { "statusCode": 200, "body": json.dumps({ "message": "hello_nomurabbit", # "location": ip.text.replace("\n", "") }), }
プログラムの修正が済んだら、ビルドとデプロイです。
コマンドはいつもの通りですね。
$sam build $sam deploy --guided
管理コンソールからLambdaがデプロイされていることを確認しましょう。
.NET Lambdaの作成
次に.NET Lambdaを作成します。
.NET Core3.1のテンプレートは、この記事やこの記事を参考指定してくださいだジョ。
ソースコードのポイントは下記の通りです。.NETもPythonもほぼ同じようにInvokeできるんですね。
private async Task<string> InvokeAccess(ApiRequestBody apiRequestBody) { try { var client = new AmazonLambdaClient(Amazon.RegionEndpoint.APNortheast1); var request = new InvokeRequest() { FunctionName = ApiUtil.MY_GPY_HELLO_NOMURABBIT, InvocationType = InvocationType.RequestResponse, Payload = JsonSerializer.Serialize(GetInvokePayload(apiRequestBody)) }; var response = await client.InvokeAsync(request); using(var stream = new StreamReader(response.Payload)) { return await stream.ReadToEndAsync(); } } catch (System.Exception e) { throw e; } }
1点だけ注意したいのが、Python Lambdaからのレスポンスの構造です。デシリアライズする場合は下記のようなクラスを作っておくとよいです。
public class ApiInvokeResponse { [JsonPropertyName("statusCode")] public int StatusCode { get; set; } [JsonPropertyName("body")] public string Body { get; set; } }