アプリケーションのビルド - AWS Serverless Application Model

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

アプリケーションのビルド

サーバーレスアプリケーションを構築するには、sam buildコマンド。このコマンドは、アプリケーションの依存関係のビルド成果物を収集し、ローカルでのテスト、パッケージング、デプロイなどの次のステップのために適切な形式と場所に配置します。

アプリケーションの依存関係は、マニフェストファイル (requirements.txt(Python) またはpackage.json(Node.js) を使用するか、Layersプロパティです。-Layersプロパティには、AWS Lambda レイヤーLambda 関数が依存するリソースです。

アプリケーションのビルド成果物の形式は、各関数のPackageTypeプロパティ。このプロパティのオプションは次のとおりです。

  • Zip— アプリケーションコードとその依存関係を含む .zip ファイルアーカイブ。コードを .zip ファイルアーカイブとしてパッケージ化する場合は、関数に Lambda ランタイムを指定する必要があります。

  • Image— コンテナイメージです。アプリケーションコードとその依存関係に加えて、基盤となるオペレーティングシステム、ランタイム、の拡張機能が含まれています。

Lambda パッケージタイプの詳細については、Lambda デプロイパッケージ()AWS Lambda デベロッパーガイド

.zip ファイルアーカイブのビルド

サーバーレスアプリケーションを.zip ファイルアーカイブとして構築するには、PackageType: Zipあなたのサーバーレス機能のために。

Lambda 関数がネイティブにコンパイルされたプログラムのあるパッケージに依存する場合は、--use-containerフラグ。このフラグは、関数を Lambda 環境のように動作する Docker コンテナにローカルにコンパイルするため、AWS クラウドにデプロイするときに適切な形式になります。

使用すると、--use-containerオプションを使用する場合、デフォルトでは AWS SAM はコンテナイメージをAmazon ECR パブリック。別のリポジトリ(DockerHub など)からコンテナーイメージを取得したい場合は、--build-imageオプションを選択し、代替コンテナーイメージの URI を指定します。次に、DockerHub リポジトリからコンテナーイメージを使用してアプリケーションを構築するための 2 つのコマンドの例を示します。

# Build a Node.js 12 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs12.x # Build a function resource using using the Python 3.8 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.8

URI のリストについては、--build-image「」を参照してください。イメージリポジトリには、サポートされている多くのランタイムの DockerHub URI が含まれています。

.zip ファイルアーカイブアプリケーションを構築するその他の例については、このトピックの「例」セクションを参照してください。

コンテナイメージのビルド

サーバーレスアプリケーションをコンテナーイメージとして構築するには、PackageType: Imageあなたのサーバーレス機能のために。また、宣言する必要がありますMetadataリソース属性を、次のエントリで置き換えます。

Dockerfile

Lambda 関数に関連付けられた Dockerfile の名前。

DockerContext

Dockerfile の場所。

DockerTag

(オプション)ビルドされたイメージに適用するタグ。

DockerBuildArgs

ビルドの引数を作成します。

次に例を示します。Metadataリソース属性セクション:

Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

で構成されているサンプルアプリケーションをダウンロードするにはImageパッケージタイプの詳細については、ステップ 1: サンプルの AWS SAM アプリケーションのダウンロードチュートリアル: Hello World アプリケーションのデプロイ。インストールするパッケージの種類を確認するプロンプトで、Image

コンテナ環境変数ファイル

ビルドコンテナの環境変数を含む JSON ファイルを提供するには、--container-env-var-file引数をsam buildコマンド。すべてのサーバーレスリソースに適用される 1 つの環境変数を指定することも、リソースごとに異なる環境変数を指定することもできます。

Format

環境変数をビルドコンテナに渡す形式は、リソースに提供する環境変数数によって異なります。

すべてのリソースに対して単一の環境変数を提供するには、Parametersオブジェクトは次のようになります。

{ "Parameters": { "GITHUB_TOKEN": "TOKEN_GLOBAL" } }

リソースごとに異なる環境変数を提供するには、次のようにリソースごとにオブジェクトを指定します。

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

環境変数をファイルとして保存します。たとえば、env.json。次のコマンドは、このファイルを使用して、環境変数をビルドコンテナに渡します。

sam build --use-container --container-env-var-file env.json

Precedence

  • 特定のリソースに対して指定する環境変数は、すべてのリソースに対して 1 つの環境変数よりも優先されます。

  • コマンドラインで指定する環境変数は、ファイル内の環境変数よりも優先されます。

Examples

例 1: .zip ファイルアーカイブ

以下のようになりますsam buildコマンドは.zip ファイルアーカイブを作成します。

# Build all functions and layers, and their dependencies sam build # Run the build process inside a Docker container that functions like a Lambda environment sam build --use-container # Build a Node.js 12 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs12.x # Build a function resource using using the Python 3.8 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.8 # Build and run your functions locally sam build && sam local invoke # For more options sam build --help

例 2: コンテナイメージ

次の AWS SAM テンプレートは、コンテナーイメージとしてビルドされます。

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: PackageType: Image ImageConfig: Command: ["app.lambda_handler"] Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

次に、Dockerfileの例を示します。

FROM public.ecr.aws/lambda/python:3.8 COPY app.py requirements.txt ./ RUN python3.8 -m pip install -r requirements.txt # Overwrite the command by providing a different command directly in the template. CMD ["app.lambda_handler"]