Lambda Custom RuntimeをCDKで簡単にデプロイする

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

目次

背景

S3バケットにUploadされたファイルの文字コード判別をNKFで行いたいが、EC2等がないのでLambdaで何とか実施したい。
また、他のLinuxコマンドを利用したいケースも出てきそう。

という事で、メンテナンス性も考慮しつつデプロイ工数も少なくなるようにCDKでCustom Runtime Lambdaをデプロイし、S3バケットにUploadされたファイルの文字コード・改行コード判別を実現してみました。

実装

ディレクトリ階層/作成したファイル

cdk initで作成した初期状態から下記ファイルを追加しています。

参考にした情報は下記となります。

チュートリアル – カスタムランタイムの公開
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html

ブートストラップのコードはサンプルコードそのまま。
function.sh の基本形もサンプルコードから流用しています。

[CDKProject名]-stack.ts

CDKで下記を実施しています。

  • Lambda用のポリシー/ロール作成
    S3バケットは無制限に読み込めてしまうので要絞り込み
  • Lambda Functionを docker-image ディレクトリ下のファイルから作成、上記ロールを付ける

Dockerfile

※後述しますが M1/M2等 Armアーキテクチャ MacでBuildする場合は –platform=linux/amd64 を有効化

AWSの提供する、Lambda用のDockerImage
https://hub.docker.com/r/amazon/aws-lambda-provided

bootstrap

チュートリアル – カスタムランタイムの公開
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html

サンプルコードのまま

function.sh

  1. jqを使い、jsonで引き渡されたイベント内容から、S3バケット名・オブジェクト名を取得
  2. S3からファイルをダウンロード (UUIDを用い複数呼ばれた場合を多少考慮)
  3. nkfで文字コード・改行コード推測
  4. ダウンロードしたファイル削除

※あくまでも最小限の動作確認サンプルとなります。

結果

S3Triggerを別途作成し、ファイルをUploadすると文字コード・改行コード結果が表示されました。

作成されたECRレポジトリ

作成されたLambda

通常のLambdaと異なり[コード]タブがありません。

まとめ

取り急ぎの動作確認環境としてささっと構築する事ができました。
ECRに自前でBuildしたImageのPush、IAMロール作成やら何やらを手動実施するとなると、頭痛が痛いと思いますのでCDKでの構築おすすめです!

Tips

CDKで短縮できたとはいえ、いくつかハマったポイントがありました。

lambda-entrypoint.sh: exec format error

何の事か分からないエラー、大変助かりました感謝

M1 MacでAWS Lambdaへ dockerイメージを cdk deploy すると exec format error になる
https://qiita.com/takurot/items/fd797caf8a2a830916bc

ローカル環境での動作確認

cdk deployしてDebugを繰り返すのは非効率なため、まずはLocalでdocker runしてテストイベントを食わせて動作確認をしていく事をお勧めします。
下記参照先にLocal実行方法の記載があります。

※DockerImageのビルドが成功し適切にデプロイ出来る状態であれば、CurlでイベントJSONをPOSTするとリクエスト内容をエコーしてくれる

AWSの提供する、Lambda用のDockerImage
https://hub.docker.com/r/amazon/aws-lambda-provided

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023-
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023- 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。