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 클라우드에 동기화

--watch 옵션으로 sam sync를 실행하여 애플리케이션을 AWS 클라우드에 동기화하기 시작합니다. 는 다음 동작을 수행합니다.

  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 Accelerate 섹션을 참조하세요.

sam sync 명령의 옵션

다음은 sam sync 명령을 수정하는 데 사용할 수 있는 몇 가지 주요 옵션입니다. 콘텐츠 옵션 목록은 sam sync 섹션을 참조하세요.

일회성 AWS CloudFormation 배포 수행

--no-watch 옵션을 사용하여 자동 동기화를 끕니다. 다음은 그 예제입니다.

$ sam sync --no-watch

AWS SAM CLI는 일회성 AWS CloudFormation 배포를 수행합니다. 이 명령은 sam buildsam deploy 명령으로 수행된 작업을 그룹화합니다.

초기 AWS CloudFormation 배포는 건너뜁니다.

AWS CloudFormation이 실행될 때마다 sam sync 배포가 필요한지 여부를 사용자 지정할 수 있습니다.

  • 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 섹션을 참조하세요.