AWS SAM에 따라 Lambda를 병합하는 방법

Summary


API Gateway에서 받은 메일을 lambda에 전송하고 싶은 것이 있는데, SAM에서 lambda 합병을 진행하는 일이 있어 내용을 정리했다.
오리진(Origin) 값을 얻으려고 lambda 쪽에서 IP 제한을 하려는 분들은 참고할 수 있을 것 같습니다.

합병이란?


lambda를 병합하여 API 메서드Lambda 함수에 병합할 수 있습니다.

전제 조건


$ aws --version
aws-cli/2.2.5 Python/3.8.8 Darwin/20.4.0 exe/x86_64 prompt/off

@ sam --version
SAM CLI, version 1.21.1

$ node -v
12.22.1

$  volta  -v 
1.0.2
필자는 버전 관리를 겸비하여volta를 사용했지만 특별히 가입할 필요가 없다.volta, package가 설치되어 있지 않은 경우json의 "volta": { ... 아래 부분을 삭제하십시오.

미리 준비하다


AWS의 S3의 us-east-1 구역으로 적당히 이름을 지어 긴 빵을 만들어 보세요.

프로비저닝


폴더 구성


.
├──src
│  └── index.ts 
├── package.json
├── yarn.lock
├── node_modules
├── dist
└── template.yml

template.yml


코스는 *입니다.여기 설정이 적당히 바뀌었으면 좋겠어요.
template.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'

Globals:
  Api:
    EndpointConfiguration: REGIONAL
    Cors: "'*'"

Resources:
  ExampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      CodeUri: dist/
      Events:
        Handler:
          Type: Api
          Properties:
            Path: /handler
            Method: get
            RestApiId:
              Ref: ExampleAPIGateway

  ExampleAPIGateway:
    Type: AWS::Serverless::Api
    DependsOn: ExampleFunction
    Properties:
      StageName: prod
      DefinitionBody:
        swagger: 2.0
        info:
          version: "1.0"
          title: "Lambda Integration Example"
        basePath: /prod
        schemes:
        - "https"
        paths:
          /handler:
            get:
              responses: {}
              x-amazon-apigateway-integration:
                uri:
                  Fn::Sub: arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ExampleFunction.Arn}/invocations
                passthroughBehavior: "when_no_match"
                httpMethod: "POST"
                type: "aws_proxy"

package.json


Summary도 썼으니 volta를 사용하지 않는 사람은 "volta": {... 이하의 내용을 삭제해 주십시오.
--s3-bucket부분은 미리 준비한 물통의 이름을 적으세요.
{
  "name": "lambda-integration-example",
  "version": "1.0.0",
  "description": "Lambda Integration Example for Typescript",
  "main": "index.ts",
  "scripts": {
    "build": "yarn tsc -p ./tsconfig.json && cp ./package.json ./dist/package.json",
    "deploy": "sam deploy  --template-file template.yml --stack-name lambda-integration-example-add-your-name --s3-bucket lambda-integration-example-add-your-name --region us-east-1 --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND"
  },
  "dependencies": {
    "aws-lambda": "^1.0.6"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.85",
    "typescript": "^4.4.4"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "volta": {
    "node": "12.22.1",
    "yarn": "1.22.10"
  }
}

index.ts


여기, 나는 API를 치는 원래의 IP를 바디에 넣고 보고 싶다.
index.ts
import { APIGatewayProxyHandler } from 'aws-lambda'

export const handler: APIGatewayProxyHandler =  async(event)  => {
    console.info('headers', event.headers)
    const ip = event.headers['X-Forwarded-For']
    return {
        statusCode: 200,
        body: `IP is ${ip}, and handler is success`,
      }
}

프로그램 설계


루트 디렉터리에서 실행하십시오.
$ yarn build
$ yarn deploy
상의 명령을 실행하면 API Gateway에서 Lambda Integration Example라는 이름으로 API Gateway가 제작될 것으로 보인다.

위 사진의 URLの呼び出し 섹션에서 API Gateway URL이 생성됩니다. 다음 명령을 입력하십시오.
$ curl https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/handler
IP is xxx.xxx.xxx.xxx, and handler is success
위에서 보듯이 호출 소스의 IP 주소가 성공했습니다.

최후


SAM에서 lambda 합병을 진행한다는 기사를 쓰게 해주세요.
평소 프런트엔드를 주로 쓰던 엔지니어가 최근 AWS를 사용하는 경우가 늘자 기사를 써보려고 이번에 기고했다.
이번이 처음 기사를 쓰는 거라 읽기 힘들겠지만 나쁘지 않아...
나는 이번 보도에 사용된 코드가 담긴 창고를 위에 놓을 것이다.
https://github.com/tabikaeru/lambda-integration-typescript
끝까지 읽어주셔서 감사합니다.만약 나를 도와 버튼을 좀 눌러 줄 수 있다면 나는 매우 기쁠 것이다.
Thank you!

좋은 웹페이지 즐겨찾기