AWS SAM を使用した構築の概要 - AWS Serverless Application Model

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

AWS SAM を使用した構築の概要

AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) sam build コマンドを使用して、ローカルテストや AWS クラウド へのデプロイなど、開発ワークフローの後続のステップに備えてサーバーレスアプリケーションを準備します。このコマンドは、sam local および sam deploy が必要とする形式と場所でアプリケーションを構造化する .aws-sam ディレクトリを作成します。

注記

sam build を使用するには、開発マシン上のサーバーレスアプリケーションの基本コンポーネントから始める必要があります。これには、AWS SAM テンプレート、AWS Lambda 関数コード、言語固有のファイルと依存関係が含まれます。詳細については、「AWS SAM でアプリケーションを作成する」を参照してください。

sam build を使用したアプリケーションの構築

sam build を使用する前に、次を設定することを検討してください。

  1. Lambda 関数とレイヤーsam build コマンドは Lambda 関数とレイヤーを構築できます。Lambda レイヤーの詳細については、「AWS SAM での Lambda レイヤーの構築」を参照してください。

  2. Lambda ランタイム – ランタイムは、呼び出されたときに実行環境で関数を実行する言語固有の環境を提供します。ネイティブランタイムとカスタムランタイムを設定できます。

    1. ネイティブランタイム – サポートされている Lambda ランタイムで Lambda 関数を作成し、AWS クラウド でネイティブ Lambda ランタイムを使用する関数を構築します。

    2. カスタムランタイム – 任意のプログラミング言語を使用して Lambda 関数を作成し、esbuild など、makefile やサードパーティービルダーで定義されたカスタムプロセスを使用してランタイムを構築します。詳細については、「でのカスタムランタイムを使用した Lambda 関数の構築 AWS SAM」を参照してください。

  3. Lambda パッケージタイプ – Lambda 関数は、次の Lambda デプロイパッケージタイプにパッケージ化できます。

    1. .zip ファイルアーカイブ – アプリケーション コードとその依存関係が含まれます。

    2. コンテナイメージ – 基本オペレーティングシステム、ランタイム、Lambda 拡張機能、アプリケーションコードとその依存関係が含まれています。

これらのアプリケーション設定は、sam init を使用してアプリケーションを初期化するときに設定できます。

アプリケーションを構築するには
  1. cd を実行してプロジェクトのルートに移動します。これは AWS SAM テンプレートと同じ場所です。

    $ cd sam-app
  2. 下記を実行します。

    sam-app $ sam build <arguments> <options>
    注記

    一般的に使用されるオプションは --use-container です。詳細については、「指定されたコンテナ内における Lambda 関数の構築」を参照してください。

    次は AWS SAM CLI 出力の例です。

    sam-app $ sam build Starting Build use cache Manifest file is changed (new hash: 3298f1304...d4d421) or dependency folder (.aws-sam/deps/4d3dfad6-a267-47a6-a6cd-e07d6fae318c) is missing for (HelloWorldFunction), downloading dependencies and copying/building source Building codeuri: /Users/.../sam-app/hello_world runtime: python3.12 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CleanUp Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Running PythonPipBuilder:CopySource Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided
  3. AWS SAM CLI は .aws-sam ビルドディレクトリを作成します。以下に例を示します。

    .aws-sam
    ├── build
    │   ├── HelloWorldFunction
    │   │   ├── __init__.py
    │   │   ├── app.py
    │   │   └── requirements.txt
    │   └── template.yaml
    └── build.toml

アプリケーションの設定に応じて、AWS SAM CLI は次を実行します。

  1. .aws-sam/build ディレクトリ内の依存関係をダウンロード、インストール、整理します。

  2. Lambda コードを準備します。これには、コードのコンパイル、実行可能バイナリの作成、コンテナイメージの構築などが含まれます。

  3. ビルドアーティファクトを .aws-sam ディレクトリにコピーします。形式はアプリケーションパッケージの種類によって異なります。

    1. .zip パッケージタイプの場合、アーティファクトはローカルテストに使用できるようにまだ圧縮されていません。AWS SAM CLI は、sam deploy を使用するときにアプリケーションを圧縮します。

    2. コンテナイメージパッケージタイプの場合、コンテナイメージはローカルで作成され、.aws-sam/build.toml ファイル内で参照されます。

  4. AWS SAM テンプレートを .aws-sam ディレクトリにコピーし、必要に応じて新しいファイルパスで変更します。

.aws-sam ディレクトリ内のビルドアーティファクトを構成する主要なコンポーネントを次に示します。

  • ビルドディレクトリ – Lambda 関数と、互いに独立して構造化されたレイヤーが含まれます。これにより、.aws-sam/build ディレクトリ内の各関数またはレイヤー用に固有の構造が作成されます。

  • AWS SAM テンプレート – 構築プロセス中の変更に基づいて更新された値で変更されます。

  • build.toml ファイル – AWS SAM CLI で使用されるビルド設定を含む設定ファイル。

ローカルでのテストとデプロイ

sam local を使用してローカルテストを実行する場合、または sam deploy を使用してデプロイを実行する場合、AWS SAM CLI は次を実行します。

  1. まず、.aws-sam ディレクトリが存在するかどうか、およびそのディレクトリ内に AWS SAM テンプレートが存在するかどうかを確認します。これらの条件が満たされる場合、AWS SAM CLI はこれをアプリケーションのルートディレクトリとみなします。

  2. これらの条件が満たされない場合、AWS SAM CLI は AWS SAM テンプレートの元の場所をアプリケーションのルートディレクトリとみなします。

開発中、元のアプリケーションファイルに変更が加えられた場合は、ローカルでテストする前に、sam build を実行して .aws-sam ディレクトリを更新します。

ベストプラクティス

  • .aws-sam/build ディレクトリ内のコードは編集しないでください。代わりに、プロジェクトフォルダ内の元のソースコードを更新し、sam build を実行して .aws-sam/build ディレクトリを更新します。

  • 元のファイルを変更する場合は、sam build を実行して .aws-sam/build ディレクトリを更新します。

  • sam local を使用して開発およびテストする場合など、AWS SAM CLI が .aws-sam ディレクトリではなくプロジェクトの元のルートディレクトリを参照するようにしたい場合があります。.aws-sam ディレクトリまたは .aws-sam ディレクトリ内の AWS SAM テンプレートを削除して、AWS SAM CLI が元のプロジェクトディレクトリをルートプロジェクトディレクトリとして認識するようにします。準備ができたら、再度 sam build を実行して .aws-sam ディレクトリを作成します。

  • sam build を実行すると、.aws-sam/build ディレクトリは毎回上書きされます。.aws-sam ディレクトリは毎回上書きしません。ログなどのファイルを保存する場合は、上書きされないように .aws-sam に保存します。

sam build のオプション

単一のリソースの構築

リソースの論理 ID を指定して、そのリソースのみを構築します。以下に例を示します。

$ sam build HelloWorldFunction

ネストされたアプリケーションまたはスタックのリソースを構築するには、<stack-logical-id>/<resource-logical-id> 形式を使用して、リソースの論理 ID と共に、アプリケーションまたはスタックの論理 ID を指定します。

$ sam build MyNestedStack/MyFunction

指定されたコンテナ内における Lambda 関数の構築

--use-container オプションはコンテナイメージをダウンロードし、それを使用して Lambda 関数を構築します。その後、ローカルコンテナが .aws-sam/build.toml ファイル内で参照されます。

このオプションでは Docker をインストールする必要があります。手順については、Docker のインストール を参照してください。

このコマンドの例を次に示します。

$ sam build --use-container

--build-image オプションで使用するコンテナイメージを指定できます。以下に例を示します。

$ sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x

単一の関数に使用するコンテナイメージを指定するには、関数の論理 ID を指定します。以下に例を示します。

$ sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12

環境変数をビルドコンテナに渡す

--container-env-var を使用して、環境変数をビルドコンテナに渡します。以下に例を示します。

$ sam build --use-container --container-env-var Function1.GITHUB_TOKEN=<token1> --container-env-var GLOBAL_ENV_VAR=<global-token>

ファイルから環境変数を渡すには、--container-env-var-file オプションを使用します。以下に例を示します。

$ sam build --use-container --container-env-var-file <env.json>

env.json ファイルの例:

{ "MyFunction1": { "GITHUB_TOKEN": "TOKEN1" }, "MyFunction2": { "GITHUB_TOKEN": "TOKEN2" } }

複数の関数を含むアプリケーションの構築を高速化する

複数の関数を含むアプリケーションで sam build を実行する場合、AWS SAM CLI は各関数を一度に 1 つずつ構築します。構築プロセスを高速化するには、--parallel オプションを使用します。これにより、すべての関数とレイヤーが同時に構築されます。

このコマンドの例を次に示します。

$ sam build —-parallel

ソースフォルダにプロジェクトを構築することでビルド時間を短縮する

サポートされているランタイムとビルドメソッドについては、--build-in-source オプションを使用してプロジェクトをソースフォルダに直接構築できます。デフォルトでは、AWS SAM CLI は一時ディレクトリに構築されます。これは、ソースコードとプロジェクトファイルのコピーを伴います。--build-in-source を使用すると、AWS SAM CLI はソースフォルダに直接構築するため、ファイルを一時ディレクトリにコピーする必要がなくなり、ビルドプロセスが高速化されます。

サポートされているランタイムとビルドメソッドのリストについては、「--build-in-source」を参照してください。

トラブルシューティング

AWS SAM CLI をトラブルシューティングするには、「AWS SAMCLI トラブルシューティング」を参照してください。

ネイティブランタイムと .zip パッケージタイプを使用するアプリケーションの構築

この例については、「チュートリアル: で Hello World アプリケーションをデプロイする AWS SAM」を参照してください。

ネイティブランタイムとイメージパッケージタイプを使用するアプリケーションの構築

まず、新しいアプリケーションを初期化するために sam init を実行します。インタラクティブなフロー中に、Image パッケージタイプを選択します。以下に例を示します。

$ sam init ... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API 4 - Scheduled task 5 - Standalone function 6 - Data processing 7 - Hello World Example With Powertools 8 - Infrastructure event management 9 - Serverless Connector Hello World Example 10 - Multi-step workflow with Connectors 11 - Lambda EFS example 12 - DynamoDB Example 13 - Machine Learning Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: ENTER Which runtime would you like to use? ... 10 - java8 11 - nodejs20.x 12 - nodejs18.x 13 - nodejs16.x ... Runtime: 12 What package type would you like to use? 1 - Zip 2 - Image Package type: 2 Based on your selections, the only dependency manager available is npm. We will proceed copying the template using npm. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER Project name [sam-app]: ENTER Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sam-app Base Image: amazon/nodejs18.x-base Architectures: x86_64 Dependency Manager: npm Output Directory: . Configuration file: sam-app/samconfig.toml Next steps can be found in the README file at sam-app/README.md ...

AWS SAM CLI はアプリケーションを初期化し、次のプロジェクトディレクトリを作成します。

sam-app
├── README.md
├── events
│   └── event.json
├── hello-world
│   ├── Dockerfile
│   ├── app.mjs
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.mjs
├── samconfig.toml
└── template.yaml

次に、アプリケーションを構築するために sam build を実行します。

sam-app $ sam build Building codeuri: /Users/.../build-demo/sam-app runtime: None metadata: {'DockerTag': 'nodejs18.x-v1', 'DockerContext': '/Users/.../build-demo/sam-app/hello-world', 'Dockerfile': 'Dockerfile'} architecture: arm64 functions: HelloWorldFunction Building image for HelloWorldFunction function Setting DockerBuildArgs: {} for HelloWorldFunction function Step 1/4 : FROM public.ecr.aws/lambda/nodejs:18 ---> f5b68038c080 Step 2/4 : COPY app.mjs package*.json ./ ---> Using cache ---> 834e565aae80 Step 3/4 : RUN npm install ---> Using cache ---> 31c2209dd7b5 Step 4/4 : CMD ["app.lambdaHandler"] ---> Using cache ---> 2ce2a438e89d Successfully built 2ce2a438e89d Successfully tagged helloworldfunction:nodejs18.x-v1 Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided

コンパイルされたプログラミング言語を含むアプリケーションの構築

この例では、Go ランタイムを使用して Lambda 関数を含むアプリケーションを構築します。

まず、sam init を使用して新しいアプリケーションを初期化し、アプリケーションが Go を使用するように設定します。

$ sam init ... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API ... Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: ENTER Which runtime would you like to use? ... 4 - dotnetcore3.1 5 - go1.x 6 - go (provided.al2) ... Runtime: 5 What package type would you like to use? 1 - Zip 2 - Image Package type: 1 Based on your selections, the only dependency manager available is mod. We will proceed copying the template using mod. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER Project name [sam-app]: ENTER Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sam-app Runtime: go1.x Architectures: x86_64 Dependency Manager: mod Application Template: hello-world Output Directory: . Configuration file: sam-app/samconfig.toml Next steps can be found in the README file at sam-app-go/README.md ...

AWS SAM CLI はアプリケーションを初期化します。アプリケーションのディレクトリ構造の例を次に示します。

sam-app
├── Makefile
├── README.md
├── events
│   └── event.json
├── hello-world
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── main_test.go
├── samconfig.toml
└── template.yaml

このアプリケーションの要件については、README.md ファイルを参照します。

...
## Requirements
* AWS CLI already configured with Administrator permission
* [Docker installed](https://www.docker.com/community-edition)
* [Golang](https://golang.org)
* SAM CLI - [Install the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
...

次に、関数をテストするために sam local invoke を実行します。Go がローカルマシンにインストールされていないため、このコマンドはエラーになります。

sam-app $ sam local invoke Invoking hello-world (go1.x) Local image was not found. Removing rapid images for repo public.ecr.aws/sam/emulation-go1.x Building image................................................................................................................................................................................................................................................. Using local image: public.ecr.aws/lambda/go:1-rapid-x86_64. Mounting /Users/.../Playground/build/sam-app/hello-world as /var/task:ro,delegated inside runtime container START RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 Version: $LATEST fork/exec /var/task/hello-world: no such file or directory: PathError null END RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 REPORT RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 Init Duration: 0.88 ms Duration: 175.75 ms Billed Duration: 176 ms Memory Size: 128 MB Max Memory Used: 128 MB {"errorMessage":"fork/exec /var/task/hello-world: no such file or directory","errorType":"PathError"}%

次に、アプリケーションを構築するために sam build を実行します。Go がローカルマシンにインストールされていないため、エラーが発生しました:

sam-app $ sam build Starting Build use cache Cache is invalid, running build and copying resources for following functions (HelloWorldFunction) Building codeuri: /Users/.../Playground/build/sam-app/hello-world runtime: go1.x metadata: {} architecture: x86_64 functions: HelloWorldFunction Build Failed Error: GoModulesBuilder:Resolver - Path resolution for runtime: go1.x of binary: go was not successful

関数を適切に構築するようにローカルマシンを設定することもできますが、代わりに sam build--use-container オプションを使用します。AWS SAM CLI はコンテナイメージをダウンロードし、ネイティブ GoModulesBuilder を使用して関数を構築し、結果として得られるバイナリを .aws-sam/build/HelloWorldFunction ディレクトリにコピーします。

sam-app $ sam build --use-container Starting Build use cache Starting Build inside a container Cache is invalid, running build and copying resources for following functions (HelloWorldFunction) Building codeuri: /Users/.../build/sam-app/hello-world runtime: go1.x metadata: {} architecture: x86_64 functions: HelloWorldFunction Fetching public.ecr.aws/sam/build-go1.x:latest-x86_64 Docker container image..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... Mounting /Users/.../build/sam-app/hello-world as /tmp/samcli/source:ro,delegated inside runtime container Running GoModulesBuilder:Build Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided

.aws-sam ディレクトリの例を次に示します。

.aws-sam
├── build
│   ├── HelloWorldFunction
│   │   └── hello-world
│   └── template.yaml
├── build.toml
├── cache
│   └── c860d011-4147-4010-addb-2eaa289f4d95
│       └── hello-world
└── deps

次に、sam local invoke を実行します。関数は正常に呼び出されます。

sam-app $ sam local invoke Invoking hello-world (go1.x) Local image is up-to-date Using local image: public.ecr.aws/lambda/go:1-rapid-x86_64. Mounting /Users/.../Playground/build/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 Version: $LATEST END RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 REPORT RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 Init Duration: 1.20 ms Duration: 1782.46 ms Billed Duration: 1783 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"headers":null,"multiValueHeaders":null,"body":"Hello, 72.21.198.67\n"}%

詳細はこちら

sam build コマンドの使用方法の詳細については、次を参照してください。