AWSの新機能「AWS Lambda Container Image Support」を用いて、サーバーレス環境の移行を検証しました
2020年11月30日から開催されているAWSのグローバルカンファレンス AWS re:Invent 2020 にて、 「AWS Lambda Container Image Support」 という新サービスが発表されました。
AWS Lambda Container Image Supportは、AWSのサーバーレスコンピューティング「AWS Lambda」にて、仮想コンテナ技術を利用できるようになる画期的なサービスです。
AWS Lambda Container Image Supportのメリット
今回のAWS Lambda Container Image Supportのリリースにより、AWS Lambdaで仮想コンテナ技術「Docker」を利用することができるようになりました。
DockerコンテナベースのアプリケーションをAWS Lambda上で実行できるようになることで、これまでAWS Lambdaでは難しかったユースケースに対応できるようになります。その例としては次のようなものがあります。
1. ライブラリ依存のパッケージを活用する
AWS Lambda Container Image Supportによって、コンテナイメージにAWS CLIをインストールすることができます。
それにより、AWS SDKでは用意されていない「s3 sync」をはじめとして、OSライブラリや特定パッケージに依存する機能・コマンドを、AWS Lambdaでも利用できるようになります。
2. 他プラットフォームのサーバーレス環境をAWS Lambdaへ移行する
AWS Lambda Container Image Supportを用いれば、Azure Functionsのようなコンテナイメージ上で稼働するサーバーレスアプリケーションを、AWS Lambda上でも稼働させることができます。
例えば、Azure FunctionsにてWeb-APIサーバーのコンテナアプリケーションが稼働している場合、ProxyライブラリとAPI Gatewayを利用して、アプリケーションをAWS Lambdaへ移行することも検討できます。
今回はこのケースを想定し、Azure Functions Container Imageで稼働するアプリケーションをAWS Lambdaに移行できるかどうか、検証を行ってみました。
Azure FunctionsからAWS Lambdaへの移行の検証
移行するアプリケーションとして、こちらで公開されているシンプルなコードを採用しました。
移行作業のアーキテクチャ(システム構成図)は次の通りです。
実施した作業
まずは、AWS Lambda Container Image Supportを動作させるために、Microsoft Azureのサーバーレス環境「Azure Functions」で稼働しているDockerイメージに対して、AWS Lambda Runtime Interface Clientをインストールしました。
このコンテナにLambdaハンドラーを加え、エントリーポイントはハンドラーを指定するようにDockerfileを設定しました。
Dockerfileの設定例:
DockerfileではAWS Lambda Runtime Clientをインストールしました。
# Azure Functions Container
FROM xblood/azurefunctionsimage:v1.0.0
ARG FUNCTION_DIR="/home/app/"
ARG RUNTIME_VERSION
ARG DISTRO_VERSION
RUN apt-get install -y libtool autoconf automake make cmake
# build-base, libexecinfo-dev, libcurl
RUN apt-get install -y curl build-essential
RUN pip install awscli
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_SESSION_TOKEN
ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
ENV AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
RUN mkdir -p ${FUNCTION_DIR}
# Copy Lambda Handler
COPY handler.py ${FUNCTION_DIR}
# Install AWS Lambda Runtime Interface Client
RUN python${RUNTIME_VERSION} -m pip install \
awslambdaric \
--target /home/app/
WORKDIR ${FUNCTION_DIR}
# Set the CMD to handler
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaruntimeclient" ]
CMD [ "handler.lambda_handler" ]
※ 本Dockerfileで指定している xblood/azurefunctionsimage は こちらのチュートリアル に沿って事前作成されたイメージです
Docker Imageのビルド
続いて、以下のコマンドを実行しコンテナをビルドしました。
docker build . \
-f Dockerfile \
-t lambda-container-image \
--build-arg AWS_ACCESS_KEY_ID="[YOUR AWS ACCESS KEY ID]" \
--build-arg AWS_SECRET_ACCESS_KEY="[YOUR AWS SECRET ACCESS KEY]" \
--build-arg RUNTIME_VERSION="3.8" \
--build-arg DISTRO_VERSION="3.12"
ECRへのプッシュ
作成したコンテナイメージにタグを設定し、Amazon Elastic Container Registry(ECR)にプッシュしました。
※事前にECRリポジトリの作成とDockerログインが必要です
docker push xxxxxxxxxxxx.dkr.ecr.sa-east-1.amazonaws.com/lambda-container-image:latest
Lambdaの作成
次に、AWS Lambda Container Image Supportを使ってLambdaを作成しました。
今回はAWS CLIを利用し、IAMロールは下記ポリシーで事前に作成しておきました。
IAMロールポリシー例( lambda-container-image-iam-role )
{
"Statement":[
{
"Sid":"VisualEditor0",
"Effect":"Allow",
"Action":[
"ecr:SetRepositoryPolicy",
"ecr:GetRepositoryPolicy"
],
"Resource":"arn:aws:ecr:<region>:<account>:repository/<repo name>/"
}
]
}
AWS Lambda Container Image Supportによって追加された ImageUri オプションを指定し、先程の手順でECRにPush済みのコンテナイメージを指定しました。
aws lambda create-function \
--function-name lambda-container-image-function \
--package-type Image \
--Image URI=xxxxxxxxxxxx.dkr.ecr.sa-east-1.amazonaws.com/lambda-container-image:latest \
--role arn:aws:iam::xxxxxxxxxxxx:role/lambda-container-image-iam-role
Lambdaを起動する
AWS マネジメントコンソールから作成したLambdaをテストすると、Lambda関数が正常に実行されたことを確認できました。
より実践的なユースケースに対応するには
今回は検証のためシンプルなコードを用いましたが、実際のサーバーレスアプリケーションをAWS Lambdaへ移行する際や、マルチクラウド戦略を採用する際には、各クラウドベンダーのAPIを差異を考慮することが必要です。
昨今では Serverless Multicloud Library のようなライブラリを活用して解決できるケースもあります。
AWS Lambdaのビジネス活用をサポート
株式会社MMMは 、AWS Lambdaのビジネス活用に豊富な実績を持っており、AWS LambdaのAWSサービスデリバリーパートナーにも認定されています。
MMMは、多種多様なAWSマネージドサービスをクラウドのベストプラクティスに準拠した形で活用することで、クラウドの真の旨味である柔軟性や俊敏性をお客様のビジネスに組み込むことを得意としています。
今回リリースされたAWS Lambda Container Image Supportも含め、 サーバーレスアーキテクチャ(AWS Lambda) の導入や無料相談に関しては次のページよりお気軽にご相談ください。