AWS Lambdaをコンテナで動かしてみました。言語は特に理由はないのですがRubyで試しました。
手順
- ソースコード
- Lambda作成
- Lambda実行
- ソースコード更新
ソースコード準備
ファイルは以下の3つを用意します。
app.rb
app.rb
module LambdaFunction
class Handler
def self.process(event:,context:)
p "Hello from Ruby 2.7 container image!"
p event
end
end
end
Dockerfile
FROM public.ecr.aws/lambda/ruby:2.7
# Copy function code
COPY app.rb ${LAMBDA_TASK_ROOT}
# Copy dependency management file
COPY Gemfile ${LAMBDA_TASK_ROOT}
# Install dependencies under LAMBDA_TASK_ROOT
ENV GEM_HOME=${LAMBDA_TASK_ROOT}
RUN bundle install
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.LambdaFunction::Handler.process" ]
(Rubyのバージョンが古いのが気になる。これより新しいベースイメージがない・・・)
Gemfile
source "https://rubygems.org"
Lambda作成
ECRにレポジトリ作成
$ aws ecr create-repository --repository-name lambdacontainertest
Dockerイメージ作成
$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest .
dockerコマンドがAWSにアクセスできるように認証
$ $(aws ecr get-login --no-include-email)
DockerイメージをECRレポジトリにpush
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest
LambdaをDockerイメージから作成
$ aws lambda create-function --function-name lambdacontainertest --package-type Image --code ImageUri=123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest:latest --role arn:aws:iam::123456789012:role/SampleRole
Lambda実行
マネジメントコンソールからでも実行してみると、以下のようなログが残ります。
"Hello from Ruby 2.7 container image!"
{"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
ソースコード更新
ソースコードを修正した場合のLambda更新までの手順です。
Dockerイメージを再作成
$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest .
dockerコマンドがAWSにアクセスできるように認証(一度実行したらしばらくは覚えてくれている)
$ $(aws ecr get-login --no-include-email)
新しいDockerイメージをECRレポジトリにpush
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest
Lambdaを新しいDockerイメージで更新
$ aws lambda update-function-code --function-name lambdacontainertest --image-uri 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/lambdacontainertest:latest
(create-function
とupdate-function-code
とでパラメータの指定方法が違うのが気になる)