Lambda 関数のコンテナイメージとしてのデプロイ - AWS Lambda

Lambda 関数のコンテナイメージとしてのデプロイ

Lambda 関数を作成する場合、関数コードをデプロイパッケージにパッケージ化します。Lambda は、コンテナイメージ.zip ファイルアーカイブの 2 種類のデプロイパッケージをサポートします。関数を作成するワークフローは、デプロイパッケージの種類によって異なります。.zip ファイルアーカイブとして定義された関数を設定するには、Lambda 関数の .zip ファイルアーカイブとしてのデプロイを参照してください。

Lambda コンソールと Lambda API により、コンテナイメージとして定義された関数を作成し、そのイメージコードの更新やテストを行い、関数に対する他の設定を行うことができます。

注記

既存のコンテナイメージ関数を、.zip ファイルアーカイブを使用するように変換することはできません。この場合は、新しい関数を作成する必要があります。

イメージタグを使用してイメージを選択すると、そのタグは Lambda によって基盤となるイメージのダイジェストに変換されます。イメージのダイジェストを取得するには、GetFunctionConfiguration API オペレーションを実行します。関数を新しいイメージバージョンに更新するには、Lambda コンソールを使用して関数コードを更新するか、UpdateFunctionCode API オペレーションを実行する必要があります。UpdateFunctionConfiguration などの設定操作では、関数のコンテナイメージは更新されません。

前提条件

次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。

aws --version

次のような出力が表示されます。

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

関数を作成する前に、コンテナイメージを作成し、そのイメージを Amazon ECR にアップロードする必要があります。

アクセス許可

IAM ユーザーまたはロールが関数を作成するためのアクセス許可に、AWS の管理ポリシーである GetRepositoryPolicySetRepositoryPolicy が含まれていることを確認します。

例えば、IAM コンソールを使用して、次のポリシーでロールを作成します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["ecr:SetRepositoryPolicy","ecr:GetRepositoryPolicy"], "Resource": "arn:aws:ecr:<region>:<account>:repository/<repo name>/" } ] }

Amazon ECR のアクセス許可

Amazon ECR のコンテナイメージと同じアカウント内の関数の場合、Amazon ECR リポジトリに ecr:BatchGetImage および ecr:GetDownloadUrlForLayer の許可を追加できます。次の例は、最小ポリシーを示しています。

{ "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ] }

Amazon ECR のリポジトリのアクセス許可の詳細については、Amazon Elastic Container Registry ユーザーガイドの「リポジトリポリシー」を参照してください。

Amazon ECR リポジトリにこれらの権限が含まれていない場合、Lambda は ecr:BatchGetImage および ecr:GetDownloadUrlForLayer をコンテナイメージリポジトリのアクセス許可に追加します。Lambda は、Lambda を呼び出すプリンシパルに ecr:getRepositoryPolicy および ecr:setRepositoryPolicy のアクセス許可がある場合にのみ、これらのアクセス許可を追加できます。

Amazon ECR リポジトリのアクセス許可を表示または編集するには、Amazon Elastic Container Registry ユーザーガイドの「リポジトリポリシーステートメントの設定」を参照してください。

Amazon ECR クロスアカウント許可

同じリージョン内の別のアカウントで、アカウントが所有するコンテナイメージを使用する関数を作成できます。次の例では、Amazon ECR リポジトリの許可ポリシーで、アカウント番号 123456789012 にアクセス権を付与するために、次のステートメントが必要です。

  • CrossAccountPermission — アカウント 123456789012 が、この ECR リポジトリからイメージを使用する Lambda 関数を作成および更新できるようにします。

  • LambdaECRImageCrossAccountRetrievalPolicy – Lambda は、関数が長期間呼び出されない場合、最終的に関数の状態を非アクティブに設定します。このステートメントは、123456789012 が所有する関数に代わって Lambda が最適化およびキャッシュのためにコンテナイメージを取得できるようにするために必要です。

例 クロスアカウント許可をリポジトリに追加する

{"Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

複数のアカウントにアクセス権を付与するには、CrossAccountPermission ポリシーの [Principal] (プリンシパル) リストと LambdaECRImageCrossAccountRetrievalPolicy の [Condition] (条件) 評価リストにアカウント ID を追加します。

AWS Organization で複数のアカウントを扱う場合は、ECR の許可ポリシーで各アカウント ID を列挙することをお勧めします。このアプローチは、IAM ポリシーで狭い範囲の許可を設定するという AWS セキュリティのベストプラクティスに沿ったものです。

関数の作成

コンテナイメージとして定義された関数を作成するには、まずイメージを作成した上で、そのイメージを Amazon ECR リポジトリに保存する必要があります。

関数を作成するには

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. [Create function] (関数の作成) を選択します。

  3. [コンテナイメージ] オプションを選択します。

  4. 基本的な情報 で、以下の作業を行います。

    1. [関数名] に関数名を入力します。

    2. コンテナイメージ URI では、関数コードに必要な命令セットアーキテクチャと互換性のあるコンテナイメージを提供します。

      Amazon ECR イメージの URI を入力するか、Amazon ECR イメージを参照できます。

      • Amazon ECR イメージの URI を入力します。

      • Amazon ECR リポジトリでイメージを参照する場合には、[Browse images] (イメージの参照) をクリックします。ドロップダウンリストから Amazon ECR リポジトリを選択し、所望のイメージを選択します。

  5. (オプション) Dockerfile に含まれる構成設定をオーバーライドするには、[コンテナイメージのオーバーライド] を展開します。次の設定のいずれかを上書きできます。

    • [エントリーポイント] には、実行可能なランタイムへの完全なパスを入力します。Node.js 関数のエントリポイントの例を次に示します。

      "/usr/bin/npx", "aws-lambda-ric"
    • [コマンド] には、[エントリーポイント] のパスを通じてイメージに渡す、追加のパラメータを入力します。次の例は、Node.js 関数に渡すコマンドを示しています。

      "app.handler"
    • [作業ディレクトリ] には、関数で使用される作業ディレクトリへの、完全なパスを入力します。次に、Lambda の AWS のベースイメージの作業ディレクトリの例を示します。

      "/var/task"
    注記

    設定を上書きする際には、各文字列を二重引用符 (" ") で囲んでください。

  6. (オプション) アーキテクチャで、関数の命令セットアーキテクチャを選択します。デフォルトのアーキテクチャは x86_64 です。注: 関数用のコンテナイメージを構築するときは、この命令セットアーキテクチャと互換性があることを確認してください。

  7. (オプション) [アクセス権限] で、[デフォルトの実行ロールの変更] を展開します。次に、[新しい実行ロールの作成] をクリックするか、あるいは、使用する既存のロールを選択します。

  8. [Create function] (関数の作成) を選択します。

Lambda により、関数と実行ロールが作成され、ログをアップロードするためのアクセス許可が関数に付与されます。Lambda は、ユーザーの関数が呼び出される際に実行ロールを引き受け、そのロールを使用して AWS SDK のための認証情報を作成し、イベントソースからデータを読み取ります。

コードをコンテナイメージとして Lambda 関数にデプロイすると、そのイメージを Lambda 上で実行するための最適化プロセスが実行されます。この処理には数秒かかることがあり、その間、関数は保留状態になります。最適化プロセスが完了すると、関数はアクティブな状態になります。

関数のテスト

コンソールで提供されているサンプルイベントデータを使用して Lambda 関数を呼び出します。

関数を呼び出すには

  1. 関数を選択した後、 テスト タブを選択します。

  2. テストイベント セクションで、 新しいイベント を選択します。 テンプレート で、デフォルトの hello-world オプションのままにします。[Name] (名前) にこのテストの名前を入力し、以下のサンプルイベントテンプレートに注目します。

    { "key1": "value1", "key2": "value2", "key3": "value3" }
  3. [Save changes] (変更の保存)、[Test] (テスト) の順に選択します。ユーザーごとに、関数につき最大 10 個のテストイベントを作成できます。これらのテストイベントを他のユーザーが使用することはできません。

    Lambda はユーザーに代わって関数を実行します。関数ハンドラーは、サンプルイベントを受け取って、処理します。

  4. 正常に完了したら、コンソールに結果が表示されます。

    • 実行結果には、実行ステータルが成功と表示されます。関数の実行結果を表示するためには、詳細を選択します。[Logs] (ログ) リンクをクリックすると、CloudWatch コンソールの [Log groups (ロググループ)] ページが開きます。

    • [Summary] セクションには、[Log output] セクション(実行ログの REPORT 行)にレポートされた重要な情報が表示されます。

    • [Log output] (ログ出力) セクションには、Lambda で各呼び出しに対して生成されるログが表示されます。関数によって、これらのログが CloudWatch に書き込まれます。Lambda コンソールに、これらのログが表示されるため便利です。[Click here] (ここをクリックしてください) を選択して CloudWatch ロググループに追加し、CloudWatch コンソールで [Log groups (ロググループ)] ページを開きます。

  5. 関数をさらに数回実行し ([Test] (テスト) を選択)、次のステップで表示される複数のメトリクスを収集します。

  6. [Monitor] (モニタリング) タブを選択します。このページでは、Lambda から CloudWatch に送信されるメトリクスのグラフが表示されます。

    これらのグラフの詳細Lambda コンソールでの関数のモニタリングを参照してください。

コンテナ設定の上書き

Lambda コンソールまたは Lambda API を使用して、次のコンテナイメージ設定を上書きできます。

  • ENTRYPOINT - アプリケーションへのエントリポイントの絶対パスを指定します。

  • CMD - ENTRYPOINT とともに渡すパラメータを指定します。

  • WORKDIR - 作業ディレクトリの絶対パスを指定します。

  • ENV - Lambda 関数の環境変数を指定します。

Lambda コンソールまたは Lambda API で指定した値は、Dockerfile 内の値よりも優先されます。

コンテナイメージの設定値を上書きするには、

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 対象の関数を選択します。

  3. [イメージの設定] で、[編集] をクリックします。

  4. 必要なオーバーライド設定に新しい値を入力した上で、[保存] をクリックします。

  5. (オプション) 環境変数を追加またはオーバーライドするには、[環境変数] にある [編集] をクリックします。

    詳細については、「AWS Lambda 環境変数の使用」を参照してください。

関数コードの更新

コンテナイメージを関数にデプロイすると、そのイメージは読み取り専用になります。関数コードを更新するには、まず新しいバージョンのイメージをデプロイする必要があります。新しいバージョンのイメージを作成したら、そのイメージを Amazon ECR リポジトリに保存します。

更新されたコンテナイメージを使用するように関数を設定するには、

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 対象の関数を選択します。

  3. [イメージ] の下にある、[新しいイメージのデプロイ] をクリックします。

  4. [画像の参照] をクリックします。

  5. [Select container image] (コンテナイメージの選択) ダイアログボックスで、ドロップダウンリストから Amazon ECR リポジトリを選択した後、新しいバージョンのイメージを選択します。

  6. [Save] を選択します。

関数バージョン $LATEST

あるバージョンの関数を公開すると、そのバージョンのユーザーエクスペリエンスの一貫性を保つために、コード自体と、そのためのほとんどの設定がロックされます。コードと、それに関する多くの構成設定は、関数の未公開バージョンでのみ変更が可能です。デフォルトでは、コンソールには未公開バージョンの関数の設定情報が表示されます。関数のバージョンを表示するには、[限定条件] をクリックします。未公開バージョンの名前は $LATEST です。

Amazon Elastic Container Registry (Amazon ECR) でも、latest というタグを使用して、コンテナイメージの最新バージョンを示していることにご注意ください。このタグを、関数バージョンの $LATEST と混同しないようにしてください。

バージョン管理の詳細については、「Lambda 関数のバージョン」を参照してください。

Lambda API の使用

次の API オペレーションを使用して、コンテナイメージとして定義された関数を管理します。

コンテナイメージとして定義された関数を作成するには、create-function コマンドを使用します。package-typeImage を設定した上で、code パラメーターを使用しながらコンテナイメージ URI を指定します。

関数を作成するときに、命令セットアーキテクチャを指定できます。デフォルトのアーキテクチャはx86-64です。コンテナイメージのコードがアーキテクチャと互換性があることを確認します。

関数は、コンテナレジストリと同じアカウントから、または、Amazon ECR のコンテナレジストリと同じリージョンにある別のアカウントから作成することができます。クロスアカウントアクセスについては、イメージの Amazon ECR の許可を調整します。

aws lambda create-function --region sa-east-1 --function-name my-function \ --package-type Image \ --code ImageUri=<ECR Image URI> \ --role arn:aws:iam::123456789012:role/lambda-ex

関数コードを更新するには、update-function-code コマンドを使用します。image-uri パラメーターを使用して、コンテナイメージのロケーションを指定します。

注記

関数の package-type を変更することはできません。

aws lambda update-function-code --region sa-east-1 --function-name my-function \ --image-uri <ECR Image URI> \

関数のパラメータを更新するには、update-function-configuration オペレーションを使用します。EntryPointCommand は文字列の配列として指定し、WorkingDirectory は文字列として指定します。

aws lambda update-function-configuration --function-name my-function \ --image-config '{"EntryPoint": ["/usr/bin/npx", "aws-lambda-ric"], \ "Command": ["app.handler"] , \ "WorkingDirectory": "/var/task"}'

AWS CloudFormation

AWS CloudFormation を使用して、コンテナイメージとして定義された Lambda 関数を作成できます。AWS CloudFormation テンプレートでは、Lambda 関数は AWS::Lambda::Function のリソースにより指定されます。AWS::Lambda::Function リソースのプロパティの詳細については、AWS CloudFormation ユーザーガイドの「AWS Lambda 関数」を参照してください。

コンテナイメージとして定義された関数を作成するには、AWS::Lambda::Functionリソースで次のプロパティを設定します。

  • AWS::Lambda::Function

    • PackageType - Image に設定します。

    • Code - ImageUri フィールドにコンテナイメージの URI を入力します。

    • ImageConfig - (オプション) コンテナイメージの設定プロパティを上書きします。

ImageConfigAWS::Lambda::Function プロパティには、次のフィールドがあります。

  • Command - EntryPoint で渡すパラメータを指定します。

  • EntryPoint - アプリケーションへのエントリポイントを指定します。

  • WorkingDirectory - 作業ディレクトリを指定します。

注記

ImageConfig テンプレートで AWS CloudFormation プロパティを宣言する場合は、ImageConfig プロパティの値 3 つすべてを指定する必要があります。

詳細については、AWS CloudFormation ユーザーガイドの「ImageConfig」を参照してください。