コンテナイメージを使用して Lambda 関数をデプロイする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コンテナイメージを使用して Lambda 関数をデプロイする

作成者: Ram Kandaswamy (AWS)

概要

AWS Lambda は、デプロイモデルとしてコンテナイメージをサポートします。このパターンは、コンテナイメージを使用して Lambda 関数をデプロイする方法を示しています。 

Lambda はサーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーをプロビジョニングしたり管理したりしなくても、実質どのようなタイプのアプリケーションやバックエンドサービスでも実行できます。Lambda 関数のコンテナイメージサポートにより、アプリケーションアーティファクト用に最大 10 GB のストレージを確保できるというメリットと、使い慣れたコンテナイメージ開発ツールを使用できるというメリットがあります。

このパターンの例では、基礎となるプログラミング言語として Python を使用していますが、Java、Node.js、Go などの他の言語も使用できます。ソースとして、GitHubGitLab ベースのシステムを検討するか、Amazon Simple Storage Service (Amazon S3) を使用します。

前提条件と制限

前提条件

  • Amazon Elastic Container Registry (Amazon ECR) がアクティブ化される

  • アプリケーションコード

  • ランタイムインターフェイスクライアントと最新バージョンの Python を含む Docker イメージ

  • Git に関する実用的な知識

機能制限

  • サポートされる最大モデルサイズは 10 GB です。

  • Lambda ベースのコンテナデプロイの最大実行時間は 15 分です。

アーキテクチャ

ターゲットアーキテクチャ

Lambda 関数を作成する 4 ステップのプロセス。
  1. Git リポジトリを作成し、アプリケーションコードをリポジトリにコミットします。

  2. AWS CodeBuild プロジェクトはコミットの変更によってトリガーされます。

  3. CodeBuild プロジェクトは Docker イメージを作成し、ビルドされたイメージを Amazon ECR に公開します。

  4. Lambda 関数は、Amazon ECR の イメージを使用して作成します。

自動化とスケール

このパターンは AWS CloudFormation、、 AWS Cloud Development Kit (AWS CDK)または SDK の API オペレーションを使用して自動化できます。Lambda はリクエスト数に基づいて自動的にスケーリングでき、同時実行パラメータを使用して調整できます。詳細については、Lambda のドキュメントを参照してください。

ツール

AWS サービス

  • AWS CloudFormation AWS CloudFormationhelpsを使用すると、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント と 全体のライフサイクルを通じてリソースを管理できます AWS リージョン。このパターンでは AWS CloudFormation Application Composer を使用します。これにより、 AWS CloudFormation テンプレートを視覚的に表示および編集できます。

  • AWS CodeBuild は、ソースコードのコンパイル、ユニットテストの実行、デプロイ可能なアーティファクトの生成に役立つフルマネージド型のビルドサービスです。

  • Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

その他のツール

  • Docker は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしてのPlatform as a Service (PaaS) 製品のセットです。

  • GitHubGitLabBitbucket は、ソースコードの変更を追跡するために一般的に使用される Git ベースのソース管理システムの一部です。

ベストプラクティス

  • 不要なファイルが読み込まれないように、関数はできるだけ効率的かつ小さくしてください。

  • 静的レイヤーは Docker ファイルリストの上位に配置し、頻繁に変更されるレイヤーは下位に配置するようにしてください。これによりキャッシュが向上し、パフォーマンスが向上します。

  • イメージ所有者は、イメージの更新とパッチの適用を担当します。その更新頻度を運用プロセスに追加してください。詳細については、AWS Lambda のドキュメントを参照してください。

エピック

タスク説明必要なスキル

Git リポジトリを作成します。

アプリケーションのソースコード、Dockerfile、buildspec.yamlおよび ファイルを含む Git リポジトリを作成します。

開発者

CodeBuild プロジェクトを作成する。

CodeBuild プロジェクトを使用してカスタム Lambda イメージを作成するには、次の手順を実行します。

  1. にサインインし AWS Management Console、https://console.aws.amazon.com/codesuite/codebuild/. で CodeBuild コンソールを開きます。

  2. 新しいプロジェクトを作成します。ソースで、作成した Git リポジトリを選択します。さまざまな種類の Git リポジトリ統合の詳細については、「接続の使用」のドキュメントを参照してください。

  3. 特権モードが有効になっていることを確認します。Docker イメージをビルドするには、これが必要です。そうしないと、イメージは正常にビルドされません。

  4. プロジェクト名と説明の値を指定します。

開発者

Dockerfile を編集する。

Dockerfile は、アプリケーションを開発している最上位のディレクトリに配置する必要があります。Python コードは src フォルダにあるはずです。

イメージを作成するときは、Lambda がサポートする公式イメージを使用してください。そうしないと、起動エラーが発生し、パッキング処理がより困難になります。

詳細については、「追加情報」セクションを参照してください。

開発者

Amazon ECR でリポジトリを作成します。

Amazon ECR にコンテナリポジトリを作成します。次のコマンド例では、作成されたリポジトリの名前は ですcf-demo

aws ecr create-repository --cf-demo

リポジトリは buildspec.yaml ファイルで参照されます。

AWS 管理者、デベロッパー

Amazon ECR にイメージをプッシュします。

CodeBuild を使用してイメージビルドプロセスを実行できます。CodeBuild には Amazon ECR とやりとりしたり S3 を操作したりするためのアクセス権限が必要です。プロセスの一環として、Docker イメージがビルドされ、Amazon ECR レジストリにプッシュされます。テンプレートとコードの詳細については、「追加情報」セクションを参照してください。

開発者

イメージがリポジトリにあることを確認する。

イメージがリポジトリにあることを確認するには、Amazon ECR コンソールで [リポジトリ] を選択します。Amazon ECR 設定で脆弱性スキャン機能が有効になっている場合は、イメージがタグ付きで一覧表示され、脆弱性スキャンレポートの結果も表示されます。 詳細については、AWS ドキュメントを参照してください。

開発者
タスク説明必要なスキル

Lambda 関数を作成します。

Lambda コンソールで [関数の作成] を選択し、[コンテナイメージ] を選択します。Amazon ECR リポジトリにあるイメージの関数名と URI を入力し、[関数の作成] を選択します。詳細については、AWS Lambda のドキュメントを参照してください。

アプリ開発者

Lambda 関数をテストします。

関数を呼び出してテストするには、[テスト] を選択します。詳細については、AWS Lambda のドキュメントを参照してください。

アプリ開発者

トラブルシューティング

問題ソリューション

ビルドが成功しない。

  1. CodeBuild プロジェクトで特権モードが有効になっているかどうかを確認します。

  2. Docker 関連のコマンドに必要なアクセス許可を備えていることを確認します。コマンドに sudo を追加してみます。

  3. CodeBuild に関連付けられている IAM ロールに、Amazon ECR、Amazon S3、および CloudWatch のログを操作するための適切なアクションを含むポリシーがあることを確認します。

関連リソース

追加情報

Docker ファイルの編集

次のコードは、Dockerfile で編集するコマンドを示しています。

FROM public.ecr.aws/lambda/python:3.xx # Copy function code COPY app.py ${LAMBDA_TASK_ROOT} COPY requirements.txt ${LAMBDA_TASK_ROOT} # install dependencies RUN pip3 install --user -r requirements.txt # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.lambda_handler" ]

FROM コマンドで、Lambda でサポートされている Python バージョンに適切な値を使用します (例: 3.12)。これは、パブリック Amazon ECR イメージリポジトリで使用できるベースイメージになります。 

COPY app.py ${LAMBDA_TASK_ROOT} コマンドは、Lambda 関数が使用するタスクルートディレクトリにコードをコピーします。このコマンドは環境変数を使用するので、実際のパスを心配しなくて済みます。実行する関数は引数として CMD [ "app.lambda_handler" ] コマンドに渡されます。

COPY requirements.txt コマンドはコードに必要な依存関係をキャプチャします。 

RUN pip install --user -r requirements.txt コマンドは、依存関係をローカルユーザーディレクトリにインストールします。 

イメージを構築するには、次のコマンドを実行します。

docker build -t <image name> .

Amazon ECR にイメージを追加

次のコードでは、アカウント番号に aws_account_id を置き換え、別のリージョンを使用している場合は us-east-1 を置き換えてください。buildspec ファイルは CodeBuild ビルド番号を使用して、イメージバージョンをタグ値として一意に識別します。要件に合わせて変更できます。

buildspec のカスタムコード

phases: install: runtime-versions: python: 3.xx pre_build: commands: - python3 --version - pip3 install --upgrade pip - pip3 install --upgrade awscli - sudo docker info build: commands: - echo Build started on `date` - echo Building the Docker image... - ls - cd app - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER . - docker container ls post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER