AWS Lambda에서 Express와 유사한 애플리케이션 구축

Lambda hello world와 같은 간단한 표현 예시⚡ ☁️

뭐 공부 해요?


나는 최근에 백엔드 REST 응용 프로그램을 구축해야 하며, Express 간단한 길을 사용하여 나의 수요를 만족시키기를 바란다.Express는 JavaScript/Node에서 자주 사용하는 백엔드입니다.js.서버 아키텍처가 없는 모든 이점을 얻기 위해 Lambda AWS에서 실행하고 싶습니다.이 문장은 내가 배운 일을 하게 한 결과이다.이 예시를 따를 수 있을 뿐만 아니라 AWS free tier 의 요구에 완전히 부합되어야 합니다.
내 마음속에는 두 가지 목표가 있다.
  • 나는 Terraform으로 나의 인프라 시설을 창설하고 관리하고 싶다.
  • 백엔드처럼 간단한 Express를 사용하고 싶습니다.
  • 일을 얼마나 해야 합니까?


    이 Hello-world에서 예시한 자바스크립트 부분은 매우 간단하고 더 많은 코드 줄이 지형화되어 AWS 서비스를 만들고 연결합니다.다음 문장은 두 가지를 개술하였다.나도 my GitHub에 이 예의 모든 코드가 있다.

    선결 조건


    설치Node.jsAWS 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을 사용하면 다음과 같은 이점을 얻을 수 있습니다.
  • 구성이 아닌 구성
  • 변하지 않는 인프라
  • 프로그램 코드가 아닌 성명
  • 인프라스트럭처를 생성, 재생성, 변경 또는 삭제하는 속도를 높입니다.
  • 간단하게 보기 위해서, 이helloworld 예시에서 저는 로컬 기계를 사용하여 지형 상태를 저장할 것입니다. 그러나 Terraform Cloud 실제 응용 프로그램의 기초 구조 상태 저장에 사용하는 것을 권장합니다.GitHub 또는 선택한 저장소에 상태를 영원히 업로드하지 마십시오.
    프로젝트에 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_roleexpress-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
    }
    
    첫 번째 변수는 위arniamrole이다.두 번째 변수는 위의 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_functionexpress-like-lambda-exampleLambda 함수를 생성합니다.사용filename은 위archive에서 왔으며, 테라포머/modules/lambda/variables에서 정의한 변수를 사용합니다.tf.aws_lambda_function_event_invoke_config express-like-lambda-example-event-invoke-config 함수 실행을 허용하는 최대 시간과 최대 재시도 횟수를 초 단위로 정의할 수 있습니다.aws_lambda_permissionexpress-like-lambda-example는 API 게이트웨이를 통해 Lambda를 실행할 수 있습니다.마지막으로 Lambdaarninvoke_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.만약 내가 그 중에서 배울 수 있는 어떤 잘못을 저질렀다면, 나는 평론에서 이러한 잘못을 알게 되어 매우 기쁘다.만약 당신에게 무슨 문제가 있으면 언제든지 질문하세요.

    좋은 웹페이지 즐겨찾기