Lambda 함수에서 Embulk 명령을 실행해보십시오 (사용자 정의 런타임 사용)

9927 단어 람다EmbulkBashAWS

소개



이 기사는 BeeX Advent Calendar 2020 의 12/20 기사입니다.

==
12/16에 Lambda에서 Embulk 명령을 실행하는 기사를 썼습니다.

Lambda 함수에서 Embulk 명령을 실행해보십시오.

이 때는 파이썬의 기본 이미지를 사용하여 실행했지만, 잘 생각하면 Bash에서 실행할 수 있다면 그 쪽이 불필요한 구현이 필요 없기 때문에, 같은 것을 Lambda의 커스텀 런타임을 사용해 보겠습니다. 했다.

다음을 참고하겠습니다.
Embulk 이외의 자세한 것은 이쪽을 확인해 주세요.
* AWS Lambda 컨테이너 이미지에서 kubectl 명령을 실행하여 EKS를 관리해 봅니다.

환경



PC: Windows 10
Docker: Docker version 19.03.13, build 4484c46d9d

전제



Docker 초기 설정 완료
AWS 계정 생성
Amazon ECR 리포지토리 생성

실제 조작



bootstrap.sh 만들기



handler.sh를 호출하는 bootstrap.sh를 작성합니다.

bootstrap.sh
#!/bin/sh

export _HANDLER=/aws/handler.sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
  exec /usr/local/bin/aws-lambda-rie $_HANDLER
else
  exec $_HANDLER
fi

handler.sh 만들기



실제 처리를 수행하는 handler.sh를 작성하십시오.
handler 함수는 embulk 명령을 작성합니다.

handler.sh
#!/bin/sh

handler(){
  echo "start function"
  echo "run emulk"
  /usr/bin/embulk help
  echo "end function"
}

while true
do
  HEADERS="$(mktemp)"
  # Get an event. The HTTP request will block until one is received
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")

  # Extract request ID by scraping response headers received above
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

  # Run the handler
  handler ${EVENT_DATA}

  # Send the response
  curl -s -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "OK"
done

Dockerfile 만들기



이미지를 만들기 위한 Dockerfile을 만듭니다.
corretto를 설치하는 이유는 Embulk 명령에 java가 필요하기 때문입니다.
FROM amazon/aws-cli

RUN curl -L -o /usr/local/bin/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie
RUN chmod 755 /usr/local/bin/aws-lambda-rie

RUN amazon-linux-extras enable corretto8
RUN yum install java-1.8.0-amazon-corretto-devel -y
COPY embulk /usr/bin/embulk
RUN chmod +x /usr/bin/embulk

ADD ./bootstrap.sh /aws/bootstrap
ADD ./handler.sh /aws/handler.sh
RUN chmod +x /aws/handler.sh
RUN chmod +x /aws/bootstrap
ENTRYPOINT ["/aws/bootstrap"]

이미지 빌드



특정 폴더에 작성한 다음 파일을 저장합니다.
$ ls
Dockerfile  bootstrap.sh  embulk  handler.sh

빌드 명령을 실행하여 이미지를 만듭니다.
$ docker build -t lambda_embulk_shell .
~build実行中~
$ docker images
REPOSITORY           TAG       IMAGE ID       CREATED            SIZE
lambda_embulk_shell latest    8b25a817b50c   15 seconds ago       428MB

테스트



로컬에서 실행할 수 있는지 또는 다음 명령으로 테스트를 시도합니다.
※curl 커맨드는 별도 터미널
$ docker run -p 9000:8080 lambda_shell:latest
$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d'{}'

문제 없을 것 같습니다.
$ docker run -p 9000:8080 lambda_embulk_shell:latest
time="2020-12-20T03:32:24.907" level=info msg="exec '/aws/handler.sh' (cwd=/aws, handler=)"
time="2020-12-20T03:32:29.614" level=info msg="extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory"
time="2020-12-20T03:32:29.614" level=warning msg="Cannot list external agents" error="open /opt/extensions: no such file or directory"
START RequestId: da60f400-e93c-4341-accc-52c680834281 Version: $LATEST
start function
run emulk
Embulk v0.9.23
Usage: embulk [-vm-options] <command> [--options]
Commands:
   mkbundle   <directory>                             # create a new plugin bundle environment.
   bundle     [directory]                             # update a plugin bundle environment.
   run        <config.yml>                            # run a bulk load transaction.
   cleanup    <config.yml>                            # cleanup resume state.
   preview    <config.yml>                            # dry-run the bulk load without output and show preview.
   guess      <partial-config.yml> -o <output.yml>    # guess missing parameters to create a complete configuration file.
   gem        <install | list | help>                 # install a plugin or show installed plugins.
   new        <category> <name>                       # generates new plugin template
   migrate    <path>                                  # modify plugin code to use the latest Embulk plugin API
   example    [path]                                  # creates an example config file and csv file to try embulk.
   selfupdate [version]                               # upgrades embulk to the latest released version or to the specified version.

ECR 리포지토리에 푸시



리포지토리를 만듭니다.


다음 명령으로 ECR로 푸시합니다.
$ docker tag lambda_embulk_shell:latest XXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/lambda-embulk-shell
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker push XXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/lambda-embulk-shell:latest

ECR에 이미지가 푸시되었습니다.


Lambda 작성 및 실행



Lambda는 지난번 사용한 것을 유용합니다.

할 일은 Lambda에서 지정한 이미지를 변경하는 것입니다.


조금 시간이 걸렸지만 정상적으로 실행되는 것 같습니다.


결론



평소 Lambda에서는 python을 사용하기 때문에 전회는 사용했습니다만, 커멘드를 실행하고 싶은 것만으로는 python일 필요도 없기 때문에, 커스텀 런타임을 사용해 보았습니다.

실은 당초는 파이썬으로 구현하려고 추진하고 있었습니다만, 파이썬의 subprocess라면 디버그가 어렵고, 그렇다면 shell로 실행할 수 있는 편이 편하다고 생각해 도중에 내용을 수정했다는 배경도 있거나 합니다.

이 흐름에서 다음번에는 Embulk의 샘플 파일을 사용한 실제 처리의 실행을 검증하고 싶습니다.

좋은 웹페이지 즐겨찾기