

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 를 사용한 기본 빌드 AWS SAM
<a name="serverless-sam-cli-using-build"></a>

서버리스 애플리케이션을 구축하려면 `sam build` 명령을 사용합니다. 또한 이 명령은 애플리케이션 종속성의 구축 아티팩트를 수집하여 로컬 테스트, 패키징, 배포와 같은 다음 단계를 위해 적절한 형식과 위치에 배치합니다.

`requirements.txt`(Python) 또는 `package.json`(Node.js) 같은 매니페스트 파일에서 또는 함수 리소스의 `Layers` 속성을 사용하여 애플리케이션의 종속성을 지정합니다. `Layers` 속성에는 Lambda 함수가 의존하는 [AWS Lambda 계층](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) 리소스 목록이 포함되어 있습니다.

애플리케이션 구축 아티팩트의 형식은 각 함수의 `PackageType` 속성에 따라 달라집니다. 이 속성의 옵션은 다음과 같습니다.
+ **`Zip`** – 애플리케이션 코드와 그 종속 항목을 포함하는 .zip 파일 아카이브입니다. 코드를 .zip 파일 아카이브로 패키징하는 경우 함수의 Lambda 런타임을 지정해야 합니다.
+ **`Image`** - 애플리케이션 코드 및 그 종속 항목에 추가하여 기본 운영 체제, 런타임, 익스텐션 등을 포함하는 컨테이너 이미지입니다.

Lambda 패키지 유형에 대한 자세한 내용은 [개발자 가이드](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)의 *AWS Lambda Lambda 배포 패키지*를 참조하세요.

**Topics**
+ [.zip 파일 아카이브 만들기](#build-zip-archive)
+ [컨테이너 이미지 구축](#build-container-image)
+ [컨테이너 환경 변수 파일](#serverless-sam-cli-using-container-environment-file)
+ [소스 폴더에서 프로젝트를 빌드하여 빌드 시간 단축](#serverless-sam-cli-using-build-in-source)
+ [예제](#building-applications-examples)
+ [외부에서 함수 빌드 AWS SAM](#building-applications-skip)

## .zip 파일 아카이브 만들기
<a name="build-zip-archive"></a>

서버리스 애플리케이션을 .zip 파일 아카이브로 구축하려면 서버리스 함수에 대해 `PackageType: Zip`을 선언합니다.

AWS SAM 는 지정한 [아키텍처](sam-resource-function.md#sam-function-architectures)에 대한 애플리케이션을 빌드합니다. 아키텍처를 지정하지 않으면 `x86_64` 기본적으로를 AWS SAM 사용합니다.

Lambda 함수가 기본적으로 컴파일된 프로그램이 있는 패키지에 의존하는 경우 `--use-container` 플래그를 사용하십시오. 이 플래그는 Lambda 환경처럼 작동하는 컨테이너에서 함수를 로컬로 컴파일하므로 AWS 클라우드에 배포할 때 올바른 형식입니다.

`--use-container` 옵션을 사용하면는 기본적으로 [Amazon ECR Public](https://docs.aws.amazon.com/AmazonECR/latest/public/what-is-ecr.html)에서 컨테이너 이미지를 AWS SAM 가져옵니다. 다른 리포지토리 또는 특정 버전의 AWS SAM CLI에 대해 컨테이너 이미지를 가져오려면 `--build-image` 옵션을 사용하고 대체 컨테이너 이미지의 URI를 제공할 수 있습니다. 다음은 특정 AWS SAM CLI 버전의 컨테이너 이미지를 사용하여 애플리케이션을 빌드하기 위한 두 가지 예제 명령입니다.

```
# Build a Node.js 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0
```

.zip 파일 아카이브 애플리케이션을 구축하는 추가 예제는 이 주제 뒷부분의 예제 섹션을 참조하세요.

## 컨테이너 이미지 구축
<a name="build-container-image"></a>

서버리스 애플리케이션을 컨테이너 이미지로 구축하려면 서버리스 함수에 대해 `PackageType: Image`을 선언하십시오. 또한 다음 항목들을 사용하여 `Metadata` 리소스 속성을 선언해야 합니다.

`Dockerfile`  
Lambda 함수와 연결되는 Dockerfile의 이름입니다.

`DockerContext`  
Dockerfile의 위치입니다.

`DockerTag`  
(선택 사항) 구축된 이미지에 적용할 태그.

`DockerBuildArgs`  
구축에 대한 구축 인수입니다.  
 AWS SAMCLI는 `DockerBuildArgs` 인수에 포함된 정보를 삭제하거나 난독화하지 않습니다. 이 섹션을 사용하여 암호나 보안 암호와 같은 민감한 정보를 저장하지 않는 것이 좋습니다.

`DockerImage`  
(선택 사항) 빌드된 Docker 이미지의 사용자 지정 이름입니다. 지정하지 않으면 함수의 논리적 리소스 ID가 사용됩니다.

다음은 예제 `Metadata` 리소스 속성 섹션입니다.

```
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: v1
      DockerImage: my-custom-image
```

`Image` 패키지 유형으로 구성된 샘플 애플리케이션을 다운로드하려면 [자습서:를 사용하여 Hello World 애플리케이션 배포 AWS SAM](serverless-getting-started-hello-world.md) 섹션을 참조하세요. 설치할 패키지 유형을 묻는 메시지가 나타나면 `Image`을 선택합니다.

**참고**  
Dockerfile에서 다중 아키텍처 기본 이미지를 지정하는 경우는 호스트 시스템의 아키텍처에 맞게 컨테이너 이미지를 AWS SAM 빌드합니다. 다른 아키텍처용으로 구축하려면 특정 대상 아키텍처를 사용하는 기본 이미지를 지정하십시오.

기본적으로는 AWS SAM CLI 컨테이너 이미지를 Docker 빌드할 때 레거시 빌드 엔진을 사용합니다. 성능을 개선하고 더 복잡한 빌드BuildKit를 처리하는 개선된 컨테이너 백엔드인를 사용하려면 빌드 명령과 함께 `--use-buildkit` 플래그를 전달합니다.

```
$ sam build --use-buildkit
```

를 사용하려면 Docker 또는를 Finch CLI 설치`--use-buildkit`해야 합니다.

## 컨테이너 환경 변수 파일
<a name="serverless-sam-cli-using-container-environment-file"></a>

구축 컨테이너의 환경 변수가 포함된 JSON 파일을 제공하려면 `--container-env-var-file` 인수를 `sam build` 명령과 함께 사용하십시오. 모든 서버리스 리소스에 적용되는 단일 환경 변수를 제공하거나 각 리소스에 대해 서로 다른 환경 변수를 제공할 수 있습니다.

### 형식
<a name="serverless-sam-cli-using-container-environment-file-format"></a>

구축 컨테이너에 환경 변수를 전달하는 형식은 리소스에 제공하는 환경 변수의 개수에 따라 달라집니다.

모든 리소스에 단일 환경 변수를 제공하려면 다음과 같이 `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
```

### 우선 순위
<a name="serverless-sam-cli-using-container-environment-file-precedence"></a>
+ 특정 리소스에 귀하가 제공하는 환경 변수는 모든 리소스의 단일 환경 변수보다 우선합니다.
+ 명령 행에 제공하는 환경 변수는 한 파일 내 환경 변수보다 우선합니다.

## 소스 폴더에서 프로젝트를 빌드하여 빌드 시간 단축
<a name="serverless-sam-cli-using-build-in-source"></a>

지원되는 런타임과 빌드 메서드의 경우 `--build-in-source` 옵션을 사용하여 소스 폴더에서 직접 프로젝트를 빌드할 수 있습니다. 기본적으로는 소스 코드 및 프로젝트 파일을 복사하는 임시 디렉터리에 AWS SAM CLI 빌드됩니다. 를 사용하면 `--build-in-source`가 AWS SAM 소스 폴더에 직접 CLI 빌드되므로 파일을 임시 디렉터리에 복사할 필요가 없으므로 빌드 프로세스의 속도가 빨라집니다.

지원되는 런타임 및 빌드 메서드 목록은 `--build-in-source`를 참조하세요.

## 예제
<a name="building-applications-examples"></a>

### 예제 1: .zip 파일 아카이브
<a name="examples-zip-archives"></a>

다음 `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 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0

# Build and run your functions locally
sam build && sam local invoke

# For more options
sam build --help
```

### 예제 2: 컨테이너 이미지
<a name="examples-container-image-1"></a>

다음 AWS SAM 템플릿은 컨테이너 이미지로 빌드됩니다.

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

다음은 Dockfile 파일의 예입니다.

```
FROM public.ecr.aws/lambda/python:3.12

COPY app.py requirements.txt ./

RUN python3.12 -m pip install -r requirements.txt

# Overwrite the command by providing a different command directly in the template.
CMD ["app.lambda_handler"]
```

### 예제 3: npm ci
<a name="examples-npm-ci"></a>

Node.js 애플리케이션의 경우 종속물을 설치하기 위하여 `npm ci`대신 `npm install`를 사용할 수 있습니다. `npm ci`을 사용하려면 Lambda 함수의 `UseNpmCi: True` 리소스 속성 내 `BuildProperties` 이하에 `Metadata`를 지정하십시오. `npm ci`을 사용하려면 애플리케이션에 귀하의 Lambda 함수용 `package-lock.json`에 존재하는 `npm-shrinkwrap.json` 또는 `CodeUri` 파일이 있어야 합니다.

다음 예제는 `npm ci`의 실행 시 종속 항목을 설치하기 위해 `sam build`를 사용합니다.

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.handler
      Runtime: nodejs20.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      BuildProperties:
        UseNpmCi: True
```

### Python 상위 패키지
<a name="building-applications-python-parent-packages"></a>

Python 애플리케이션의 경우, 빌드 프로세스 중에 패키지 구조를 보존하여 절대 임포트를 활성화할 수 있습니다. 패키지 구조를 보존하려면, Lambda 함수의 `Metadata` 리소스 속성에서 `BuildProperties` 아래에 `ParentPackageMode`을(를) 지정하세요.

다음 예시는 `sam build`을(를) 실행할 때 `app` 패키지 구조를 보존합니다.

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.main.handler
      Runtime: python3.12
      Architectures:
        - x86_64
    Metadata:
      BuildProperties:
        ParentPackageMode: explicit
        ParentPackages: app
```

이 구성을 사용하면, 코드가 `from .utils import logger`와(과) 같은 상대 임포트 대신 `from app.utils import logger`와(과) 같은 절대 임포트를 사용할 수 있습니다.

## 외부에서 함수 빌드 AWS SAM
<a name="building-applications-skip"></a>

기본적으로를 실행하면가 모든 함수 리소스를 **sam build** AWS SAM 빌드합니다. 그 밖에도 다음과 같은 옵션이 있습니다.
+ **외부의 모든 함수 리소스 빌드 AWS SAM** - 모든 함수 리소스를 수동으로 또는 다른 도구를 통해 빌드하는 경우 **sam build**는 필요하지 않습니다. **sam build**을 건너뛰고 로컬 테스트 수행 또는 애플리케이션 배포와 같은 프로세스의 다음 단계로 이동할 수 있습니다.
+ **외부에서 일부 함수 리소스 빌드 AWS SAM** - 외부에서 다른 함수 리소스를 빌드하는 동안 일부 함수 리소스를 빌드 AWS SAM 하려면 AWS SAM 템플릿에서 이를 지정할 AWS SAM수 있습니다.

### 외부에서 일부 함수 리소스 빌드 AWS SAM
<a name="building-applications-skip-some"></a>

를 사용할 때 함수를 AWS SAM 건너뛰려면 AWS SAM 템플릿에서 다음을 **sam build**구성합니다.

1. 함수에 `SkipBuild: True` 메타데이터 속성을 추가합니다.

1. 구축된 함수 리소스의 경로를 지정합니다.

다음은 `TestFunction`을 건너뛰도록 구성한 예제입니다. 구축된 리소스는 `built-resources/TestFunction.zip`에 있습니다.

```
TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: built-resources/TestFunction.zip
    Handler: TimeHandler::handleRequest
    Runtime: java11
  Metadata:
    SkipBuild: True
```

이제를 실행하면 **sam build** AWS SAM 가 다음을 수행합니다.

1. AWS SAM 는 로 구성된 함수를 건너뜁니다`SkipBuild: True`.

1. AWS SAM 는 다른 모든 함수 리소스를 빌드하고 `.aws-sam` 빌드 디렉터리에 캐시합니다.

1. 건너뛰는 함수의 경우 `.aws-sam` 구축 디렉터리 내 이들의 템플릿이 구축된 함수 리소스의 지정된 경로를 참조하도록 자동으로 업데이트됩니다.

   다음은 `TestFunction` 구축 디렉터리에 있는 `.aws-sam`를 위한 캐시된 템플릿의 예입니다.

   ```
   TestFunction:
     Type: AWS::Serverless::Function
     Properties:
       CodeUri: ../../built-resources/TestFunction.zip
       Handler: TimeHandler::handleRequest
       Runtime: java11
     Metadata:
       SkipBuild: True
   ```