AWS Lambda Layer의 Terraform화로 빠졌습니다.

이 기사의 목적



AWS Lambda Layer를 Terraform화했습니다.
일부 수고했기 때문에, 자신과 동료용으로 메모를 남깁니다.

우선 결론



최종적으로 완성된 Terraform은 이쪽입니다.

Terraform 버전


$ terraform version
Terraform v0.12.24

레이어를 사용하는 람다 측


resource "aws_lambda_function" "main_lambda" {
  filename      = "../../lambda_function/test_lambda/test_lambda.zip"
  function_name = "test_lambda"
  role          = aws_iam_role.lambda_iam_role.arn
  handler       = "lambda_function.lambda_handler"
  timeout       = 30
  runtime       = "python3.8"
  layers        = ["${aws_lambda_layer_version.lambda_layer.arn}"]
}

Layer측


resource "aws_lambda_layer_version" "lambda_layer" {
  layer_name          = "test_layer"
  filename            = "../../lambda_layer/test_layer/test_layer.zip"
  compatible_runtimes = ["python3.8"]    # Lambda関数と互換性のあるruntimeを設定
  source_code_hash    = "${filebase64sha256("../../lambda_layer/test_layer/python.zip")}"
}

빠진 곳①



Layer의 filename으로 설정하고 있는 zip 파일의 압축 단위에 요령이 갔다.

처음에는 ../../lambda_layer/test_layer/test_layer.pytest_layer.py 를 zip화하고 있었다.
그런데 Terrafor를 실행하여 Lambda와 Layer가 작성되더라도 Lambda에서 Layer를 읽을 수 없다.

분명히, Layer는 Lambda 내의 /opt/python에 전개하지 않으면 안되는 것 같다.
그래서 Layer를 ../../lambda_layer/test_layer/python/test_layer.py 에 넣고 python 마다 zip화하면 해결.

빠진 곳②



Layer에는 버젼이라고 하는 것이 있어, Layer의 py파일을 갱신해 다시 업로드하면, Layer의 버젼이 오르게 되어 있다.
이전 버전의 레이어도 남아있어 사용할 수 있습니다.
아마, Lambda A에서는 버전 1의 Layer, Lambda B에서는 최신 버전의 Layer를 사용하고 싶다, 라고 하는 구분을 위해일 것이다.


처음에는 다음과 같이 source_code_hash를 설정하지 않았습니다.
그러면 test_layer.py를 업데이트하고 test_layer.zip를 다시 만들면 Terraform 실행 후 Layer 버전이 올라 가지 않습니다. 계속 1의 아직도.
resource "aws_lambda_layer_version" "lambda_layer" {
  layer_name          = "test_layer"
  filename            = "../../lambda_layer/test_layer/test_layer.zip"
  compatible_runtimes = ["python3.8"]    # Lambda関数と互換性のあるruntimeを設定
}
source_code_hash 를 설정하면, Layer 자체의 버젼 및 Lambda에 끈다 Layer의 버젼도 최신의 것으로 올라가게 되었다.

그렇지만 이것, 지금은 좋지만 어느 쪽이든 Terraform상에서 Lambda마다 Layer의 버전 지정하고 싶어지면 어떻게 하는 것인가…aws_lambda_layer_version.lambda_layer.arn 는 버젼 첨부의 ARN이지만, aws_lambda_layer_version.lambda_layer.layer_arn 는 버젼 없음의 ARN인 것 같기 때문에, 그 옆을 잘 사용하는 것일지도 모른다.
필요한 경우 확인합니다. 보고할지는 불명.

이상

좋은 웹페이지 즐겨찾기