今回は、Lambdaをコンテナイメージで動かしてみます。
コンテナイメージを使う理由ですが、
1モジュールで完結するような小さなプログラムであれば、コンテナイメージを使う必要は無いと思いますが、
中規模のプログラムであれば、ローカル環境で実装・デバッグして、動作したものをそのままLambda上で動作させたいですよね。
そんな時は、プログラム環境をコンテナ化して、Lambdaをコンテナイメージで動作させることでやりたいことが実現出来ます。
コンテナのベースイメージはAWSベースイメージを、
イメージ作成環境はEC2インスタンスを使っていきます。
では、作ってみましょう!
やりたいこと
- Lambdaをコンテナイメージで動かす
やることリスト
- コンテナイメージ作成
- ECR(Amazon Elastic Container Registry)リポジトリ作成
- ECRへイメージ登録
- コンテナイメージを使ってLambda関数の作成
料金の確認
AWSサービスには、無料で使えるサービスもありますが、当然有料サービスもあります。
本章では、分かる範囲でAWSサービスの料金について書こうと思いますが、私の理解不足で漏れていることもあります。
各サービスを使う際は、料金がどのくらい掛かるかを理解した上で、自己責任で利用ください。
コンテナイメージ作成
コンテナイメージを作成する環境はEC2インスタンスを利用します。
Dockerインストール
Dockerコマンドを利用する為に、Dockerをインストールします。
$ sudo yum install docker
$ sudo systemctl start docker && sudo systemctl enable docker
$ sudo usermod -a -G docker ec2-user
EC2にログインしなおすと、docker コマンドが使えるようになります。
ファイル作成
コンテナイメージを作成する為のファイル構成は以下になります。
./hello_ecr
├Dockerfile
└app.py
app.py
import json
def handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello ecr from Lambda!')
}
Dockerfile
FROM public.ecr.aws/lambda/python:3.11
# 関数コードおよびランタイムの依存関係を {LAMBDA_TASK_ROOT} にコピーします。
COPY app.py ${LAMBDA_TASK_ROOT}
# CMD 引数を Lambda 関数ハンドラに設定します。
CMD [ "app.handler" ]
Dockerイメージ作成
hello_ecr フォルダ内で以下コマンドを実行します。
$ docker build -t <イメージ名> .
動作確認
下記コマンドを実行し、
‘Hello ecr from Lambda!’
が返って来れば成功です。
$ docker run -d -p 9000:8080 <イメージ名>
$ curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
ECRリポジトリ作成
Lambdaからコンテナイメージを使う為には、事前にECRのリポジトリにdocker imageを登録してあげる必要があります。
その為、先ずはECRにリポジトリを作成してあげましょう。
AWSコンソール画面から、
Amazon Elastic Container Registry サービスを開きます。
リポジトリの作成
Repositories > 「リポジトリを作成」 ボタンを押下。
可視性設定に、「プライベート」を選択。
リポジトリ名に、任意の名前を入力。
後の設定はデフォルトで、最後尾の「リポジトリを作成」ボタンを押下します。
ECRへイメージ登録
さきほど作成したdocker imageを、ECRのリポジトリに登録します。
ポリシー設定
EC2からECRのリポジトリに登録するには、許可ポリシーを設定する必要があります。
また、合わせて信頼ポリシーも記載しておきます。
EC2のIAMロールにアタッチしてください。
許可ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "*"
}
]
}
信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
イメージのデプロイ
「get-login-password」 コマンドを実行して Amazon ECR レジストリに EC2インスタンス を認証します。
$ aws ecr get-login-password --region <リージョン名> | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
リポジトリにイメージをプッシュできるように、イメージにタグを付けます。
$ docker tag <イメージ名>:latest <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com/<リポジトリ名>:latest
リポジトリにイメージをプッシュします。
$ docker push <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com/<リポジトリ名>:latest
Lambda関数の作成
下準備が整いました・・・
さて、いよいよコンテナイメージを使って、Lambda関数を作ってみましょう!
AWSコンソール画面から、
Amazon Lambda サービスを開きます。
関数の作成
関数 > 「関数の作成」 ボタンをクリックし、設定画面に遷移します。
「コンテナイメージ URI」には、イメージを登録したリポジトリのURIを入力します。
また、「イメージを参照」ボタンを押して、イメージを選択します。
最後に、最後尾の「関数の作成」ボタンを押下して、Lambda関数の作成終了です♪
動作確認
関数内の「テスト」タブの「テスト」ボタンを押します。
「”statusCode”: 200」の次の行に、
‘Hello ecr from Lambda!’
が返って来れば成功です。
最後に
如何でしたか?
座学で勉強するより更なる学びがあったのではないでしょうか。