reInvent2020에서 발표된 LambdaContainer를 CDK로 구현해 본다

8218 단어 람다파이썬AWS

1. 소개



일본 시간의 2020년 12월 2일 오전 1시경부터 시작된 1번째의 KeyNote로,
갑자기 LambdaContainer가 발표되었습니다 (참고).

나도, 이 발표는 리얼타임으로 보고 있어 「우아아아아아아」라고 마음속에서 수호를 올렸습니다.
콘솔 등에서는 이미 이용할 수 있는 것 같습니다.

또, 놀란 것이, AWS CDK 하지만, LambdaContainer 의 발표로부터 몇 시간 후에는
버젼이 1.76.0 에 올라, 그 때에 LambdaContainer 가 서포트된 것입니다.

2. 구현



CDK 에서의 구현에 관한 문서는 공식 로 제공되고 있어 지금까지의 배포와 대차 없이 이용할 수 있을 것 같습니다.

또, DockerFile 는 Developers.IO 님의 기사 를 참고로 했습니다.

2.1 파일 구성



CDK를 배포하는 파일 구성은 다음과 같습니다.
lambda-container/
├── app.py
├── cdk.json
└── docker/
    ├── Dockerfile
    ├── app.py
    └── requirements.txt

2.2 Lambda의 주요 함수



특히 의미가 없는 Lambda 함수입니다.
requirements.txt에서 설치 한 패키지를 올바르게 사용할 수 있는지,
pandas 버전을 표시해 봅시다.

docker/app.py
import pandas as pd

def lambda_handler(event, _):
    print(pd.__version__)
    return event


2.3 Dockerfile



Lambda에 올리는 Dockerfile의 예는 다음과 같습니다.
(이쪽의 Dockerfile 은 참고의 기사를 그대로 이용시켜 주었습니다)
FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./

RUN python3.8 -m pip install -r requirements.txt -t .

# ここのコマンドは
# app.pyのスクリプトにある、lambda_handlerという関数をエントリポイントにする、
# という意味です。
CMD ["app.lambda_handler"]

다른 Python 버전은 여기을 참조하십시오.
( 2.7 게다가 일단 이용할 수 있는 것 같네요)

2.4 CDK에서의 구현



공식 문서를 참고로 구현하겠습니다.

app.py
from aws_cdk import (
    aws_lambda as lambda_,
    core,
)


class LambdaContainer(core.Stack):
    def __init__(self, app: core.App, _id: str):
        super().__init__(scope=app, id=_id)

        _ = lambda_.DockerImageFunction(
            scope=self,
            id="container_function",
            code=lambda_.DockerImageCode.from_image_asset(
                directory="docker",
                repository_name="lambda_container_example"
            )
        )

def main():
    app = core.App()
    LambdaContainer(app, "LambdaContainer")
    app.synth()


if __name__ == "__main__":
    main()

2.5 배포



지금까지 할 수 있으면 CDK app.py가 있는 디렉토리에서 다음 명령을 실행하면 배포할 수 있습니다.
# pythonコードが正しいか確認
# 構文エラーがなければ、デプロイ可能なStackが表示されます。
$ cdk ls
LambdaContainer

# 実際にdeploy
$ cdk deploy

배포를 시작하면 평소처럼 리소스를 만들 것인지 묻습니다.

y 를 눌러 진행하면 docker 의 build 가 시작되고,

ECR 로 PUSH되어 CDK 배포가 완료되었습니다.



2.6 확인



실제로 Lambda 화면에서 확인해 봅시다.
입력 한 event의 값이 그대로 반환되었거나 pandas.__version__가 표시되고,docker/app.py 에서 설정한 대로 동작하고 있는 것을 알 수 있군요.



또, 실행해 보았더니, 첫회야말로 기동에 조금 시간(3초 정도)이 걸렸습니다만,
2회째 이후는 즉시 결과가 돌아왔습니다.
ECR 의 화면을 확인하면 repository_name 로 기술한 이름으로 등록되어 있었습니다.


2.7 리소스 삭제



마지막으로 작성한 리소스는 다음 명령으로 삭제해야 합니다.
$ cdk destroy

단, ECR 의 리포지토리까지는 삭제되지 않으므로, 불필요한 경우는 수동으로 삭제해 주세요.

3. 결론



Lambda는 Lambda이므로 실행 시간 등의 관점에서 이용 장소를 파악할 필요가 있습니다.
다만, Lambda에서도 컨테이너를 이용할 수 있게 된 것으로, 다른 컨테이너의 서비스에 유연하게 이행할 수 있게 되는 것은 매우 기쁘네요.

어느 쪽인가 하면, 지금까지는 Lambda용으로 독자적인 배치 환경등을 준비할 필요가 있었습니다만,
그것이 사라지면 더 많은 사람들이 만지기 쉬워졌다고 생각합니다.

앞으로, reInvent 그럼 4개의 KeyNote도 있고, 2020년도 아직도 즐길 수 있군요.

좋은 웹페이지 즐겨찾기