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の学び直し