

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

# コンテナイメージを使用して Lambda 関数をデプロイする
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy、Amazon Web Services*

## 概要
<a name="deploy-lambda-functions-with-container-images-summary"></a>

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

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

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

## 前提条件と制限事項
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**前提条件**
+ Amazon Elastic Container Registry (Amazon ECR) がアクティブ化される
+ アプリケーションコード
+ ランタイムインターフェイスクライアントと最新バージョンの Python を含む Docker イメージ
+ Git の実用的な知識

**制限事項**
+ サポートされる最大モデルサイズは 10 GB です。
+ Lambda ベースのコンテナデプロイの最大実行時間は 15 分です。

## アーキテクチャ
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

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

![\[Lambda 関数を作成するための 4 ステップのプロセス。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. Git リポジトリを作成し、アプリケーションコードをリポジトリにコミットします。

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

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

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

**自動化とスケール**

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

## ツール
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**AWS サービス**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) AWS CloudFormationhelpsは、 AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、 AWS アカウント および 全体のライフサイクルを通じてリソースを管理します AWS リージョン。このパターンでは、 CloudFormation テンプレートを視覚的に表示および編集するのに役立つ [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html) を使用します。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

**その他のツール**
+ [Docker](https://www.docker.com/) は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (PaaS) 製品のセットです。
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories)、[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html)、[Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) は、ソースコードの変更を追跡するために一般的に使用される Git ベースのソース管理システムの一部です。

## ベストプラクティス
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ 不要なファイルが読み込まれないように、関数はできるだけ効率的かつ小さくしてください。
+ 静的レイヤーは Docker ファイルリストの上位に配置し、頻繁に変更されるレイヤーは下位に配置するようにしてください。これによりキャッシュが向上し、パフォーマンスが向上します。
+ イメージ所有者は、イメージの更新とパッチの適用を担当します。その更新頻度を運用プロセスに追加してください。詳細については、[AWS Lambda のドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code)を参照してください。

## エピック
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### CodeBuild プロジェクトを作成する
<a name="create-a-project-in-codebuild"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Git リポジトリを作成します。 | アプリケーションソースコード、Dockerfile、および `buildspec.yaml` ファイルを含む Git リポジトリを作成します。 | 開発者 | 
| CodeBuild プロジェクトを作成する。 | CodeBuild プロジェクトを使用してカスタム Lambda イメージを作成する手順は、次のとおりです。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 開発者 | 
| Dockerfile を編集する。 | Dockerfile は、アプリケーションを開発している最上位のディレクトリに配置する必要があります。Python コードは `src` フォルダにあるはずです。イメージを作成するときは、[Lambda がサポートする公式イメージ](https://gallery.ecr.aws/lambda?page=1)を使用してください。そうしないと、起動エラーが発生し、パッキング処理がより困難になります。詳細については、「[追加情報](#deploy-lambda-functions-with-container-images-additional)」セクションを参照してください。 | 開発者 | 
| Amazon ECR でリポジトリを作成します。 | Amazon ECR にコンテナリポジトリを作成します。以下のコマンド例では、作成されたリポジトリの名前は `cf-demo` です。<pre>aws ecr create-repository --cf-demo </pre>リポジトリは `buildspec.yaml` ファイル内で参照されます。 | AWS 管理者、デベロッパー | 
| Amazon ECR にイメージをプッシュします。 | CodeBuild を使用してイメージビルドプロセスを実行できます。CodeBuild には Amazon ECR とやりとりしたり S3 を操作したりするためのアクセス権限が必要です。プロセスの一環として、Docker イメージがビルドされ、Amazon ECR レジストリにプッシュされます。テンプレートとコードの詳細については、「[追加情報](#deploy-lambda-functions-with-container-images-additional)」セクションを参照してください。 | 開発者 | 
| イメージがリポジトリにあることを確認する。 | イメージがリポジトリにあることを確認するには、Amazon ECR コンソールで **[リポジトリ]** を選択します。Amazon ECR 設定で脆弱性スキャン機能が有効になっている場合は、イメージがタグ付きで一覧表示され、脆弱性スキャンレポートの結果も表示されます。 詳細については、[AWS ドキュメント](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html)を参照してください。 | 開発者 | 

### イメージを実行する Lambda 関数を作成する
<a name="create-the-lambda-function-to-run-the-image"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Lambda 関数を作成します。 | Lambda コンソールで **[関数の作成]** を選択し、**[コンテナイメージ]** を選択します。Amazon ECR リポジトリにあるイメージの関数名と URI を入力し、**[関数の作成]** を選択します。詳細については、[AWS Lambda のドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html)を参照してください。 | アプリ開発者 | 
| Lambda 関数をテストします。 | 関数を呼び出してテストするには、**[テスト]** を選択します。詳細については、[AWS Lambda のドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html)を参照してください。 | アプリデベロッパー | 

## トラブルシューティング
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| ビルドが成功しない。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## 関連リソース
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Lambda のベースイメージ](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [CodeBuild の Docker サンプル](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [一時的な認証情報を渡す](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## 追加情報
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**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
```