Docker×Lambda 환경 간단 구축
10881 단어 환경 구축람다docker-lambda도커AWS
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.ymlversion: '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.jsexports.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.jsexports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello Lambda!'),
};
};
5.3 Layer 확인
레이어 추가에서 레이어를 추가합니다.
배포된 레이어가 목록에 추가되었으므로 선택하고 추가합니다.
참고
.
├── deploy.sh
├── docker-compose.yml
├── lambda
│ └── SampleFunction
│ ├── Dockerfile
│ └── index.js
└── opt
├── Dockerfile
└── package.json
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
exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello Lambda!'),
};
};
# dockerを起動
% docker-compose up -d
# APIを実行
% curl -d '{}' http://localhost:9001/2015-03-31/functions/index/invocations
{"statusCode":200,"body":"\"Hello Lambda!\""}
# レイヤーコンテナにインスペクション
docker-compose exec layer bash
# package.json作成
npm init
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
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
AWS_ACCESS_KEY_ID=XXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXx
AWS_DEFAULT_REGION=ap-northeast-1
#!/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
sh deploy.sh
exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello Lambda!'),
};
};
Reference
이 문제에 관하여(Docker×Lambda 환경 간단 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/A-Kira/items/3baa7692e5e7405def32텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)