Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

[AWS CDK]PythonのDocker Imageを使ってLambdaを動かす[デプロイ]

Icon in a callout block
Python 100Days Challenge Day30

AWS CDKにおいて、PythonのDocker Imageを使ってLambdaを動かしてみる。

前回の記事はこちら

https://tomomemo.dev/posts/aws-cdk-lambda-docker/

本来であれば、AWS SAM cliを使って動作テストをローカル環境でしたほうがいいが今回は割愛。とりあえずは指定されたURLでmain.pyの中身が表示されればOKとする。

aws-cdk-lambdatack.tsファイルに下記を書き込む

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from "aws-cdk-lib/aws-lambda"

export class AwsCdkLambdaStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // lambda関数を定義
    const dockerFunc = new lambda.DockerImageFunction(this, "DockerFunc", {
      code: lambda.DockerImageCode.fromImageAsset("./image"),
      memorySize: 1024,
      timeout: cdk.Duration.seconds(10),
      architecture: lambda.Architecture.ARM_64
    });

    // lambda関数にURLを追加してインターネット経由でlambda関数を呼び出す
    const functionUrl = dockerFunc.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
      cors: {
        allowedMethods: [lambda.HttpMethod.ALL],
        allowedHeaders: ["*"],
        allowedOrigins: ["*"],
      },
    });

    // CloudFormationに出力値を追加する
    new cdk.CfnOutput(this, "FunctionUrlValue", {
      value: functionUrl.url,
    });
  }
}

これだと開発しづらいのでこう書き直す↓

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from "aws-cdk-lib/aws-lambda"

export class AwsCdkLambdaStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // lambda関数を作成する
    const dockerFunc = this.createLambdaFunction();
    
    // lambda関数にURLを追加する
    const functionUrl = this.addFunctionUrl(dockerFunc);

    // CloudFormationに出力値を追加する
    this.addFunctionUrlOutput(functionUrl);
  }

  // Lambda関数を作成するメソッド
  private createLambdaFunction(): lambda.DockerImageFunction {
    return new lambda.DockerImageFunction(this, "DockerFunc", {
      code: lambda.DockerImageCode.fromImageAsset("./image"),
      memorySize: 1024,
      timeout: cdk.Duration.seconds(10),
      architecture: lambda.Architecture.ARM_64
    });
  }

  // Lambda関数にURLを追加するメソッド
  private addFunctionUrl(dockerFunc: lambda.DockerImageFunction): lambda.FunctionUrl {
    const corsSettings = {
      allowedMethods: [lambda.HttpMethod.ALL],
      allowedHeaders: ["*"],
      allowedOrigins: ["*"],
    };

    return dockerFunc.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
      cors: corsSettings
    });
  }

    // CloudFormationに出力値を追加するメソッド
    private addFunctionUrlOutput(functionUrl: lambda.FunctionUrl): void {
      new cdk.CfnOutput(this, "FunctionUrlValue", {
        value: functionUrl.url,
      });
    }
}

main.pyはこう書く

import numpy as np 

def handler(event, context):
    arr = np.random.randint(0, 10, (3, 3))
    return {
        "statusCode": 200, 
        "body": {
            "message": "I've done the 30-day challenge!! Woow!!",
            "array": arr.tolist()     
             },
    }

配列とメッセージが表示されれば、今回作成するlambda関数の実装は成功とする。

aws cliがインストールされていて、かつaws configureコマンドでアクセスキーやシークレットキーがPC内で設定されているようにしておく。(今回は割愛)

下記コマンドをたたけば色々表示されるので確認しておく

aws sts get-caller-identity --profile <your-profile>

>
{
    "UserId": "********************",
    "Account": "********************",
    "Arn": "arn:aws:iam::*********:user/your-profile"
}

デプロイに必要なIAMロールなどを自動で作成する。初回に一度だけ実行する

cdk bootstrap --profile your-profile

デプロイ前にtsファイルをjsにトランスパイルする

npm run build

cdkデプロイコマンドをたたく

cdk deploy --profile your-profile

  • AWS consoleで確認
    • CloudFormationにアプリスタックが作成されている
    • Lambdaにも関数が作成されていることを確認する

ソースコードはこちら

https://github.com/tomohiro-dev/aws-cdk-lambda

30日連続で学ぶことができたので一旦休憩。

Pythonよりも優先して学ぶことが出てきたので切り替えます。

→Laravelの学び直し

Powered by Tomo with passion.