Docker×Lambda 환경 간단 구축

Docker×Lambda 환경 간단 구축



소개



AWS Lambda Function을 구현할 때 docker-lambda를 사용하면 개발이 쉽고 배포까지 쉽게 할 수 있습니다. 그 환경 구축 순서, 실제로 배포하기까지를 간단하게 소개합니다.

전제



다음은 이미 준비되어 있다고 가정합니다.
- AWS 계정
- docker 설치
- docker-compose 설치

구성



최종적으로 다음과 같은 구성이 됩니다.
.
├── deploy.sh
├── docker-compose.yml
├── lambda
│   └── SampleFunction
│       ├── Dockerfile
│       └── index.js
└── opt
    ├── Dockerfile
    └── package.json


절차



1. AWS Lambda 함수 생성



자세한 지침은 여기 문서를 참조하십시오.

2. AWS 액세스 키 획득



로컬 환경에서 액세스할 수 있도록 AWS 액세스 키와 비밀 키를 가져옵니다.
AWS Management Console에 로그인한 후 화면 오른쪽 상단의 계정 이름 드롭다운에서 '내 보안 시카크 정보'를 선택합니다.


액세스 키 ID와 비밀 액세스 키를 작성하여 소중하게 보관하십시오.

3. Docker를 사용하여 로컬 환경 구축



로컬 환경에서 Lamda 함수의 동작 확인을 할 수 있는 환경을 만듭니다.

3.1 docker-compose.yml 생성



이번에는 람다 함수 용 컨테이너와 레이어 용 컨테이너 두 가지를 만듭니다.

docker-compose.yml
version: '3.5'
services:
  layer:
    image: node:12-slim
    tty: true
    volumes:
      - ./opt/:/srv:rw,delegated
    ports:
      - 3000:3000
    working_dir: /srv
    environment:
      TZ: 'Asia/Tokyo'

  SampleFunction:
    image: lambci/lambda:nodejs12.x
    tty: true
    volumes:
      - ./lambda/SampleFunction:/var/task:rw,delegated
      - ./opt:/opt:ro,delegated
    ports:
      - 9001:9001
    environment:
      DOCKER_LAMBDA_STAY_OPEN: 1
      DOCKER_LAMBDA_WATCH: 1
      DOCKER_LAMBDA_DEBUG: 1
      TZ: 'Asia/Tokyo'
    command: index.handler

3.2 Lambda 함수 샘플 작성


lambda/SampleFunction 디렉터리를 만듭니다.
그 안에 index.js를 만듭니다.
내용은 1단계에서 만든 Lambda 함수의 내용을 복사하여 출력 문자를 Hello Lambda!로 변경했습니다.

index.js
exports.handler = async (event) => {
    return  {
        statusCode: 200,
        body: JSON.stringify('Hello Lambda!'),
    };
};


3.3 동작 확인



Docker를 시작하고 실제로 로컬 API를 두드려 봅시다.

# dockerを起動
% docker-compose up -d

# APIを実行
% curl -d '{}' http://localhost:9001/2015-03-31/functions/index/invocations
{"statusCode":200,"body":"\"Hello Lambda!\""}   

3.4 레이어 만들기



위의 3.2 코드만 있으면 레이어의 작성은 불필요합니다만, 실제로는 package.json을 사용해 다른 라이브러리등을 이용한다고 생각하므로, 이번은 초기의 package.json만 세트 해 둡니다.
이미 docker를 시작했다면 opt 디렉토리가 자동으로 만들어졌다고 생각합니다.
# レイヤーコンテナにインスペクション
docker-compose exec layer bash

# package.json作成
npm init
opt 디렉토리에 package.json가 만들어지면 OK입니다.

4. 배포 환경 구축



로컬 환경에서 1단계에서 만든 Lambda에 배포할 수 있는 환경을 구축합니다.

4.1 SampleFunction 배포를 위한 Dockerfile 만들기


lambda/SampleFunction/Dockerfile 되도록 Dockerfile을 만듭니다.
※ function-name 은 순서 1. 에서 작성한 함수명과 동일하게 하십시오.
FROM lambci/lambda:build-nodejs12.x

COPY . .

RUN zip -9yr lambda.zip .

CMD aws lambda update-function-code --function-name SampleFunction --zip-file fileb://lambda.zip

4.2 layer 배포용 Dockerfile 만들기



FROM lambci/lambda:build-nodejs12.x

COPY . .

RUN npm install

RUN zip -9yr lambda.zip .

CMD aws lambda publish-layer-version \
    --layer-name SampleLayer \
    --compatible-runtimes nodejs12.x \
    --description "" \
    --zip-file fileb://lambda.zip

4.3 환경 설정 파일 .env



docker-compose.yml과 동일한 계층 구조에 .env를 만듭니다.
2단계에서 얻은 액세스 키 ID와 비밀 액세스 키를 설정합니다.
AWS_ACCESS_KEY_ID=XXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXx
AWS_DEFAULT_REGION=ap-northeast-1

4.4 배포를 위한 쉘 스크립팅



레이어와 람다 함수를 각각 배포하는 쉘 스크립트입니다.

deploy.sh
#!/bin/bash

# .env読み込み
export $(cat .env | grep -v ^# | xargs);

# LayerをLambdaにデプロイ
docker build -t layer ./opt
docker run --rm \
  -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION \
  layer

# SampleFunctionをLambdaにデプロイ
docker build -t sample-function ./lambda/SampleFunction
docker run --rm \
  -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION \
  sample-function


4.5 배포



셸을 실행하면 Lambda 함수와 Layer가 배포됩니다.
sh deploy.sh

5. 확인



5.1 API 실행



1단계에서 확인한 API 끝점을 두드리면 출력 메시지가 "Hello Lambda!"로 변경되었다고 생각합니다.

5.2 AWS Lambda 함수 코드 확인



3.2단계에서 설정한 파일과 동일합니다.

index.js
exports.handler = async (event) => {
    return  {
        statusCode: 200,
        body: JSON.stringify('Hello Lambda!'),
    };
};

5.3 Layer 확인



레이어 추가에서 레이어를 추가합니다.


배포된 레이어가 목록에 추가되었으므로 선택하고 추가합니다.


참고


  • AWS 액세스 키 관리
  • lambci/docker-lambda
  • 좋은 웹페이지 즐겨찾기