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)의 매개 변수를 쉽게 변경할 수 있습니다.
지금까지라면 파라미터를 사용할 때, 예를 들면 이하와 같은 방법이 취하고 있었을까 생각합니다.
$ terraform.exe -v
Terraform v0.7.13
환경 변수를 사용하면 함수 (zip)의 매개 변수를 쉽게 변경할 수 있습니다.
지금까지라면 파라미터를 사용할 때, 예를 들면 이하와 같은 방법이 취하고 있었을까 생각합니다.
하지만 함수 내에서 직접 쓰면 함수의 매개 변수가 변경될 때마다 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.jsconst value1 = process.env.key1;
const value2 = process.env.key2;
const keyName = "key3"
const value3 = process.env[keyName];
샘플
Terraform
variables.tfvariable "value3" {
default = "aaaa\nbbbb"
}
variable "value4" {
default = "aaaa\\nbbbb"
}
variable "value6" {
default = "日本語もOK"
}
lambda-function.tfresource "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.jsexports.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) 관리 콘솔에서 변수 값의 줄 바꿈을 확인할 수 없습니다.
※ 키 이름으로 정렬하지 않는 것 같습니다.
environment {
variables = {
key1 = "aaaabbbb"
key2 = "aaaa\nbbbb"
key3 = "${var.value3}"
key4 = "${var.value4}"
key6 = "${var.value6}"
}
}
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
, key4
에 cccc
관리 콘솔에 줄 바꿈이 표시되지 않았습니다 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
후기
text
그렇다고 읽기 어렵기 때문에 js
(JavaScript) 를 지정해 보았습니다만, 일부 이상하게 됩니다. . Amazon Web Services Advent Calendar 2016 - Qiita 가 갈라 빈 이었으므로 넣어 둡니다.
Reference
이 문제에 관하여(AWS Lambda (Node.js) 환경 변수를 Terraform에서 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tksugimoto/items/c1dd29a587e5689a1f6a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)