最初の Lambda 関数を作成する - AWS Lambda

最初の Lambda 関数を作成する

Lambda の使用を開始するには、Lambda コンソールを使用して関数を作成します。数分で関数を作成およびデプロイして、それをコンソールでテストできます。

チュートリアルを進めていくうちに、Lambda のイベントオブジェクトを使用して関数に引数を渡す方法など、Lambda の基本的な概念を学んでいきす。また、関数からログ出力を返す方法と、CloudWatch Logs で関数の呼び出しログを表示する方法についても学習します。

簡単のために、関数の作成には Python または Node.js ランタイムのいずれかを使用します。これらはインタープリター言語なので、コンソールの組み込みコードエディタで関数のコードを直接編集できます。Java や C# などのコンパイル型言語では、ローカルのビルドマシン上でデプロイパッケージを作成し、それを Lambda にアップロードする必要があります。他のランタイムを使用して Lambda に関数をデプロイする方法については、「その他のリソースと次のステップ」セクションにあるリンクを参照してください。

ヒント

サーバーレスソリューションを構築する方法については、「サーバーレスデベロッパーガイド」を参照してください。

前提条件

AWS アカウント がない場合は、以下のステップを実行して作成します。

AWS アカウントにサインアップするには
  1. https://portal.aws.amazon.com/billing/signup を開きます。

  2. オンラインの手順に従います。

    サインアップ手順の一環として、通話呼び出しを受け取り、電話キーパッドで検証コードを入力するように求められます。

    AWS アカウント にサインアップすると、AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべてのAWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。

サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/アカウント] をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。

AWS アカウントのルートユーザーをセキュリティで保護する
  1. ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドルートユーザーとしてサインインするを参照してください。

  2. ルートユーザーの多要素認証 (MFA) を有効にします。

    手順については、「IAM ユーザーガイド」のAWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)を参照してください。

管理アクセスを持つユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。

  2. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

    IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルト IAM アイデンティティセンターディレクトリを使用したユーザーアクセスの設定」を参照してください。

管理アクセス権を持つユーザーとしてサインインする
  • IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

    IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドAWS アクセスポータルにサインインするを参照してください。

追加のユーザーにアクセス権を割り当てる
  1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」を参照してください。

  2. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「グループの参加」を参照してください。

コンソールで Lambda の関数の作成

この例の関数は、"length" および "width" のラベルが付けられた 2 つの整数値を含む JSON オブジェクトを取り込みます。関数はこれらの値を乗算して面積を計算し、これを JSON 文字列として返します。

またこの関数は、計算された面積に加え CloudWatch ロググループの名前の表示も行います。チュートリアルの後半では、関数の呼び出しの記録を表示するための、CloudWatch Logs の使用方法を学習します。

自分の関数を作成するには、まずコンソールを使用して基本の Hello world 関数を作成します。その後のステップで、独自の関数コードを追加します。

コンソールでLambda 関数 Hello world を作成するには
  1. Lambda コンソールの [関数ページ] を開きます。

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

  3. [ゼロから作る] を選択します。

  4. [基本情報] ペインで、[関数名] に「myLambdaFunction」を入力します。

  5. [ランタイム] では、[Node.js 20.x] または [Python 3.12] のいずれかを選択します。

  6. [アーキテクチャ] の設定は [86_64] のままにし、[関数を作成] を選択します。

Lambda はメッセージ Hello from Lambda! を返す関数を作成します。また Lambda は、ユーザーの関数のための実行ロールも作成します。実行ロールとは、AWS のサービス およびリソースに対するアクセス許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) のロールです。Lambda が作成するこのロールは、CloudWatch Logs に書き込むための基本的なアクセス許可を、ユーザーの関数に付与します。

これで、コンソールの組み込みコードエディターを使用して、Lambda が作成した Hello world コードを独自の関数コードに置き換えることができるようになります。

Node.js
コンソールでコードを変更するには
  1. [コード] タブを選択します。

    Lambda が関数コードを作成すると、それがコンソールの組み込みコードエディタに表示されます。コードエディターに index.mjs タブが表示されない場合は、次の図に示すように、ファイルエクスプローラーで index.mjs を選択します。

    コンソールのコードエディターとファイルエクスプローラーの index.mjs ファイルを示す図
  2. 次のコードを index.mjs タブに貼り付け、Lambda が作成したコードを置き換えます。

    export const handler = async (event, context) => { const length = event.length; const width = event.width; let area = calculateArea(length, width); console.log(`The area is ${area}`); console.log('CloudWatch log group: ', context.logGroupName); let data = { "area": area, }; return JSON.stringify(data); function calculateArea(length, width) { return length * width; } };
  3. プライマリサイドバーで、[DEPLOY] セクションを展開し、[デプロイ] を選択して関数のコードを更新します。変更内容が Lambda によりデプロイされると、関数が正常に更新されたことをユーザーに知らせるバナーが、コンソールに表示されます。

関数コードを把握する

次のステップに進む前に、関数コードを読む時間を作り、Lambda の主要な概念を把握しましょう。

  • Lambda ハンドラー:

    ユーザーの Lambda 関数は、handler という名前の Node.js 関数を含んでいます。Node.js の Lambda 関数には複数の Node.js 関数を含めることができますが、コードへのエントリポイントは、常に handler 関数です。関数が呼び出されると、Lambda はこのメソッドを実行します。

    コンソールを使用して Hello world 関数を作成すると、Lambda は自動的に、関数のハンドラーメソッドの名前を handler に設定します。この Node.js 関数の名前は編集しないでください。編集すると、関数を呼び出しても Lambda はコードを実行できなくなります。

    Node.js の Lambda ハンドラーの詳細については、「Node.js の Lambda 関数ハンドラーの定義」を参照してください。

  • Lambda のイベントオブジェクト:

    関数 handler は 2 つの引数 (event および context) を受け取ります。Lambda のイベントとは JSON 形式のドキュメントであり、関数で処理するためのデータが含まれています。

    関数が別の AWS のサービス によって呼び出された場合、イベントオブジェクトには、その呼び出しの原因となったイベントに関する情報が含まれています。例えば、オブジェクトのアップロード時に Amazon Simple Storage Service (Amazon S3) バケットが関数を呼び出した場合、イベントは Amazon S3 バケットの名前とオブジェクトキーを含んでいます。

    この例では、キーと値のペア 2 つを含む JSON 形式のドキュメントをコンソールに入力することで、イベントを作成しています。

  • Lambda のコンテキストオブジェクト:

    この関数が受け取る 2 番目の引数はcontext。Lambda は、ユーザーの関数に対し、自動的にコンテキストオブジェクトを渡します。コンテキストオブジェクトは、関数の呼び出しおよび実行環境に関する情報を含んでいます。

    モニタリング目的として、コンテキストオブジェクトを使用して関数の呼び出しに関する情報を出力できます。この例では、関数が logGroupName パラメータを使用して、CloudWatch ロググループの名前を出力しています。

    Node.js の Lambda コンテキストオブジェクトの詳細については、「Lambda コンテキストオブジェクトを使用して Node.js 関数の情報を取得する」を参照してください。

  • Lambda でのログ記録:

    Node.js では、関数のログに情報を送信するために、console.log や console.error などのコンソールメソッドを使用できます。このサンプルコードでは、計算された面積と関数の CloudWatch Logs グループの名前を出力するために、console.log ステートメントを使用します。また、stdout または stderr に書き込みを行う任意のロギングライブラリも使用できます。

    詳細については、「Node.js Lambda 関数のログ記録とモニタリング」を参照してください。他のランタイムでのログ記録については、関連するランタイムの「構築方法」のページを参照してください。

Python
コンソールでコードを変更するには
  1. [コード] タブを選択します。

    Lambda が関数コードを作成すると、それがコンソールの組み込みコードエディタに表示されます。コードエディターに lambda_function.py タブが表示されない場合は、次の図に示すように、ファイルエクスプローラーで lambda_function.py 選択します。

    コンソールのコードエディターとファイルエクスプローラーの lambda_function.py ファイルを示す図
  2. 次のコードを lambda_function.py タブに貼り付け、Lambda が作成したコードを置き換えます。

    import json import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): # Get the length and width parameters from the event object. The # runtime converts the event object to a Python dictionary length = event['length'] width = event['width'] area = calculate_area(length, width) print(f"The area is {area}") logger.info(f"CloudWatch logs group: {context.log_group_name}") # return the calculated area as a JSON string data = {"area": area} return json.dumps(data) def calculate_area(length, width): return length*width
  3. プライマリサイドバーで、[DEPLOY] セクションを展開し、[デプロイ] を選択して関数のコードを更新します。変更内容が Lambda によりデプロイされると、関数が正常に更新されたことをユーザーに知らせるバナーが、コンソールに表示されます。

関数コードを把握する

次のステップに進む前に、関数コードを読む時間を作り、Lambda の主要な概念を把握しましょう。

  • Lambda ハンドラー:

    ユーザーの Lambda 関数には、lambda_handler という名前の Python 関数が含まれています。Python の Lambda 関数には複数の Python 関数を含めることができますが、コードへのエントリポイントは、常に handler 関数です。関数が呼び出されると、Lambda はこのメソッドを実行します。

    コンソールを使用して Hello world 関数を作成すると、Lambda は自動的に、関数のハンドラーメソッドの名前を lambda_handler に設定します。この Python 関数の名前は編集しないでください。編集すると、関数を呼び出しても Lambda はコードを実行できなくなります。

    Python の Lambda ハンドラーの詳細については、「Python の Lambda 関数ハンドラーの定義」を参照してください。

  • Lambda のイベントオブジェクト:

    関数 lambda_handler は 2 つの引数 (event および context) を受け取ります。Lambda のイベントとは JSON 形式のドキュメントであり、関数で処理するためのデータが含まれています。

    関数が別の AWS のサービス によって呼び出された場合、イベントオブジェクトには、その呼び出しの原因となったイベントに関する情報が含まれています。例えば、オブジェクトのアップロード時に Amazon Simple Storage Service (Amazon S3) バケットが関数を呼び出した場合、イベントは Amazon S3 バケットの名前とオブジェクトキーを含んでいます。

    この例では、キーと値のペア 2 つを含む JSON 形式のドキュメントをコンソールに入力することで、イベントを作成しています。

  • Lambda のコンテキストオブジェクト:

    この関数が受け取る 2 番目の引数はcontext。Lambda は、ユーザーの関数に対し、自動的にコンテキストオブジェクトを渡します。コンテキストオブジェクトは、関数の呼び出しおよび実行環境に関する情報を含んでいます。

    モニタリング目的として、コンテキストオブジェクトを使用して関数の呼び出しに関する情報を出力できます。この例では、関数が log_group_name パラメータを使用して、CloudWatch ロググループの名前を出力しています。

    Python の Lambda コンテキストオブジェクトの詳細については、「Lambda コンテキストオブジェクトを使用して Python 関数の情報を取得する」を参照してください。

  • Lambda でのログ記録:

    Python では、関数のログに情報を送信するために、print ステートメントまたは Python ログ記録ライブラリのいずれかを使用できます。キャプチャされる内容の違いを説明するために、このサンプルコードでは両方の方法を使用しています。本番用のアプリケーションでは、ログ記録ライブラリを使用することをお勧めします。

    詳細については、「Python Lambda 関数のログ記録とモニタリング」を参照してください。他のランタイムでのログ記録については、関連するランタイムの「構築方法」のページを参照してください。

コンソールを使用して Lambda 関数を呼び出す

Lambda コンソールを使用して自分の関数を呼び出すには、まずテストイベントを作成して、それを関数に送信します。このイベントは、キー "length" および "width" を使用するキーと値のペア 2 つを含む、JSON 形式のドキュメントです。

テストイベントを作成するには
  1. プライマリサイドバーで、[TEST EVENTS] セクションを展開し、[テストイベントを作成] を選択します。

  2. [新しいテストイベントの作成] タブで、イベント名myTestEvent を入力します。

  3. [イベント JSON] パネルに、以下を貼り付けてデフォルト値を置き換えます。

    { "length": 6, "width": 7 }
  4. [Save] を選択します。

これで、関数をテストし、Lambda コンソールと CloudWatch Logs を使用して関数呼び出しのレコードを表示できるようになります。

関数をテストして呼び出しのレコードをコンソールに表示するには
  • プライマリサイドバーの [TEST EVENTS] セクションで、テストイベントの横にある実行アイコンを選択します。関数の実行が終了すると、[実行結果] タブに応答と関数ログが表示されます。次のような結果が表示されます。

    Node.js
    Status: Succeeded Test Event Name: myTestEvent Response "{\"area\":42}" Function Logs START RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a Version: $LATEST 2023-08-31T23:39:45.313Z 5c012b0a-18f7-4805-b2f6-40912935034a INFO The area is 42 2023-08-31T23:39:45.331Z 5c012b0a-18f7-4805-b2f6-40912935034a INFO CloudWatch log group: /aws/lambda/myLambdaFunction END RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a REPORT RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a Duration: 20.67 ms Billed Duration: 21 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 163.87 ms Request ID 5c012b0a-18f7-4805-b2f6-40912935034a
    Python
    Status: Succeeded Test Event Name: myTestEvent Response "{\"area\": 42}" Function Logs START RequestId: 2d0b1579-46fb-4bf7-a6e1-8e08840eae5b Version: $LATEST The area is 42 [INFO] 2023-08-31T23:43:26.428Z 2d0b1579-46fb-4bf7-a6e1-8e08840eae5b CloudWatch logs group: /aws/lambda/myLambdaFunction END RequestId: 2d0b1579-46fb-4bf7-a6e1-8e08840eae5b REPORT RequestId: 2d0b1579-46fb-4bf7-a6e1-8e08840eae5b Duration: 1.42 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 39 MB Init Duration: 123.74 ms Request ID 2d0b1579-46fb-4bf7-a6e1-8e08840eae5b

この例では、コードの呼び出しにコンソールのテスト機能を使用しました。つまり、関数の実行結果は、コンソールに直接表示できます。関数呼び出しがコンソールの外部で行われる場合は、CloudWatch Logs を使用する必要があります。

CloudWatch Logs で関数の呼び出しレコードを表示するには
  1. Amazon CloudWatch コンソールの [[Log groups (ロググループ)] ページ] を開きます。

  2. 関数のロググループの名前を選択します (/aws/lambda/myLambdaFunction) 。これは関数がコンソールに出力したロググループ名です。

  3. [ログストリーム] タブで、関数呼び出しに対応するログストリームを選択します。

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

    Node.js
    INIT_START Runtime Version: nodejs:20.v13 Runtime Version ARN: arn:aws:lambda:us-west-2::runtime:e3aaabf6b92ef8755eaae2f4bfdcb7eb8c4536a5e044900570a42bdba7b869d9 START RequestId: aba6c0fc-cf99-49d7-a77d-26d805dacd20 Version: $LATEST 2023-08-23T22:04:15.809Z 5c012b0a-18f7-4805-b2f6-40912935034a INFO The area is 42 2023-08-23T22:04:15.810Z aba6c0fc-cf99-49d7-a77d-26d805dacd20 INFO CloudWatch log group: /aws/lambda/myLambdaFunction END RequestId: aba6c0fc-cf99-49d7-a77d-26d805dacd20 REPORT RequestId: aba6c0fc-cf99-49d7-a77d-26d805dacd20 Duration: 17.77 ms Billed Duration: 18 ms Memory Size: 128 MB Max Memory Used: 67 MB Init Duration: 178.85 ms
    Python
    INIT_START Runtime Version: python:3.12.v16 Runtime Version ARN: arn:aws:lambda:us-west-2::runtime:ca202755c87b9ec2b58856efb7374b4f7b655a0ea3deb1d5acc9aee9e297b072 START RequestId: 9d4096ee-acb3-4c25-be10-8a210f0a9d8e Version: $LATEST The area is 42 [INFO] 2023-09-01T00:05:22.464Z 9315ab6b-354a-486e-884a-2fb2972b7d84 CloudWatch logs group: /aws/lambda/myLambdaFunction END RequestId: 9d4096ee-acb3-4c25-be10-8a210f0a9d8e REPORT RequestId: 9d4096ee-acb3-4c25-be10-8a210f0a9d8e Duration: 1.15 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 40 MB

クリーンアップ

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

Lambda 関数を削除するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [Actions] (アクション)、[Delete] (削除) の順に選択します。

  4. [Delete function] (関数の削除) ダイアログボックスに「削除」と入力してから、[Delete] (削除) を選択します。

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

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

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

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

実行ロールを削除するには
  1. AWS Identity and Access Management (IAM) コンソールの [Roles (ロール)] ページを開きます。

  2. 関数の実行ロールを選択します (myLambdaFunction-role-31exxmpl など)。

  3. [削除] を選択します。

  4. [Delete role] (ロールの削除) ダイアログボックスにロール名を入力し、[Delete] (削除) を選択します。

AWS CloudFormation と AWS Command Line Interface (AWS CLI) を使用して、関数、ロググループ、ロールの作成とクリーンアップを自動化できます。

その他のリソースと次のステップ

ここまでで、コンソールを使用し簡単な Lambda 関数を作成してテストを行ったので、次の各ステップを実行します。