terraform으로 lambda로 컨테이너 이미지 배포
컨테이너 이미지를 사용한 lambda
개요
배포 방법
zip과 컨테이너 이미지 모두를 간단한 그림으로 나타내면 다음과 같다.
lambda_flow.png
terraform에 의한 배포
terraform에 의해 lambda의 작성만을 실시해, 작성 후의 이미지 관리는 실시하지 않는다.
이 경우, github actions 등을 이용하여 이미지의 build, push, lambda의 갱신까지를 실시하면 관리가 편해진다.
resource "aws_lambda_function" "function" {
function_name = "<Function name>"
description = "<Description>"
package_type = "Image"
image_uri = "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
timeout = <Timeout>
lifecycle {
ignore_changes = [image_uri]
}
role = <Role arn>
}
terraform으로 이미지 관리를 실시하지 않는 경우, 이미지 갱신시에는 update-function-code
를 사용하면 된다.
명령 예는 다음과 같습니다.
aws lambda update-function-code --function-name "<Function name>" --image-uri "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
눈치채다
공개 이미지를 사용할 수 없음
공용 이미지는 사용할 수 없으며 자체 계정의 이미지를 지정해야 합니다.
이 점을 알게 된 이유는 더미로 적절한 이미지를 사용하려고 할 때 공개 이미지를 지정할 수 없었기 때문입니다.
terraform에 의해 이미지를 관리하지 않으면, lambda 생성시에는 더미 이미지를 사용하면 이하의 2점이 편리하다.
resource "aws_lambda_function" "function" {
function_name = "<Function name>"
description = "<Description>"
package_type = "Image"
image_uri = "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
timeout = <Timeout>
lifecycle {
ignore_changes = [image_uri]
}
role = <Role arn>
}
aws lambda update-function-code --function-name "<Function name>" --image-uri "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
공개 이미지를 사용할 수 없음
공용 이미지는 사용할 수 없으며 자체 계정의 이미지를 지정해야 합니다.
이 점을 알게 된 이유는 더미로 적절한 이미지를 사용하려고 할 때 공개 이미지를 지정할 수 없었기 때문입니다.
terraform에 의해 이미지를 관리하지 않으면, lambda 생성시에는 더미 이미지를 사용하면 이하의 2점이 편리하다.
function_name, description, role
그리고, 나머지는 디폴트치를 설정) 사쿠와 더미 이미지 준비
거기서 더미 이미지를 간단하게 만들 수 있도록 했다( yoshi65/lambda_hello_world_image ).
다음 절차를 사용하여 ecr에
dummy:latest
를 생성 할 수 있습니다. 미리 인증 정보를 설정해야합니다.git clone https://github.com/yoshi65/lambda_hello_world_image.git
cd lambda_hello_world_image
./hello_world.sh
만약 지우고 싶어지면 다음과 같다.
sh
./hello_world.sh -d
이 생성에 terraform을 사용할까 생각했지만,
등에 의해, 사용하지 않았다 (기분이 들었을 때에 추가할지도).
update-function-code 후 즉시 invoke 할 수 없다
lambda를 사용할 때
$LATEST
를 사용하지 않고 alias를 지정하여 invoke
하는 경우가 많다.그래서, 동작 확인을 위해
invoke
하고, 정상 종료를 확인하고 나서, alias를 갱신하려고 했다.그때
invoke
$LATEST
를 지정하면 이전 버전이 사용됩니다.update-function-code
로 게시 된 버전을 사용하면 ResourceConflictException
가 발생합니다. invoke 할 수 없는 이유
이 이유는 이미지 최적화를 포함합니다.
콘솔상에서 이미지 갱신을 확인한 적이 있으면 알 수 있다고 생각하지만, 갱신 후 바로는 갱신중이라고 하는 취지가 상부에 표시되고, 잠시 후 완료의 취지가 표시된다.
invoke 하기 위해
해결책으로서는, 스테이터스의 갱신을 기다리면 된다.
다음 명령으로 해결합니다.
sh
aws lambda wait function-updated --function-name "<Function name>"
lambda 업데이트, 대기 및 시작을 결합하면,
sh
aws lambda update-function-code --function-name "<Function name>" --image-uri "<Image uri>" --publish
aws lambda wait function-updated --function-name "<Function name>"
aws lambda invoke --function-name "<Function name>":\$LATEST response.json
감상
취향은 있을 것 같지만, 컨테이너 이미지 쪽이 zip보다 쓰기는 좋았다.
컨테이너 이미지로 설정하는 경우가 많기 때문에 lambda를 만들 때 필요한 설정이 줄어 듭니다.
Ref.
Reference
이 문제에 관하여(terraform으로 lambda로 컨테이너 이미지 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yoshi65/items/da51da3ec8f625e6437c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)