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 では、Lambda でよく使用される一部の Bash CLI コマンド (zip
など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストール
関数を作成する前に、コンテナイメージを作成し、そのイメージを Amazon ECR にアップロードする必要があります。
許可
関数を作成するユーザーまたはロールの許可に、AWS マネージドポリシーの GetRepositoryPolicy
と SetRepositoryPolicy
が含まれていることを確認してください。
例えば、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 リポジトリに保存する必要があります。
関数を作成する
Lambda コンソールの [Functions]
(関数) ページを開きます。 -
[機能の作成]を選択します。
-
[コンテナイメージ] オプションを選択します。
-
[Basic information] (基本的な情報) で、以下を実行します。
-
[関数名] に関数名を入力します。
-
コンテナイメージ URI では、関数コードに必要な命令セットアーキテクチャと互換性のあるコンテナイメージを提供します。
Amazon ECR イメージの URI を入力するか、Amazon ECR イメージを参照できます。
Amazon ECR イメージの URI を入力します。
-
Amazon ECR リポジトリでイメージを参照する場合には、[Browse images] (イメージの参照) をクリックします。ドロップダウンリストから Amazon ECR リポジトリを選択し、所望のイメージを選択します。
-
-
(オプション) Dockerfile に含まれる構成設定をオーバーライドするには、[コンテナイメージのオーバーライド] を展開します。次の設定のいずれかを上書きできます。
-
[エントリーポイント] には、実行可能なランタイムへの完全なパスを入力します。Node.js 関数のエントリポイントの例を次に示します。
"/usr/bin/npx", "aws-lambda-ric"
-
[コマンド] には、[エントリーポイント] のパスを通じてイメージに渡す、追加のパラメータを入力します。次の例は、Node.js 関数に渡すコマンドを示しています。
"app.handler"
-
[作業ディレクトリ] には、関数で使用される作業ディレクトリへの、完全なパスを入力します。次に、Lambda の AWS のベースイメージの作業ディレクトリの例を示します。
"/var/task"
注記 設定を上書きする際には、各文字列を二重引用符 (" ") で囲んでください。
-
-
(オプション) アーキテクチャで、関数の命令セットアーキテクチャを選択します。デフォルトのアーキテクチャは x86_64 です。注: 関数用のコンテナイメージを構築するときは、この命令セットアーキテクチャと互換性があることを確認してください。
-
(オプション) [アクセス権限] で、[デフォルトの実行ロールの変更] を展開します。次に、[新しい実行ロールの作成] をクリックするか、あるいは、使用する既存のロールを選択します。
-
[機能の作成]を選択します。
Lambda により、関数と実行ロールが作成され、ログをアップロードするためのアクセス許可が関数に付与されます。Lambda は、ユーザーの関数が呼び出される際に実行ロールを引き受け、そのロールを使用して AWS SDK のための認証情報を作成し、イベントソースからデータを読み取ります。
コードをコンテナイメージとして Lambda 関数にデプロイすると、そのイメージを Lambda 上で実行するための最適化プロセスが実行されます。この処理には数秒かかることがあり、その間、関数は保留状態になります。最適化プロセスが完了すると、関数はアクティブな状態になります。
関数のテスト
コンソールで提供されているサンプルイベントデータを使用して Lambda 関数を呼び出します。
関数を呼び出すには
-
関数を選択した後、 テスト タブを選択します。
-
[Test event action] (イベントアクションをテスト) で、[Create new event] (新しいイベントを作成) を選択します。
-
[Event name] (イベント名) には、テストイベントの名前を入力します。
-
[Event sharing settings] (イベント共有の設定) で、[Private] (プライベート) を選択します。
-
[Template] (テンプレート) では、デフォルトの [hello-world] オプションを維持します。
-
[Save changes] (変更の保存)、[Test] (テスト) の順に選択します。Lambda はユーザーに代わって関数を実行します。関数ハンドラーは、サンプルイベントを受け取って、処理します。
-
[Execution result] (実行結果) と [Details] (詳細) を確認します。
-
[Summary] (概要) セクションには、呼び出しログの
REPORT
行からの主な情報が表示されます。 -
[Log output] (ログ出力) セクションには、完全な呼び出しログが表示されます。Lambda は、呼び出しログのすべてを Amazon CloudWatch に書き込みます。
-
コンテナ設定の上書き
Lambda コンソールまたは Lambda API を使用して、次のコンテナイメージ設定を上書きできます。
-
ENTRYPOINT - アプリケーションへのエントリポイントの絶対パスを指定します。
-
CMD - ENTRYPOINT とともに渡すパラメータを指定します。
-
WORKDIR - 作業ディレクトリの絶対パスを指定します。
-
ENV - Lambda 関数の環境変数を指定します。
Lambda コンソールまたは Lambda API で指定した値は、Dockerfile 内の値よりも優先されます。
コンテナイメージの設定値を上書きするには、
Lambda コンソールの [Functions]
(関数) ページを開きます。 -
対象の関数を選択します。
-
[イメージの設定] で、[編集] をクリックします。
-
必要なオーバーライド設定に新しい値を入力した上で、[保存] をクリックします。
-
(オプション) 環境変数を追加またはオーバーライドするには、[環境変数] にある [編集] をクリックします。
詳細については、「AWS Lambda 環境変数の使用」を参照してください。
関数コードの更新
コンテナイメージを関数にデプロイすると、そのイメージは読み取り専用になります。関数コードを更新するには、まず新しいバージョンのイメージをデプロイする必要があります。新しいバージョンのイメージを作成したら、そのイメージを Amazon ECR リポジトリに保存します。
更新されたコンテナイメージを使用するように関数を設定するには、
Lambda コンソールの [Functions]
(関数) ページを開きます。 -
対象の関数を選択します。
-
[イメージ] の下にある、[新しいイメージのデプロイ] をクリックします。
-
[画像の参照] をクリックします。
-
[Select container image] (コンテナイメージの選択) ダイアログボックスで、ドロップダウンリストから Amazon ECR リポジトリを選択した後、新しいバージョンのイメージを選択します。
-
[Save (保存)] を選択します。
関数バージョン $LATEST
あるバージョンの関数を公開すると、そのバージョンのユーザーエクスペリエンスの一貫性を保つために、コード自体と、そのためのほとんどの設定がロックされます。コードと、それに関する多くの構成設定は、未公開バージョンの関数でのみ変更が可能です。デフォルトでは、コンソールには未公開バージョンの関数の設定情報が表示されます。関数のバージョンを表示するには、[限定条件] をクリックします。未公開バージョンの名前は $LATEST です。
Amazon Elastic Container Registry (Amazon ECR) でも、latest というタグを使用して、コンテナイメージの最新バージョンを示していることに注意してください。このタグを、関数バージョンの $LATEST と混同しないようにしてください。
バージョン管理の詳細については、「Lambda 関数のバージョン」を参照してください。
Lambda API の使用
次の API オペレーションを使用して、コンテナイメージとして定義された関数を管理します。
コンテナイメージとして定義された関数を作成するには、create-function
コマンドを使用します。package-type
に Image
を設定した上で、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
オペレーションを使用します。EntryPoint
と Command
は文字列の配列として指定し、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 - (オプション) コンテナイメージの設定プロパティを上書きします。
ImageConfig
の AWS::Lambda::Function
プロパティには、次のフィールドがあります。
Command -
EntryPoint
で渡すパラメータを指定します。EntryPoint - アプリケーションへのエントリポイントを指定します。
WorkingDirectory - 作業ディレクトリを指定します。
ImageConfig
テンプレートで AWS CloudFormation プロパティを宣言する場合は、ImageConfig
プロパティの値 3 つすべてを指定する必要があります。
詳細については、AWS CloudFormation ユーザーガイドの「ImageConfig」を参照してください。