> 백엔드 개발 > Golang > Dockerfile 및 Makefile을 사용하여 AWS SAM에서 Go 빌드 사용자 지정

Dockerfile 및 Makefile을 사용하여 AWS SAM에서 Go 빌드 사용자 지정

Susan Sarandon
풀어 주다: 2025-01-20 14:27:09
원래의
954명이 탐색했습니다.

Customize Go Builds on AWS SAM with Dockerfiles and Makefiles

이 게시물은 첫 번째 기사를 바탕으로 AWS SAM and Go를 사용하여 앱 구축 시리즈를 이어갑니다. 이전 장에서는 중복 코드 없이 확장 가능한 Go 프로젝트를 구성하는 데 대한 AWS의 제한적인 지침을 강조했습니다.

이 문서에서는 Dockerfile 및 Makefile을 사용하여 빌드 프로세스를 관리하는 기술을 보여줍니다.

동반된 코드는 https://www.php.cn/link/5655cf23be4dda7082c8bb3a8d8f8016에서 확인할 수 있습니다. 다양한 사용 사례에 맞는 다양한 Git 브랜치를 살펴보세요.

시작합시다!

도전

새로운 프로젝트 구조를 개발한 후 종속성 관리(언어, 도구, 라이브러리)를 위해 Nix를 선택했습니다. Nix는 지정된 종속성을 가진 임시 셸을 생성하여 작동합니다.

Nix 셸 내에 빌드된 바이너리를 실행할 때 오류가 발생했습니다.

<code>libc.so.6 not found in /nix/23fj39chsggb09s.libc</code>
로그인 후 복사
로그인 후 복사

이로 인해 Lambda 실행이 중단되었습니다. 디버깅을 통해 근본 원인이 밝혀졌습니다. Go는 때때로 C 라이브러리를 실행 파일에 동적으로 연결하여 시스템 경로를 지정합니다. Nix가 구축한 실행 파일에 연결된 라이브러리는 다음과 같습니다.

<code>$ ldd bootstrap 
        linux-vdso.so.1 (0x00007ffff7fc4000)
        libresolv.so.2 => /nix/store/65h17wjrrlsj2rj540igylrx7fqcd6vq-glibc-2.40-36/lib/libresolv.so.2 (0x00007ffff7fac000)
        libpthread.so.0 => /nix/store/65h17wjrrlsj2rj540igylrx7fqcd6vq-glibc-2.40-36/lib/libpthread.so.0 (0x00007ffff7fa7000)
        libc.so.6 => /nix/store/65h17wjrrlsj2rj540igylrx7fqcd6vq-glibc-2.40-36/lib/libc.so.6 (0x00007ffff7c00000)
        /nix/store/65h17wjrrlsj2rj540igylrx7fqcd6vq-glibc-2.40-36/lib/ld-linux-x86-64.so.2 => /nix/store/65h17wjrrlsj2rj540igylrx7fqcd6vq-glibc-2.40-36/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fc6000)</code>
로그인 후 복사

Nix의 비표준 종속성 스토리지는 Lambda의 격리된 Docker 컨테이너와 결합되어 Lambda가 이러한 라이브러리를 찾는 것을 방지했습니다. 이러한 라이브러리는 내 로컬 Nix 설치에만 존재했기 때문입니다. 코드를 컴파일하고 라이브러리 링크를 관리하는 방법을 AWS SAM에 지시하기 위한 솔루션이 필요했습니다.

AWS에 Go 프로젝트 배포

두 가지 배포 방법이 있습니다.

Zip 파일 ?

로컬에서 컴파일하고 실행 파일을 .zip 파일로 AWS에 보냅니다. AWS는 실행 파일을 Docker 컨테이너에 복사합니다. 가장 빠른 콜드 스타트를 제공합니다.

도커 이미지 ?

실행 Docker 컨테이너 내에서 컴파일하기 위한 지침을 AWS에 제공합니다. 이렇게 하면 호환성이 보장되지만 콜드 스타트 ​​속도가 느려집니다.

솔루션

저는 Nix를 계속 사용하기 위해 Dockerfiles를 선택했는데 두 가지 방법 모두 아래에 나와 있습니다.

Zip 파일 ?

Zip 파일의 경우 다음 프로젝트 구조를 사용하세요(Makefile 참고).

<code>.
├── cmd/
│   ├── function1/
│   │   └── function1.go  # contains main()
│   └── function2/
│       └── function2.go  # contains main()
├── internal/
│   └── SHAREDFUNC.go
├── Makefile
├── go.mod
├── go.sum
├── samconfig.toml
└── template.yaml</code>
로그인 후 복사

Makefile은 build-<function_name> 패턴(AWS SAM에 필요함)을 사용하여 각 함수에 대한 빌드 명령을 정의합니다.

<code>.PHONY: build

build:
    sam build

build-HelloWorldFunction:
    GOARCH=amd64 GOOS=linux go build -tags lambda.norpc -o bootstrap ./cmd/function1/main.go
    cp ./bootstrap $(ARTIFACTS_DIR)

build-ByeWorldFunction:
    GOARCH=amd64 GOOS=linux go build -tags lambda.norpc -o bootstrap ./cmd/function2/main.go
    cp ./bootstrap $(ARTIFACTS_DIR)</code>
로그인 후 복사

이 프로세스를 SAM에 알리십시오.

<code>  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Metadata:
      BuildMethod: makefile
    Properties:
      CodeUri: ./
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
        - x86_64
      Events:
        CatchAll:
          Type: Api 
          Properties:
            Path: /hello
            Method: GET</code>
로그인 후 복사

BuildMethod: makefile은 SAM에게 CodeUri이 지정하는 위치에 있는 Makefile을 사용하도록 지시합니다.

도커 이미지 ?

루트 디렉터리에 Dockerfile.dockerignore을 만듭니다.

<code>.
├── cmd/
│   ├── function1/
│   │   └── function1.go  # contains main()
│   └── function2/
│       └── function2.go  # contains main()
├── internal/
│   └── SHAREDFUNC.go
├── Dockerfile
├── .dockerignore
├── go.mod
├── go.sum
├── samconfig.toml
└── template.yaml</code>
로그인 후 복사

Dockerfile은 빌드 단계를 지정합니다. ARG ENTRY_POINT은 빌드 시 람다 진입점을 지정합니다.

<code>FROM public.ecr.aws/docker/library/golang:1.19 as build-image
ARG ENTRY_POINT  # !IMPORTANT
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -tags lambda.norpc -o lambda-handler ${ENTRY_POINT}
FROM public.ecr.aws/lambda/provided:al2023
COPY --from=build-image /src/lambda-handler .
ENTRYPOINT ./lambda-handler</code>
로그인 후 복사

수정 template.yaml:

<code>libc.so.6 not found in /nix/23fj39chsggb09s.libc</code>
로그인 후 복사
로그인 후 복사

MetadataPackageType: Image에 유의하세요. DockerBuildArgsENTRY_POINT에서 Dockerfile을 전달하여 모든 람다에 대해 단일 Dockerfile을 허용합니다.

결론

이 자세한 설명은 Zip 파일과 Docker 이미지를 모두 사용하여 AWS SAM 내에서 Go 빌드를 관리하는 포괄적인 접근 방식을 제공합니다. 빌드 속도와 배포 일관성의 우선순위에 따라 선택이 달라집니다.

위 내용은 Dockerfile 및 Makefile을 사용하여 AWS SAM에서 Go 빌드 사용자 지정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿