翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SAM を使用した構築の概要
AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) sam build
コマンドを使用して、ローカルテストや AWS クラウド へのデプロイなど、開発ワークフローの後続のステップに備えてサーバーレスアプリケーションを準備します。このコマンドは、sam local
および sam deploy
が必要とする形式と場所でアプリケーションを構造化する .aws-sam
ディレクトリを作成します。
-
AWS SAM CLI の概要については、「AWS SAMCLI とは?」を参照してください。
-
sam build
コマンドオプションのリストについては、「sam build」を参照してください。 -
一般的な開発ワークフローでの
sam build
の使用例については、「ステップ 2: アプリケーションを構築する」を参照してください。
注記
sam build
を使用するには、開発マシン上のサーバーレスアプリケーションの基本コンポーネントから始める必要があります。これには、AWS SAM テンプレート、AWS Lambda 関数コード、言語固有のファイルと依存関係が含まれます。詳細については、「AWS SAM でアプリケーションを作成する」を参照してください。
sam build を使用したアプリケーションの構築
sam build
を使用する前に、次を設定することを検討してください。
-
Lambda 関数とレイヤー –
sam build
コマンドは Lambda 関数とレイヤーを構築できます。Lambda レイヤーの詳細については、「AWS SAM での Lambda レイヤーの構築」を参照してください。 -
Lambda ランタイム – ランタイムは、呼び出されたときに実行環境で関数を実行する言語固有の環境を提供します。ネイティブランタイムとカスタムランタイムを設定できます。
-
ネイティブランタイム – サポートされている Lambda ランタイムで Lambda 関数を作成し、AWS クラウド でネイティブ Lambda ランタイムを使用する関数を構築します。
-
カスタムランタイム – 任意のプログラミング言語を使用して Lambda 関数を作成し、esbuild など、makefile やサードパーティービルダーで定義されたカスタムプロセスを使用してランタイムを構築します。詳細については、「でのカスタムランタイムを使用した Lambda 関数の構築 AWS SAM」を参照してください。
-
-
Lambda パッケージタイプ – Lambda 関数は、次の Lambda デプロイパッケージタイプにパッケージ化できます。
-
.zip ファイルアーカイブ – アプリケーション コードとその依存関係が含まれます。
-
コンテナイメージ – 基本オペレーティングシステム、ランタイム、Lambda 拡張機能、アプリケーションコードとその依存関係が含まれています。
-
これらのアプリケーション設定は、sam init
を使用してアプリケーションを初期化するときに設定できます。
-
sam init
の使用の詳細については、「AWS SAM でアプリケーションを作成する」を参照してください。 -
アプリケーションでのこれらの設定の詳細については、「AWS SAM を使用したデフォルトのビルド」を参照してください。
アプリケーションを構築するには
-
cd
を実行してプロジェクトのルートに移動します。これは AWS SAM テンプレートと同じ場所です。$
cd
sam-app
-
下記を実行します。
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 -
AWS SAM CLI は
.aws-sam
ビルドディレクトリを作成します。以下に例を示します。.aws-sam ├── build │ ├── HelloWorldFunction │ │ ├── __init__.py │ │ ├── app.py │ │ └── requirements.txt │ └── template.yaml └── build.toml
アプリケーションの設定に応じて、AWS SAM CLI は次を実行します。
-
.aws-sam/build
ディレクトリ内の依存関係をダウンロード、インストール、整理します。 -
Lambda コードを準備します。これには、コードのコンパイル、実行可能バイナリの作成、コンテナイメージの構築などが含まれます。
-
ビルドアーティファクトを
.aws-sam
ディレクトリにコピーします。形式はアプリケーションパッケージの種類によって異なります。-
.zip パッケージタイプの場合、アーティファクトはローカルテストに使用できるようにまだ圧縮されていません。AWS SAM CLI は、
sam deploy
を使用するときにアプリケーションを圧縮します。 -
コンテナイメージパッケージタイプの場合、コンテナイメージはローカルで作成され、
.aws-sam/build.toml
ファイル内で参照されます。
-
-
AWS SAM テンプレートを
.aws-sam
ディレクトリにコピーし、必要に応じて新しいファイルパスで変更します。
.aws-sam
ディレクトリ内のビルドアーティファクトを構成する主要なコンポーネントを次に示します。
-
ビルドディレクトリ – Lambda 関数と、互いに独立して構造化されたレイヤーが含まれます。これにより、
.aws-sam/build
ディレクトリ内の各関数またはレイヤー用に固有の構造が作成されます。 -
AWS SAM テンプレート – 構築プロセス中の変更に基づいて更新された値で変更されます。
-
build.toml ファイル – AWS SAM CLI で使用されるビルド設定を含む設定ファイル。
ローカルでのテストとデプロイ
sam local
を使用してローカルテストを実行する場合、または sam deploy
を使用してデプロイを実行する場合、AWS SAM CLI は次を実行します。
-
まず、
.aws-sam
ディレクトリが存在するかどうか、およびそのディレクトリ内に AWS SAM テンプレートが存在するかどうかを確認します。これらの条件が満たされる場合、AWS SAM CLI はこれをアプリケーションのルートディレクトリとみなします。 -
これらの条件が満たされない場合、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
ネストされたアプリケーションまたはスタックのリソースを構築するには、
形式を使用して、リソースの論理 ID と共に、アプリケーションまたはスタックの論理 ID を指定します。<stack-logical-id>
/<resource-logical-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-varGLOBAL_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
コマンドの使用方法の詳細については、次を参照してください。
-
AWS SAM の学習: sam build
– YouTube での Serverless Land の「AWS SAM の学習」シリーズ。 -
AWS SAM の学習 | sam build | E3
– YouTube での Serverless Land の「AWS SAM の学習」シリーズ。 -
AWS SAM ビルド: デプロイ用のアーティファクトを提供する方法 (SAM S2E8 を使用したセッション)
– YouTube での AWS SAM を使用したセッションのシリーズ。 -
AWS SAM カスタムビルド: Makefile を使用して SAM (S2E9) でビルドをカスタマイズする方法
– YouTube での AWS SAM を使用したセッションのシリーズ。