sam sync を使用する - AWS Serverless Application Model

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

sam sync を使用する

AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) sam sync コマンドは、ローカルアプリケーションの変更を AWS クラウド に迅速に同期するためのオプションを提供します。アプリケーションを開発する際に次の目的で sam sync を使用します。

  1. ローカルの変更を自動的に検出し、AWS クラウド に同期する。

  2. AWS クラウド に同期するローカル変更をカスタマイズする。

  3. テストと検証のためにクラウドでアプリケーションを準備する。

sam sync を使用すると、テストや検証のためにローカルの変更をクラウドに同期するのにかかる時間を短縮する、迅速な開発ワークフローを作成できます。

注記

sam sync コマンドは開発環境に推奨されます。本番環境の場合は、sam deploy を使用するか、または継続的インテグレーションおよびデリバリー (CI/CD) パイプラインを設定することをお勧めします。詳細については、「サーバーレスアプリケーションのデプロイ」を参照してください。

sam sync コマンドは AWS SAM Accelerate の一部です。AWS SAM Accelerate は、AWS クラウド でのサーバーレスアプリケーションの開発およびテストのエクスペリエンスを高速化するために使用できるツールを提供します。

ローカルの変更を自動的に検出して AWS クラウド に同期する

アプリケーションと AWS クラウド の同期を開始する --watch オプションを指定して sam sync を実行します。これは次を実行します。

  1. アプリケーションを構築する – このプロセスは、sam build コマンドの使用と似ています。

  2. アプリケーションをデプロイする – AWS SAM CLI は、デフォルト設定を使用してアプリケーションを AWS CloudFormation にデプロイします。次のデフォルト値が使用されます。

    1. .aws ユーザーフォルダにある AWS 認証情報と一般的な構成設定。

    2. アプリケーションの samconfig.toml ファイルにあるアプリケーションデプロイ設定。

    デフォルト値が見つからない場合、AWS SAM CLI はその旨を通知し、同期プロセスを終了します。

  3. ローカルの変更を監視する – AWS SAM CLI は実行を継続し、アプリケーションに対するローカルの変更を監視します。これが --watch オプションによって提供されるものです。

    このオプションは、デフォルトでオンになっている場合があります。デフォルト値については、アプリケーションの samconfig.toml ファイルを参照してください。ファイルの例を次に示します。

    ... [default.sync] [default.sync.parameters] watch = true ...
  4. ローカルの変更を AWS クラウド に同期する – ローカルで変更を加えると、AWS SAM CLI はそれらの変更を検出し、利用可能な最も速い方法で AWS クラウド に同期します。変更の種類に応じて、次のような状況が発生する可能性があります。

    1. 更新されたリソースが AWS サービス API をサポートしている場合、AWS SAM CLI はそれを使用して変更をデプロイします。これにより、AWS クラウド 内のリソースを更新するための迅速な同期が行われます。

    2. 更新されたリソースが AWS サービス API をサポートしていない場合、AWS SAM CLI は AWS CloudFormation デプロイを実行します。これにより、AWS クラウド 内のアプリケーション全体が更新されます。迅速さは劣りますが、デプロイを手動で開始する必要がなくなります。

sam sync コマンドは AWS クラウド のアプリケーションを自動的に更新するため、開発環境のみに推奨されます。sam sync を実行すると、次を確認するよう求められます。

**The sync command should only be used against a development stack**.

Confirm that you are synchronizing a development stack.

Enter Y to proceed with the command, or enter N to cancel:
 [Y/n]: ENTER

AWS クラウド に同期するローカル変更をカスタマイズする

AWS クラウド に同期するローカル変更をカスタマイズするオプションを指定します。これにより、テストと検証のためにクラウドでローカルの変更が表示されるまでにかかる時間を短縮できます。

例えば、AWS Lambda 関数コードなどのコード変更のみを同期する --code オプションを指定します。開発中、特に Lambda コードに注力している場合、これを使用することで、テストと検証のために変更をすぐにクラウドに取り込むことができます。以下に例を示します。

$ sam sync --code --watch

特定の Lambda 関数またはレイヤーのコード変更のみを同期するには、--resource-id オプションを使用します。以下に例を示します。

$ sam sync --code --resource-id HelloWorldFunction --resource-id HelloWorldLayer

テストと検証のためにクラウドでアプリケーションを準備する

sam sync コマンドは、AWS クラウド でアプリケーションを更新するために利用できる最も迅速な方法を自動的に見つけます。これにより、開発とクラウドテストのワークフローが高速化されます。AWS サービス API を利用すると、サポートされているリソースを迅速に開発、同期、テストできます。実践的な例については、「包括的な AWS SAM ワークショップ」の「モジュール 6 - AWS SAM による加速」を参照してください。

sam sync コマンドのオプション

sam sync コマンドの変更に使用できる主なオプションの一部を次に示します。すべてのオプションのリストについては、「sam sync」を参照してください。

1 回限りの AWS CloudFormation デプロイを実行する

自動同期をオフにする --no-watch オプションを使用します。以下に例を示します。

$ sam sync --no-watch

AWS SAM CLI は 1 回限りの AWS CloudFormation デプロイを実行します。このコマンドは、sam build および sam deploy コマンドによって実行されるアクションをグループ化します。

初期の AWS CloudFormation デプロイをスキップする

sam sync を実行するたびに AWS CloudFormation デプロイが必要かどうかをカスタマイズできます。

  • sam sync を実行するたびに AWS CloudFormation デプロイを要求するには --no-skip-deploy-sync を指定します。これにより、ローカルインフラストラクチャが確実に AWS CloudFormation に同期され、ドリフトが防止されます。このオプションを使用すると、開発およびテストのワークフローにさらに時間がかかります。

  • AWS CloudFormation デプロイをオプションにするには --skip-deploy-sync を指定します。AWS SAM CLI はローカル AWS SAM テンプレートとデプロイされた AWS CloudFormation テンプレートを比較し、変更が検出されない場合は初期の AWS CloudFormation デプロイをスキップします。AWS CloudFormation デプロイをスキップすると、ローカルの変更を AWS クラウド に同期するときに時間を節約できます。

    変更が検出されない場合でも、AWS SAM CLI は次のシナリオで AWS CloudFormation デプロイを実行します。

    • 前回の AWS CloudFormation デプロイから 7 日間以上が経過している場合。

    • 多数の Lambda 関数コードの変更が検出された場合 (AWS CloudFormation デプロイがアプリケーションを更新する最も迅速な方法となります)。

以下に例を示します。

$ sam sync --skip-deploy-sync

ネストされたスタックからリソースを同期する

ネストされたスタックからリソースを同期するには
  1. --stack-name を使用してルートスタックを指定します。

  2. 次の形式を使用して、ネストされたスタック内のリソースを識別します: nestedStackId/resourceId

  3. --resource-id を使用して、ネストされたスタックにリソースを提供します。

    以下に例を示します。

    $ sam sync --code --stack-name sam-app --resource-id myNestedStack/HelloWorldFunction

ネストしたアプリケーションの作成方法については、「ネストされたアプリケーションの使用」を参照してください。

更新する特定の AWS CloudFormation スタックを指定する

更新する特定の AWS CloudFormation スタックを指定するには、--stack-name オプションを指定します。以下に例を示します。

$ sam sync --stack-name dev-sam-app

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

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

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

同期を開始しないファイルとフォルダを指定する

更新時に同期を開始しないファイルまたはフォルダを指定するには --watch-exclude オプションを使用します。このオプションの詳細については、「--watch-exclude」を参照してください。

HelloWorldFunction 関数に関連付けられた package-lock.json ファイルを除外する例を次に示します。

$ sam sync --watch --watch-exclude HelloWorldFunction=package-lock.json

このコマンドを実行すると、AWS SAM CLI は同期プロセスを開始します。これには以下が含まれます。

  • sam build を実行して関数を構築し、デプロイに向けてアプリケーションを準備します。

  • アプリケーションをデプロイするには sam deploy を実行します。

  • アプリケーションに対する変更を監視します。

package-lock.json ファイルを変更しても、AWS SAM CLI は同期を開始しません。別のファイルが更新されると、AWS SAM CLI は同期を開始します。これには package-lock.json ファイルが含まれます。

子スタックの Lambda 関数を指定する例を次に示します。

$ sam sync --watch --watch-exclude ChildStackA/MyFunction=database.sqlite3

トラブルシューティング

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

sam sync を使用して Hello World アプリケーションを更新する

この例では、サンプルの Hello World アプリケーションを初期化することから始めます。このアプリケーションの詳細については、「チュートリアル: Hello World アプリケーションのデプロイ」を参照してください。

sam sync を実行すると、構築とデプロイのプロセスが開始されます。

$ sam sync The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without performing a CloudFormation deployment. This will cause drift in your CloudFormation stack. **The sync command should only be used against a development stack**. Confirm that you are synchronizing a development stack. Enter Y to proceed with the command, or enter N to cancel: [Y/n]: Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder (.aws-sam/deps/0663e6fe-a888-4efb-b908-e2344261e9c7) is missing for (HelloWorldFunction), downloading dependencies and copying/building source Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CleanUp Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 11:17:19 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt Resource creation Initiated ack CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - CREATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d Resource creation Initiated 5f9d CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack creation succeeded. Sync infra completed. Infra sync completed. CodeTrigger not created as CodeUri or DefinitionUri is missing for ServerlessRestApi.

デプロイが完了したら、HelloWorldFunction コードを変更します。AWS SAM CLI はこの変更を検出し、アプリケーションを AWS クラウド に同期します。AWS Lambda は AWS サービス API をサポートしているため、クイック同期が実行されます。

Syncing Lambda Function HelloWorldFunction...
Manifest is not changed for (HelloWorldFunction), running incremental build
Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CopySource
Finished syncing Lambda Function HelloWorldFunction.

次に、アプリケーションの AWS SAM テンプレート内の API エンドポイントを変更します。/hello/helloworld に変更します。

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: HelloWorldFunction: ... Properties: ... Events: HelloWorld: Type: Api Properties: Path: /helloworld Method: get

Amazon API Gateway リソースは AWS サービス API をサポートしていないため、AWS SAM CLI は自動的に AWS CloudFormation デプロイを実行します。以下は、その出力例です。

Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest is not changed for (HelloWorldFunction), running incremental build Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9 --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 14:41:18 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- UPDATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded UPDATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - UPDATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Requested update requires the ssionProd creation of a new physical resource; hence creating one. UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e Resource creation Initiated d3cd CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE_CLEANUP_IN_PROGRE AWS::CloudFormation::Stack sam-app - SS DELETE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd DELETE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d DELETE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack DELETE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack update succeeded. Sync infra completed. Infra sync completed.

詳細はこちら

すべての sam sync オプションの説明については、「sam sync」を参照してください。