AWS Lambda에서 Express와 유사한 애플리케이션 구축
44373 단어 lambdaterraformawsjavascript
뭐 공부 해요?
나는 최근에 백엔드 REST 응용 프로그램을 구축해야 하며, Express 간단한 길을 사용하여 나의 수요를 만족시키기를 바란다.Express는 JavaScript/Node에서 자주 사용하는 백엔드입니다.js.서버 아키텍처가 없는 모든 이점을 얻기 위해 Lambda AWS에서 실행하고 싶습니다.이 문장은 내가 배운 일을 하게 한 결과이다.이 예시를 따를 수 있을 뿐만 아니라 AWS free tier 의 요구에 완전히 부합되어야 합니다.
내 마음속에는 두 가지 목표가 있다.
일을 얼마나 해야 합니까?
이 Hello-world에서 예시한 자바스크립트 부분은 매우 간단하고 더 많은 코드 줄이 지형화되어 AWS 서비스를 만들고 연결합니다.다음 문장은 두 가지를 개술하였다.나도 my GitHub에 이 예의 모든 코드가 있다.
선결 조건
설치Node.js 및 AWS account가 필요합니다.
lambda api
lambda-api는 간단하고 경량급 해결 방안을 제공하여 Express를 사용한 사람은 누구나 익숙하게 느낄 수 있다.
lambda-api
솔루션을 구축하여 28kB의 단일 의존성 솔루션을 제공합니다.npm init를 사용하여 새 노드 프로젝트를 시작합니다.
npm init
설치lambda-api
npm install lambda-api
색인을 만듭니다.프로젝트에 이 내용을 포함하는 js 파일입니다.지수회사 명
// Require the framework and instantiate it
const api = require("lambda-api")()
// Define a route
api.get("/", async (req, res) => {
console.log("hello world")
return "hello world"
})
api.get("/foo", async (req, res) => {
console.log("/foo hit")
return "/foo hit"
})
api.get("/bar", async (req, res) => {
console.log("/bar hit")
return "/bar hit"
})
// Declare your Lambda handler
exports.handler = async (event, context) => {
return await api.run(event, context)
}
lambda-api
,get()
,post()
,put()
등 몇 가지 옵션을 통해 노선을 간소화했다.지형
AWS Lambda를 사용하여 이를 실현하기 위해서는 API 게이트웨이를 통해 Lambda를 공개해야 한다.Terraform을 사용하여 인프라를 구축, 배포, 삭제하고 싶습니다.이를 코드 인프라(IaC) 라고 합니다.Terraform을 사용하면 다음과 같은 이점을 얻을 수 있습니다.
프로젝트에
terraform
폴더를 만듭니다.이 폴더에서 실행 terraform init
지형 프로필을 포함하는 작업 디렉터리를 초기화합니다.이것은 새로운 지형 설정을 작성하거나 버전에서 기존 지형 설정을 복제한 후 실행해야 하는 첫 번째 명령입니다.이 명령을 여러 번 실행하는 것은 안전합니다.공급업체.회사 명
이 내용을 포함하는
provider.tf
파일을 만듭니다.공급업체.회사 명
provider "aws" {
version = "~> 3.0"
region = var.aws-region
}
변수회사 명
이 내용을 포함하는
variables.tf
파일을 만듭니다.변수회사 명
variable "aws-region" {
description = "AWS region for the infrastructure"
type = string
default = "us-east-1"
}
모듈
모듈을 사용하여 IaC를 구성합니다.
terraform
폴더에서 modules
폴더를 만듭니다.우리는 그 중에서 몇 가지 모듈을 만들 것이다.archive_파일
terraform/modules 폴더에서
archive
라는 폴더를 만듭니다.terraform/modules/archive 폴더에 이 내용을 포함하는
main.tf
파일을 만듭니다.주요했어회사 명
data "archive_file" "placeholder" {
type = "zip"
output_path = "${path.module}/lambda-function-payload.zip"
source {
content = "placeholder"
filename = "placeholder.txt"
}
}
output "data-archive-file-placeholder-output-path" {
value = data.archive_file.placeholder.output_path
}
컨텐츠, 파일 또는 파일 디렉토리에서 아카이브를 생성하려면 archive_file
를 사용합니다.이것은 아래에서 Lambda를 만들 때 사용하는 자리 표시자 텍스트 파일을 저장합니다.이렇게 하는 것은 CI/CD 파이프라인의 배치 단계에서 기초 구조의 창설, 업데이트, 삭제와 코드의 배치를 분리하기 위해서이다.예, 깨끗한 분리🎉!국제 기계사 협회
우리는 AWS IAM를 사용하여 AWS 서비스 및 리소스에 대한 액세스를 안전하게 관리할 것입니다.IAM을 사용하면 AWS 사용자와 그룹을 만들고 관리하며 권한을 사용하여 AWS 자원에 대한 액세스를 허용하고 거부할 수 있습니다.
terraform/modules 폴더에서
iam
라는 폴더를 만듭니다.terraform/modules/iam 폴더에 이 내용을 포함하는
main.tf
파일을 만듭니다.주요했어회사 명
resource "aws_iam_role" "express-like-lambda-example" {
name = "express-like-lambda-example"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": {
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow"
}
}
POLICY
}
resource "aws_iam_policy" "express-like-lambda-example-logs" {
name = "express-like-lambda-example-logs"
description = "Adds logging access"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*"
}
]
}
EOF
}
resource "aws_iam_role_policy_attachment" "attach-logs" {
role = aws_iam_role.express-like-lambda-example.name
policy_arn = aws_iam_policy.express-like-lambda-example-logs.arn
}
output "aws-iam-role-express-like-lambda-example-arn" {
value = aws_iam_role.express-like-lambda-example.arn
}
aws_iam_role
express-like-lambda-example
는 우리가 사용할 Lambda를 위한 역할을 설정합니다.그 다음에 로그 접근을 Lambda에 추가하는 aws_iam_policy
express-like-lambda-example-logs
을 설정했습니다.우리는 aws_iam_role_policy_attachment
라는 attach-logs
전략을 사용하여 역할에 추가합니다.마지막으로, 우리는 나중에 다른 모듈에서 사용할 수 있도록 역할arn을 출력합니다.λ
우리는 서버를 설정하거나 관리할 필요가 없이 AWS Lambda 코드를 실행할 것이다.당신은 소모된 계산 시간만 지불하면 됩니다.
Lambda를 사용하면 거의 모든 종류의 응용 프로그램이나 백엔드 서비스에 코드를 실행할 수 있습니다. 모든 것을 관리할 필요가 없습니다.Lambda는 고가용성으로 코드를 실행하고 확장하는 데 필요한 모든 것을 책임집니다.
terraform/modules 폴더에서
lambda
라는 폴더를 만듭니다.terraform/modules/lambda에서 이 내용을 포함하는
variables.tf
파일을 만듭니다.변수회사 명
variable "aws-iam-role-express-like-lambda-example-arn" {
description = "IAM role ARN"
type = string
}
variable "data-archive-file-placeholder-output-path" {
description = "Placeholder content for Lambda"
type = string
}
첫 번째 변수는 위arn
iam
중role
이다.두 번째 변수는 위의 archive
파일의 출력 경로입니다.이 예에서는 둘 다 Lambda를 만들어야 합니다.terraform/modules/lambda 폴더에 이 내용을 포함하는
main.tf
파일을 만듭니다.주요했어회사 명
resource "aws_lambda_function" "express-like-lambda-example" {
filename = var.data-archive-file-placeholder-output-path
function_name = "express-like-lambda-example"
handler = "index.handler"
role = var.aws-iam-role-express-like-lambda-example-arn
runtime = "nodejs12.x"
memory_size = 128
timeout = 1
}
resource "aws_lambda_function_event_invoke_config" "express-like-lambda-example-event-invoke-config" {
function_name = aws_lambda_function.express-like-lambda-example.arn
maximum_event_age_in_seconds = 60
maximum_retry_attempts = 0
}
resource "aws_lambda_permission" "express-like-lambda-example" {
statement_id = "AllowAPIGatewayInvoke"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.express-like-lambda-example.arn
principal = "apigateway.amazonaws.com"
}
output "aws-lambda-function-express-like-lambda-example-arn" {
value = aws_lambda_function.express-like-lambda-example.arn
}
output "aws-lambda-function-express-like-lambda-example-invoke-arn" {
value = aws_lambda_function.express-like-lambda-example.invoke_arn
}
aws_lambda_function
express-like-lambda-example
Lambda 함수를 생성합니다.사용filename
은 위archive
에서 왔으며, 테라포머/modules/lambda/variables에서 정의한 변수를 사용합니다.tf.aws_lambda_function_event_invoke_config
express-like-lambda-example-event-invoke-config
함수 실행을 허용하는 최대 시간과 최대 재시도 횟수를 초 단위로 정의할 수 있습니다.aws_lambda_permission
express-like-lambda-example
는 API 게이트웨이를 통해 Lambda를 실행할 수 있습니다.마지막으로 Lambdaarn
와invoke_arn
를 출력하여 나중에 API 게이트웨이를 설정할 때 사용할 수 있도록 합니다.api 게이트웨이
집에서 뻗고 버티고...
AWS API Gateway를 사용하여 RESTful API를 생성합니다.API 게이트웨이 처리는 데이터 관리, CORS 지원, 권한 수여와 액세스 제어, 흐름 절약, 모니터링과 API 버전 관리를 포함한 수십만 개의 병렬 API 호출에 관련된 모든 작업을 수락하고 처리한다.API 게이트웨이에는 최소 비용 또는 시작 비용이 없습니다.수신한 API 호출 및 전송 데이터의 양에 대해 비용을 지불합니다.
terraform/modules 폴더에서
api-gateway
라는 폴더를 만듭니다.terraform/modules/api 인터페이스에서 이 내용을 포함하는
variables.tf
파일을 만듭니다.변수회사 명
variable "aws-lambda-function-express-like-lambda-example-arn" {
description = "express-like-lambda-example Lambda ARN"
type = string
}
variable "aws-lambda-function-express-like-lambda-example-invoke-arn" {
description = "express-like-lambda-example Lambda invoke ARN"
type = string
}
첫 번째 변수는 Lambdaarn
, 두 번째 변수는 Lambdainvoke_arn
를 지정합니다.terraform/modules/iamgateway 폴더에서 이 내용을 포함하는
main.tf
파일을 만듭니다.주요했어회사 명
resource "aws_api_gateway_rest_api" "express-like-lambda-example" {
name = "express-like-lambda-example"
}
resource "aws_api_gateway_method" "proxy-root" {
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
resource_id = aws_api_gateway_rest_api.express-like-lambda-example.root_resource_id
http_method = "ANY"
authorization = "NONE"
}
resource "aws_api_gateway_integration" "express-like-lambda-example" {
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
resource_id = aws_api_gateway_method.proxy-root.resource_id
http_method = aws_api_gateway_method.proxy-root.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = var.aws-lambda-function-express-like-lambda-example-invoke-arn
}
resource "aws_api_gateway_resource" "proxy" {
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
parent_id = aws_api_gateway_rest_api.express-like-lambda-example.root_resource_id
path_part = "{proxy+}"
}
resource "aws_api_gateway_method" "proxy" {
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
resource_id = aws_api_gateway_resource.proxy.id
http_method = "ANY"
authorization = "NONE"
}
resource "aws_api_gateway_integration" "lambda" {
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
resource_id = aws_api_gateway_method.proxy.resource_id
http_method = aws_api_gateway_method.proxy.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = var.aws-lambda-function-express-like-lambda-example-invoke-arn
}
resource "aws_api_gateway_deployment" "express-like-lambda-example_v1" {
depends_on = [
aws_api_gateway_integration.express-like-lambda-example
]
rest_api_id = aws_api_gateway_rest_api.express-like-lambda-example.id
stage_name = "v1"
}
output "endpoint" {
value = aws_api_gateway_deployment.express-like-lambda-example_v1.invoke_url
}
여기서 우리는 API 인터페이스에서 Lambda 프록시 통합 옵션을 설정합니다. 이 옵션은 API가 요청한 상세한 정보를 Lambda 함수의 이벤트 매개 변수로 전달할 수 있습니다.lambda-api
이 정보를 자동으로 해석하여 사양명세 요청 객체를 작성합니다.그리고 lambda-api
방법으로 요청을 라우팅할 수 있습니다.aws_api_gateway_rest_api
는 API 게이트웨이 REST API를 제공합니다.aws_api_gateway_method
API 게이트웨이 리소스에 HTTP 메서드를 제공합니다.aws_api_gateway_integration
API 게이트웨이 통합에 HTTP 메소드 통합을 제공합니다.aws_api_gateway_resource
API 게이트웨이 리소스를 제공합니다.aws_api_gateway_deployment
API 게이트웨이 REST 배포를 제공합니다.마지막으로 API를 호출하기 위해 URL을 내보냅니다.주요했어회사 명
우리는 지금 우리가 만든 모든 지형을 한데 연결해야 한다.terraform 폴더에 이 내용을 포함하는
main.tf
파일을 만듭니다.module "archive" {
source = "./modules/archive"
}
module "iam" {
source = "./modules/iam"
}
module "lambda" {
source = "./modules/lambda"
data-archive-file-placeholder-output-path = module.archive.data-archive-file-placeholder-output-path
aws-iam-role-express-like-lambda-example-arn = module.iam.aws-iam-role-express-like-lambda-example-arn
}
module "api-gateway" {
source = "./modules/api-gateway"
aws-lambda-function-express-like-lambda-example-arn = module.lambda.aws-lambda-function-express-like-lambda-example-arn
aws-lambda-function-express-like-lambda-example-invoke-arn = module.lambda.aws-lambda-function-express-like-lambda-example-invoke-arn
}
# Set the generated URL as an output. Run `terraform output url` to get this.
output "endpoint" {
value = module.api-gateway.endpoint
}
이것은 우리가 작성한 모든 모듈을 연결시키고 Terraform을 사용하여 성명적인 기초 구조를 완성합니다.실행 코드
인프라 구축
🎉 너는 이렇게 멀리 갔구나!우리 함께 네가 작성한 코드를 놀자!🎉
우리는 인프라 시설을 배치하기 위해 지형 명령을 실행할 것이다.
terraform plan
terraformplan 명령은 실행 계획을 만드는 데 사용됩니다.이 명령은 변경된 실행 계획이 실제 자원이나 상태에 대한 변경 없이 사용자의 기대에 부합되는지 확인하는 편리한 방법입니다.이것은 문제가 없을 것이니 너는 이 지형 계획을 계속 응용할 수 있다.
terraform apply
terraform apply
명령은 원하는 구성 상태에 도달하는 데 필요한 변경 사항을 적용하거나 terraform plan
계획 생성을 실행하는 예정된 작업 집합에 사용됩니다.프롬프트가 나타나면
yes
를 사용하여 애플리케이션을 확인해야 합니다.입력 yes
하기 전에 만들 내용을 읽는 데 시간이 걸립니다.작성할 내용을 보여 줍니다.예:
terraform apply
...
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
module.iam.aws_iam_policy.express-like-lambda-example-logs: Creating...
module.iam.aws_iam_role.express-like-lambda-example: Creating...
module.api-gateway.aws_api_gateway_rest_api.express-like-lambda-example: Creating...
module.iam.aws_iam_role.express-like-lambda-example: Creation complete after 0s [id=express-like-lambda-example]
module.lambda.aws_lambda_function.express-like-lambda-example: Creating...
module.iam.aws_iam_policy.express-like-lambda-example-logs: Creation complete after 1s [id=arn:aws:iam::REDACTED:policy/express-like-lambda-example-logs]
module.api-gateway.aws_api_gateway_rest_api.express-like-lambda-example: Creation complete after 1s [id=REDACTED]
module.iam.aws_iam_role_policy_attachment.attach-logs: Creating...
module.api-gateway.aws_api_gateway_resource.proxy: Creating...
module.api-gateway.aws_api_gateway_method.proxy-root: Creating...
module.api-gateway.aws_api_gateway_method.proxy-root: Creation complete after 0s [id=REDACTED-ANY]
module.iam.aws_iam_role_policy_attachment.attach-logs: Creation complete after 0s [id=express-like-lambda-example-REDACTED]
module.api-gateway.aws_api_gateway_resource.proxy: Creation complete after 1s [id=REDACTED]
module.api-gateway.aws_api_gateway_method.proxy: Creating...
module.api-gateway.aws_api_gateway_method.proxy: Creation complete after 0s [id=REDACTED-ANY]
module.lambda.aws_lambda_function.express-like-lambda-example: Still creating... [10s elapsed]
module.lambda.aws_lambda_function.express-like-lambda-example: Creation complete after 16s [id=express-like-lambda-example]
module.lambda.aws_lambda_permission.express-like-lambda-example: Creating...
module.lambda.aws_lambda_function_event_invoke_config.express-like-lambda-example-event-invoke-config: Creating...
module.api-gateway.aws_api_gateway_integration.lambda: Creating...
module.api-gateway.aws_api_gateway_integration.express-like-lambda-example: Creating...
module.lambda.aws_lambda_permission.express-like-lambda-example: Creation complete after 0s [id=AllowAPIGatewayInvoke]
module.api-gateway.aws_api_gateway_integration.express-like-lambda-example: Creation complete after 0s [id=REDACTED-ANY]
module.api-gateway.aws_api_gateway_deployment.express-like-lambda-example_v1: Creating...
module.api-gateway.aws_api_gateway_integration.lambda: Creation complete after 0s [id=REDACTED-ANY]
module.lambda.aws_lambda_function_event_invoke_config.express-like-lambda-example-event-invoke-config: Creation complete after 0s [id=arn:aws:lambda:us-east-1:REDACTED:function:express-like-lambda-example]
module.api-gateway.aws_api_gateway_deployment.express-like-lambda-example_v1: Creation complete after 1s [id=REDACTED]
Apply complete! Resources: 13 added, 0 changed, 0 destroyed.
Outputs:
endpoint = https://REDACTED.execute-api.us-east-1.amazonaws.com/v1
나중에 사용할 수 있도록 출력에서 끝점을 복사하거나 기억하십시오.애플리케이션 배포
열기
package.json
및 생성npm script."scripts": {
"build": "npm install --production && rm -rf build && mkdir build && zip -r -q -x='*terraform*' -x='*.md' -x='LICENSE' -x='*build*' -x='*.DS_Store*' -x='*.git*' build/express-like-lambda-example.zip . && du -sh build"
},
현재, 프로젝트의 루트 디렉터리에서, zip 파일을 우리가 만든 Lambda에 배치할 수 있도록 build 명령을 실행할 수 있습니다.npm run build
예:npm run build
> [email protected] build /Users/REDACTED/Development/express-like-lambda-example
> npm install --production && rm -rf build && mkdir build && zip -r -q -x='*media*' -x='*terraform*' -x=*coverage* -x='*.md' -x='LICENSE' -x='*build*' -x='*.DS_Store*' -x='*.git*' build/express-like-lambda-example.zip . && du -sh build
audited 1 package in 0.916s
found 0 vulnerabilities
28K build
이제 압축 프로그램을 Lambda에 배치할 수 있습니다.이를 위해, 나는 이 명령을 사용한다.aws lambda update-function-code --function-name=express-like-lambda-example --zip-file=fileb://build/express-like-lambda-example.zip --region=us-east-1 1> /dev/null
API 호출
이제 저희 API를 눌러도 돼요.🎉
curl https://REDACTED.execute-api.us-east-1.amazonaws.com/v1
hello world
추가 예제:curl https://REDACTED.execute-api.us-east-1.amazonaws.com/v1/foo
/foo hit
curl https://REDACTED.execute-api.us-east-1.amazonaws.com/v1/bar
/bar hit
curl https://REDACTED.execute-api.us-east-1.amazonaws.com/v1/baz
{"error":"Route not found"}
URL은 위와 다를 수 있습니다.매번 배치할 때마다 독특하다.URL은 terraform apply
에서 출력됩니다.결론
나는 아주 즐겁게 놀았다.나는 더 많은 지형과rad 노드에 대한 지식을 배웠다.js 패키지lambda-api.만약 내가 그 중에서 배울 수 있는 어떤 잘못을 저질렀다면, 나는 평론에서 이러한 잘못을 알게 되어 매우 기쁘다.만약 당신에게 무슨 문제가 있으면 언제든지 질문하세요.
Reference
이 문제에 관하여(AWS Lambda에서 Express와 유사한 애플리케이션 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cujarrett/build-an-express-like-app-on-aws-lambda-12g6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)