はじめに
以前、コンテナイメージからLambdaを作りました。
ところが諸事情(Amazon Linuxでは、PowerShellが十全に動かせず、MS365の監査ログが取得できない)のため、Ubuntuをベースとしたコンテナを作ろうとした際に、わかったことややったことを記事にします。
参考
コンテナイメージを使ったLambdaの仕組みについての解説は以下になります。
Dockerfileの作り方の参考にしたのは以下です。
Lambda動作の仕組み
公式の解説に書いてある内容の自分なりの解釈です。
- Lambda関数を実行するには、Lambdaサービスとランタイムの間で対話が必要
- 普通のコンテナイメージそのままでは、この対話ができないのでLambdaでは動かない
- AWSが提供するLambdaのベースイメージには、これらが実装済み
- 自前のコンテナの場合は、AWS提供の言語ごとのRuntime Interface Client(RIC)を組み込むと楽
環境
以前と同じ、Cloud9だけになります。
やったこと
以前と同じようにディレクトリやファイルを作っていきます。
# プロジェクトディレクトリ作成
mkdir sample-ecr-lambda
cd sample-ecr-lambda
# リージョンとアカウントIDを環境変数にセット
## 記事の中では直接使いませんが、ECRを作成したりPUSHしたりする際に使います
REGION="ap-northeast-1"
ACCOUNTID=$(aws sts get-caller-identity --output text --query Account)
# ファイル作成
touch app.py
touch Dockerfile
app.py
import json
def handler(event, context):
return {
"statusCode": 200,
"body": json.dumps(
{
"message": "hello world",
}
),
}
ベースイメージを素のUbuntuから作るので、Dockerfileは以前のものと異なります。
- 素のUbuntuには、Pythonとpipが入っていないのでインストール
- Python用のRICをインストール
- エントリポイントとして、インストールしたRICを指定
Dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3-pip
RUN mkdir /function && \
pip install --target /function awslambdaric
COPY app.py /function/
WORKDIR /function
ENTRYPOINT [ "/usr/bin/python3", "-m", "awslambdaric" ]
CMD [ "app.handler" ]
このDockerfileでイメージを作成します。
docker build -t func1 .
あとは以前と同じような流れになります。
- ECRリポジトリ作成
- イメージPUSH
- Lambada作成
おわりに
今回はLambdaの実行に必要なRICの話と、Ubuntuで動かす方法について記事にしました。
自前のイメージから作成する方法の情報収集の最初にRICのことが知れ、大きく時間を無駄にしなくて済んだので、自分と同じような方の参考になれば幸いです。