AWS Lambda (Node.js) 환경 변수를 Terraform에서 설정

소개



지난달(2016/11/18)에 AWS Lambda는 환경 변수 지원 했습니다.
그에 따라 Terraform 역시 버전 0.7.12에서 지원 했습니다.

이 기사에서는 Terraform에서 AWS Lambda 환경 변수를 설정하는 방법을 소개합니다.
Terraform 버전은 2016/12/11 시점에서 최신 0.7.13를 사용하고 있습니다.

Terraform 버전
$ terraform.exe -v
Terraform v0.7.13

환경 변수의 즐거움



환경 변수를 사용하면 함수 (zip)의 매개 변수를 쉽게 변경할 수 있습니다.

지금까지라면 파라미터를 사용할 때, 예를 들면 이하와 같은 방법이 취하고 있었을까 생각합니다.
  • 함수에 직접 쓰기
  • 함수 이름에 넣어 퍼스
  • DB에 갖게 한다

  • 하지만 함수 내에서 직접 쓰면 함수의 매개 변수가 변경될 때마다 zip 파일을 다시 만들어 업로드해야 했습니다.
    함수명에 넣어 퍼스는 사고의 근원이 될 것 같습니다.
    DB에 갖게 하는 것은 간편함이 부족합니다.

    이번 Lambda에 의한 환경 변수의 지원으로, 간편하고 스마트하게 파라미터를 사용·변경할 수 있게 되었습니다.
    ※ 단, 환경 변수의 사이즈에는 상한( 4KB )이 있습니다.

    환경 변수 사용법



    설정 방법(Terraform측)


    environment 인수 안에 속성명을 variables , 값을 Map 형식으로 씁니다.

    aws_lambda_function.tf
        environment {
            variables = {
                key1 = "aaaabbbb"
                key2 = "aaaa\nbbbb"
                key3 = "${var.value3}"
                key4 = "${var.value4}"
                key6 = "${var.value6}"
            }
        }
    

    ※ 아래에 aws_lambda_function 리소스 전체도 써 있습니다.

    취득 방법(Node.js측)


    process.env 변수로부터 취득

    Node.js
    const value1 = process.env.key1;
    const value2 = process.env.key2;
    const keyName = "key3"
    const value3 = process.env[keyName];
    

    샘플



    Terraform



    variables.tf
    variable "value3" {
        default = "aaaa\nbbbb"
    }
    variable "value4" {
        default = "aaaa\\nbbbb"
    }
    variable "value6" {
        default = "日本語もOK"
    }
    

    lambda-function.tf
    resource "aws_lambda_function" "env_test" {
        function_name = "${var.prefix}"
        role = "${aws_iam_role.iam_for_lambda.arn}"
        runtime = "nodejs4.3"
        handler = "index.handler"
        filename = "index.zip"
        source_code_hash = "${base64sha256(file("index.zip"))}"
        environment {
            variables = {
                key1 = "aaaabbbb"
                key2 = "aaaa\nbbbb"
                key3 = "${var.value3}"
                key4 = "${var.value4}"
                key6 = "${var.value6}"
            }
        }
    }
    

    Node.js



    index.js
    exports.handler = () => {
        console.log("Fired!");
    
        const value1 = process.env.key1;
        console.log(`key1: ${value1}`);
    
        const value2 = process.env.key2;
        console.log(`key2: ${value2}`);
    
        const keyName = "key3"
        const value3 = process.env[keyName];
        console.log(`key3: ${value3}`);
    
        console.log(`key4: ${process.env.key4}`);
        console.log(`key5: ${process.env.key5}`);
        console.log(`typeof key5: ${typeof process.env.key5}`);
        console.log(`key6: ${process.env.key6}`);
    };
    

    비고



    줄 바꿈은 \n 대신 \\n 권장



    이유 1) 관리 콘솔에서 변수 값의 줄 바꿈을 확인할 수 없습니다.




    ※ 키 이름으로 정렬하지 않는 것 같습니다.
  • key2 , key3\n
  • key4\\n ( value4 ) 를 전달했으므로 표시가 \n

  • 아래의 출력 결과에서는 개행되고 있으므로 내부에는 개행이 존재하는 것 같습니다

    key1-4의 출력 결과
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key1: aaaabbbb
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key2: aaaa
    bbbb
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key3: aaaa
    bbbb
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key4: aaaa
    bbbb
    


  • 이유 2) 관리 콘솔에서 편집하면 줄 바꿈이 사라집니다.



    예) key2 , key3 , key4cccc관리 콘솔에 줄 바꿈이 표시되지 않았습니다 key2 , key3
    key1-4의 출력 결과(관리 콘솔에서 편집 후)
    2016-12-11T06:14:46.537Z    1d359235-bf69-11e6-bdcc-73d201f9fb5d    key1: aaaabbbb
    2016-12-11T06:14:46.537Z    1d359235-bf69-11e6-bdcc-73d201f9fb5d    key2: aaaabbbbcccc
    2016-12-11T06:14:46.537Z    1d359235-bf69-11e6-bdcc-73d201f9fb5d    key3: aaaabbbbcccc
    2016-12-11T06:14:46.537Z    1d359235-bf69-11e6-bdcc-73d201f9fb5d    key4: aaaa
    bbbbcccc
    

    일본어도 사용 가능



    key6의 출력 결과
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key6: 日本語もOK
    

    쉼표, 사용할 수 없습니다.



    Terraform 관계없이 AWS Lambda 환경 변수 사양입니다.terraform apply 다음 오류 메시지가 나타납니다.

    오류 메시지
    ValidationException: 1 validation error detected: Value at 'environment.variables' failed to satisfy constraint: Map value must satisfy constraint: [Member must satisfy regular expression pattern: [^,]*]
    

    terraform plan 에서는 에러가 되지 않습니다.

    지정하지 않은 key의 환경 변수를 취득하면 undefined 가 된다



    Terraform 관계없이 AWS Lambda (Node.js)의 환경 변수 사양입니다.

    key5의 출력 결과
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    key5: undefined
    2016-12-11T06:02:02.678Z    55e4239f-bf67-11e6-956c-4d9dde297bec    typeof key5: undefined
    

    ※ String형의 undefined (문자열)가 아니고 undefined형입니다.
    process.env.key5.replace("unde", "----")
    

    와 같이 method를 연결하면 오류가 발생합니다.

    오류 메시지
    TypeError: Cannot read property 'replace' of undefined
    


    후기


  • Terraform의 코드의 신택스 하이라이트는 무엇을 지정하면 좋을까요?text 그렇다고 읽기 어렵기 때문에 js (JavaScript) 를 지정해 보았습니다만, 일부 이상하게 됩니다. .

  • Amazon Web Services Advent Calendar 2016 - Qiita 가 갈라 빈 이었으므로 넣어 둡니다.
  • 좋은 웹페이지 즐겨찾기