AWS Lambda의 Function을 apex로 관리

5062 단어 ApexAWSLambda

이번 요건


  • 동작에 필요한 설정 값을 정의 할 수 있습니다
  • dev, prod 환경의 구분이 가능하다

  • 동작에 필요한 매개변수를 정의할 수 있습니다.



    apex에서는 project에서 공통의 설정치, 각 function마다의 설정치를 각각 json 파일에 써내, deploy시에 읽어 줍니다.

    dev, prod 환경의 구분을 할 수 있다



    AWS Lambda 자체에는 dev, prod를 분리하는 방법이 없지만, apex에서는 하나의 function에 대해 여러 환경용의 정의 파일을 갖게 되어 있어, deploy시에 대상을 분리할 수 있게 되어 있다 하고, 지정한 환경 마다 이름을 나누어 다른 function으로서 배치해 주기로 되어 있습니다.

    주의



    deploy 전에 필요한 사전 처리 자동화



    실제로 운용해 보면, 몇 번인가 clone한 채로 deploy를 걸어 버려 npm modules가 비어 있는 채로 배포되어 버리는 사고가 일어났습니다.
    apex에는 build, deploy, clean이 실행되는 타이밍을 hook 할 수 있으므로 코드가 zip되는 build시에 npm install이 이루어지도록 하여 문제를 해결했습니다.

    환경을 실수로 배포하지 않기 위해



    deploy시에 환경을 지정할 수 있는 것은 좋지만, 그렇다면 커멘드 이력으로부터 배포하려고 했을 때 등에 배포처 환경을 잘못해 사고가 일어날 수 있습니다. 모범 사례를 모르겠지만 IAM에서 deploy 환경을 제한하는 것이 쉽고 안전하다고 생각합니다. 몇 가지 방법은 있을 것 같습니다만, 이번은 작업시의 인스턴스에 부여하고 있는 IAM에서는 dev*로 시작되는 function 밖에 조작할 수 없게 하는 것으로, 평상시의 작업 환경에서는 prod 환경에 deploy를 할 수 있습니다 없도록 대응했습니다.

    apex에 필요한 Role은 이쪽
    ht tp // // 아 x. 룬 / # 미니무 m-i m-po cy

    환경별 기능을 배포하기 전의 모든 명령



    apex init 명령으로 프로젝트를 만듭니다. 대화형 형식으로 프로젝트 이름, 설명문을 입력하면 apex 프로젝트에 필요한 파일이 생성되고 동시 AWS 측에 Lambda 관리에 필요한 Role, Policy가 생성됩니다.
    % AWS_PROFILE=personal apex init
    
      _ ____ _______ __
      / \ | _ \| ____\ \/ /
      / _ \ | |_) | _| \ /
      / ___ \| __/| |___ / \
      /_/ \_\_| |_____/_/\_\
    
      Enter the name of your project. It should be machine-friendly, as this
      is used to prefix your functions in Lambda.
    
      Project name: lambda_sample
    
      Enter an optional description of your project.
    
      Project description: sample for lambda
    
      [+] creating IAM lambda_sample_lambda_function role
      [+] creating IAM lambda_sample_lambda_logs policy
      [+] attaching policy to lambda_function role.
      [+] creating ./project.json
      [+] creating ./functions
    
      Setup complete, deploy those functions!
    
      $ apex deploy
    

    생성된 Role, Policy는 아래와 같이 입력한 function명에 묶는 이름으로 생성됩니다.
    *Roles...lambda_sample_lambda_function
    *Policy...lambda_sample_lambda_logs

    바로 deploy 해 봅시다.
    AWS_REGTION=ap-northeast-1 AWS_PROFILE=personal apex deploy
       • creating function         env= function=hello
       • created alias current     env= function=hello version=1
       • function created          env= function=hello name=lambda_sample_hello version=1
    

    제대로 기능이 deploy 할 수있었습니다.


    다음으로 환경별로 deploy 할 수 있도록 해 봅시다. 다음과 같이 project.json과 function.json을 환경별로 분리합니다.
    % tree [git][* master]:~/dev/lambda
    .
    ├── functions
    │   └── hello
    │   ├── function.dev.json
    │   ├── function.json
    │   └── index.js
    ├── project.dev.json
    └── project.json
    
    % cat project.json
    {
      "name": "lambda_sample",
      "description": "sample for lambda",
      "memory": 128,
      "timeout": 5,
      "role": "arn:aws:iam::hogehuga:role:role/lambda_sample_lambda_function",
      "environment": {}
    }% % cat project.dev.json
    
    % cat project.dev.json
    {
      "name": "dev_lambda_sample",
      "description": "sample for lambda",
      "memory": 128,
      "timeout": 5,
      "role": "arn:aws:iam::hogehuga:role/lambda_sample_lambda_function",
      "environment": {}
    }
    
  • 환경별로 name 을 지정하는 것으로, deploy 하는 function 을 다른 것으로 할 수가 있습니다.
  • % cat functions/hello/function.json
    {
      "environment": { "target": "prod" }
    }
    
    % cat functions/hello/function.dev.json
    
    {
      "environment": { "target": "dev" }
    }
    

    이쪽도 deploy 해 봅시다.
    % AWS_REGTION=ap-northeast-1 AWS_PROFILE=personal apex deploy                                                                                                                   [git][* master]:~/dev/lambda
       • config unchanged          env= function=hello
       • code unchanged            env= function=hello
       • updated alias current     env= function=hello version=6
    
    % AWS_REGTION=ap-northeast-1 AWS_PROFILE=personal apex deploy --env dev                                                                                                         [git][* master]:~/dev/lambda
       • creating function         env=dev function=hello
       • created alias current     env=dev function=hello version=1
       • function created          env=dev function=hello name=dev_lambda_sample_hello version=1
    

    제대로 환경별로 다른 function으로 deploy할 수 있었습니다.

    좋은 웹페이지 즐겨찾기