コンテナイメージとして定義された 関数を作成する - AWS Lambda

コンテナイメージとして定義された 関数を作成する

この入門演習では、コンテナイメージとして定義された関数を作成します。始めに、Docker CLI を使用して関数コードのコンテナイメージを作成してから、Lambda コンソールを使用してそのコンテナイメージから関数を作成します。

Prerequisites

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

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 を入手できます。

この演習では、コンテナイメージの作成に Docker CLI コマンドを使用します。Docker CLI のインストールについては、 Docker ドキュメント Web サイトの「Docker の入手」を参照してください。

コンテナイメージを作成する

AWS は、Amazon Elastic Container Registry (Amazon ECR) に、ベースイメージのセットを提供します。この入門演習では、Node.js のベースイメージを使用してコンテナイメージを作成します。ベースイメージの詳細については、「 Lambda の AWS ベースイメージ」を参照してください。

次のコマンドでは、123456789012 を、ご自身の AWS アカウント ID に置き換えます。

AWS Node.js 14 ベースイメージを使用してイメージを作成する

  1. ローカルマシンで、新しい関数のプロジェクトディレクトリを作成します。

  2. プロジェクトディレクトリに、app.js という名前のファイルを作成します。次のコードを app.js に追加します。

    exports.handler = async (event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
  3. テキストエディタを使用して、プロジェクトディレクトリに、Dockerfile という名前の新しいファイルを作成します。Dockerfile に次の内容を追加します。

    FROM public.ecr.aws/lambda/nodejs:14 # Copy function code COPY app.js ${LAMBDA_TASK_ROOT} # Set the CMD to your handler CMD [ "app.handler" ]
  4. Docker イメージをビルドします。プロジェクトディレクトリから、次のコマンドを実行します。

    docker build -t hello-world .
  5. (オプション) AWS のベースイメージには Lambda ランタイムインターフェイスエミュレータが含まれているため、関数をローカルでテストできます。

    1. Docker イメージを実行します。プロジェクトディレクトリから、docker run コマンドを実行します。

      docker run -p 9000:8080 hello-world:latest
    2. Lambda 関数をテストします。新しいターミナルウィンドウを開き、curl コマンドを実行して関数を呼び出します。

      curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

Amazon ECR リポジトリへのイメージのアップロード

  1. Amazon ECR レジストリに対し、Docker CLI を認証します。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  2. create-repository コマンドを使用して、Amazon ECR にリポジトリを作成します。

    aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
  3. docker tag コマンドを使用して、イメージにリポジトリ名と一致するタグを付けます。

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  4. docker push コマンドを使用して、Amazon ECR にイメージをデプロイします。

    docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

ユーザー権限を更新する

IAM ユーザーまたはロールが関数を作成するためのアクセス許可に、AWS の管理ポリシーである GetRepositoryPolicySetRepositoryPolicy が含まれていることを確認します。Amazon ECR リポジトリ内のイメージにアクセスするためのユーザーアクセス許可の詳細については、「 Amazon ECR のアクセス許可」を参照してください。

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

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

コンテナイメージとして定義された Lambda 関数を作成する

Lambda コンソールを使用して、コンテナイメージとして定義された関数を作成します。

このコンソールを使用して関数を作成するには、

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

  2. [Create function] を選択します。

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

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

    1. [関数名] に「my-function」と入力します。

    2. [Container image URI] (コンテナイメージ の URI) に、事前に作成した Amazon ECR イメージの URI を入力します。

  5. [Create function] を選択します。

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

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 に送信されるメトリクスのグラフが表示されます。

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

クリーンアップ

コンテナイメージでの作業が完了したら、Amazon Elastic Container Reg ユーザーガイドの「イメージを削除する」を参照してください。

使用が終了したサンプル関数は削除しておきます。コンソールが作成した実行ロールと、関数のログを保存するためのロググループも削除できます。

Lambda 関数を削除するには

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

  2. 関数を選択します。

  3. [ Actions] で、[Delete ] を選択します。

  4. 関数の削除ダイアログボックスで、[削除] をクリックします。

ロググループを削除するには

  1. Amazon CloudWatch コンソールの [Log groups (ロググループ)] ページを開きます。

  2. 関数のロググループ (/aws/lambda/my-function) を選択します。

  3. [アクション]、[ロググループの削除] の順にクリックします。

  4. ロググループの削除ダイアログボックスで、[削除] をクリックします。

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 関数のロール (my-function-role-31exxmpl) を選択します。

  3. [ロールの削除] を選択します。

  4. ロールの削除ダイアログボックスで、[はい、削除します] をクリックします。

AWS CloudFormation と AWS CLI を使用すると、関数、ロググループ、およびロールの作成とクリーンアップを自動化できます。完全に機能するサンプルアプリケーションについては、「Lambda サンプルアプリケーション」を参照してください。