초 폭속 Lambda에서 Deno를 움직여보십시오.

나는 람다를 사랑한다.
이제 모두 Lambda로 움직이면 좋지 않을까? (적어도 API는 APIGateway + Lambda로 충분하다고 생각합니다.)

그건 그렇다.

그런 Lambda에서 Deno를 폭속으로 움직이는 방법을 정리해 보았다.

전제 조건


  • aws cli를 사용할 수 있습니다
  • 실행 환경은 mac

  • 1.Layer 등록



    deno-lambda-layer.zip 다운로드


    $ curl -OL https://github.com/hayd/deno-lambda/releases/download/1.11.0/deno-lambda-layer.zip
    

    공식 사이트 보다 최신의 아카이브 파일을 다운로드하는 것을 추천

    deno-lambda-layer 등록


    $ aws lambda publish-layer-version \
      --layer-name deno-lambda-layer \
      --zip-file fileb://deno-lambda-layer.zip
    

    실행 결과 .json
    {
        "Content": {
            "Location": "xxx",
            "CodeSha256": "xxx",
            "CodeSize": 31586895
        },
        "LayerArn": "arn:aws:lambda:ap-northeast-1:xxx:layer:deno-lambda-layer",
        "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:xxx:layer:deno-lambda-layer:1",
        "Description": "",
        "CreatedDate": "9999-99-99T99:99:99.999+0000",
        "Version": 1
    }
    

    LayerVersionArn을 사용하기 때문에 삼가하십시오.

    2. 실행 Role 만들기



    role 작성된 경우 SKIP

    정의 파일 작성


    $ vim role.json
    

    role.json
    {
        "Version": "2012-10-17",
        "Statement":[
            {
                "Effect": "Allow",
                "Principal":{
                    "Service":"lambda.amazonaws.com"
                },
                "Action":"sts:AssumeRole"
            }
        ]
    }
    

    role 만들기


    $ aws iam create-role \
      --role-name deno-function-exec-role \
      --assume-role-policy-document file://role.json
    

    실행 결과 .json
    {
        "Role": {
            "Path": "/",
            "RoleName": "deno-function-exec-role",
            "RoleId": "xxxx",
            "Arn": "arn:aws:iam::xxxx:role/deno-function-exec-role",
            "CreateDate": "9999-99-99T99:99:99.999+0000",
            "AssumeRolePolicyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Principal": {
                            "Service": "lambda.amazonaws.com"
                        },
                        "Action": "sts:AssumeRole"
                    }
                ]
            }
        }
    }
    

    Arn을 사용하기 때문에 삼가하십시오.

    3.LambdaDeploy



    Create index.ts


    $ vim index.ts
    

    index.ts
    import { Context, Event } from "https://deno.land/x/lambda/mod.ts";
    
    export function handler(event: Event, context: Context) {
      const message:String = `Hey deno ${Deno.version.deno}.`
      console.log(message)
      return {
        statusCode: 200,
        body: message
      }
    }
    

    Deploy


    $ zip index.zip index.ts
    $ aws lambda create-function \
      --function-name DenoFunction \
      --runtime provided.al2 \
      --handler index.handler \
      --zip-file fileb://index.zip \
      --role arn:aws:iam::xxxx:role/deno-function-exec-role \
      --region ap-northeast-1
    

    --role에 2. 실행 롤로 작성에서 앞둔 Arn을 정의하고 실행

    실행 결과.
    割愛。
    エラーが発生していなければOK。
    

    레이어 등록


    $ aws lambda update-function-configuration \
      --function-name DenoFunction \
      --layers \
        "arn:aws:lambda:ap-northeast-1:xxx:layer:deno-lambda-layer:1"
    

    --layers에 1.Layer 등록에서 삼가 LayerVersionArn 정의하고 실행

    실행 결과.
    割愛。
    エラーが発生していなければOK。
    

    동작 확인


    $ aws lambda invoke  \
      --function-name DenoFunction \
      --log-type Tail \
      outputfile.txt \
      --query 'LogResult' | tr -d '"' | base64 -D
    

    실행 결과.
    START RequestId: xxxx Version: $LATEST
    Hey deno 1.11.0.d: xxxx
    END RequestId: xxxx
    REPORT RequestId: xxxx  Duration: 76.08 ms  Billed Duration: 1804 ms    Memory Size: 128 MB Max Memory Used: 76 MB  Init Duration: 1727.22 ms
    

    제대로 움직인,
    이것으로 완료.

    번외편



    역시 Deno 같은 코드에서도 시도하고 싶지요.

    메인 로직을 분리하는 가정에서,

    index.ts
    import { Context, Event } from "https://deno.land/x/lambda/mod.ts";
    import { execute } from "./usecase.ts";
    
    export function handler(event: Event, context: Context) {
      const message:String = execute()
      console.log(message)
      return {
        statusCode: 200,
        body: message
      }
    }
    

    usecase.ts
    export function execute(): String {
      return 'My son is an angel'
    }
    

    그냥 업데이트
    $ zip index.zip *.ts
    $ aws lambda update-function-code \
      --function-name DenoFunction \
      --zip-file fileb://index.zip
    

    마지막으로 실행
    aws lambda invoke  \
      --function-name DenoFunction \
      --log-type Tail \
      outputfile.txt \
      --query 'LogResult' | tr -d '"' | base64 -D
    

    실행 결과.
    START RequestId: xxxx Version: $LATEST
    My son is an angel xxxx
    END RequestId: xxxx
    REPORT RequestId: xxxx  Duration: 74.14 ms  Billed Duration: 1360 ms    Memory Size: 128 MB Max Memory Used: 76 MB  Init Duration: 1285.37 ms
    

    할 수 있었다.

    요약



    ・TypeScript의 기법으로 실장할 수 있거나, node_modules 관리가 없어지거나, await의 사용성이 좋아지거나와 편리성이 높기 때문에 진지하게 도입하는 것도 개미라고.
    다음은 좀 더 실무에 견딜 수 있는 설계나, CI/CD의 도입 등 고려해 보고 싶다.

    · 데노 아이콘은 친아나고?

    좋은 웹페이지 즐겨찾기