nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【AWS】.NET LambdaでPython LambdaをInvokeしてみた【サーバーレス】

この記事は.NET Core 3.1 の LambdaによるPython 3.9 の LambdaInvokeについて解説したものです。


こんにちは!らびです。今回は.NET Core 3.1 の LambdaからPython 3.9 の LambdaInvokeしていきます。

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がデプロイされていることを確認しましょう。

f:id:nomurabbit:20220120200340p:plain

.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; }
}

実行

それでは、実行してみましょう。API Gatewayで公開した.NET Lambdaにアクセスすると、Python Lambdaの結果が返ってくるのがわかります。


f:id:nomurabbit:20220120220547p:plain

まとめ

以上で.NET LambdaPython LambdaInvokeできました。

Pythonを使った数値計算APIもたくさん書けますね!

次回もぜひご覧ください。では!