서버리스 프레임워크로 AWS Parameter Store를 절약하는 방법

문제:



API 키 또는 데이터베이스 암호를 참조하는 코드 내에서 하드 코딩된 값을 사용하는 것은 좋지 않은 관행이며 보안 위험이 될 수도 있습니다. 또는 비즈니스 결정이나 예상치 못한 상황으로 인해 시간이 지남에 따라 변경될 수 있는 가치를 가질 수 있습니다. 이는 값을 변경해야 할 때마다 코드를 변경해야 함을 의미합니다. 이를 위해 Parameter Store라는 AWS Systems Manager 서비스를 사용할 수 있습니다.

Parameter Store은 구성 데이터 관리 및 비밀 관리를 위한 안전한 계층적 스토리지를 제공하는 AWS Systems Manager의 기능입니다. 암호, 데이터베이스 문자열, Amazon 머신 이미지(AMI) ID 및 라이선스 코드와 같은 데이터를 파라미터 값으로 저장할 수 있습니다. 값을 일반 텍스트 또는 암호화된 데이터로 저장할 수 있습니다.

그러나 여러 변수를 사용해야 하는 경우에는 어떻게 됩니까? 그것들을 유지하는 것은 어렵지만 여러 개발 환경에서 문제는 두 배가 됩니다. 계정 및 지역당 10,000개의 표준 매개변수라는 하드 캡 한도에 쉽게 도달할 수 있습니다.

이 문제를 어떻게 해결합니까?



여러 매개변수 저장소를 저장할 수 있습니다. JSON 형식으로 작성하기 시작하면 명확하고 체계적인 방식으로 정리할 수 있습니다.

JSON 값으로 Parameter Store를 생성해 보겠습니다. 이 예에서는 이름과 성을 값으로 사용하겠습니다.

/dev/myapp/INFO >> {"firstName":"David","lastName":"Llerena"}




서버리스 프레임워크로 Typescript 서버리스 Lambda 프로젝트를 생성합니다. 다음 종속성을 추가해 보겠습니다.

//package.json
{
  "name": "myapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "aws-sdk": "2.952.0",
    "@types/aws-lambda": "^8.10.95",
    "serverless": "^3.15.2",
    "serverless-plugin-typescript": "^2.1.2",
    "typescript": "^4.6.3"
  },
  "author": "",
  "license": "ISC"
}


이제 helperScript.js라는 파일에 자바스크립트 코드를 생성하고, SSM 서비스를 호출하고 JSON 값의 각 값을 구문 분석하고 읽을 매개변수 저장소를 읽는 함수를 생성합니다. ResolveConfigurationProperty 문은 serverless.yml 파일에 선언된 서비스의 단계와 이름을 참조합니다.

//helperScript.js
const SSM = require("aws-sdk/clients/ssm");

module.exports.getParameters = async ({ resolveConfigurationProperty }) => {
  const prefix = await resolveConfigurationProperty(["custom", "prefix"]);
  const region = await resolveConfigurationProperty(["provider", "region"]);
  const ssm = new SSM({ region });
  const policy = await ssm
    .getParameter({
      Name: prefix + "/INFO",
      WithDecryption: true,
    })
    .promise();
  const res = JSON.parse(policy.Parameter.Value);
  return {
    firstName: res.firstName,
    lastName: res.lastName

  };
};

serverles.yml 파일에서 이 파일helperScript.js을 참조하여 환경 문 아래 코드에 사용된 변수를 호출합니다. Lambda에 SSM 서비스에 액세스하는 데 필요한 권한을 부여합니다. 사용 중인 리소스에 대한 액세스 권한만 부여하는 것이 좋습니다.

If we are using a serverless version minor to version 3, we have to add this statement variablesResolutionMode: 20210326 under service declaration



#serverless.yml
service: myapp

plugins:
  - serverless-plugin-typescript

provider:
  name: aws
  runtime: nodejs16.x
  stage: dev
  region: us-east-1
  environment:
    FIRST_NAME: ${file(./helperScript.js):getParameters.firstName}
    LAST_NAME: ${file(./helperScript.js):getParameters.lastName} 
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - ssm:GetParameter
        - ssm:GetParameters
        - ssm:GetParametersByPath
      Resource: "*"
custom:
  prefix: /${self:provider.stage}/${self:service}
functions:
  hello:
    handler: handler.hello


마지막으로 람다 코드에서 이 Parameter Store를 사용해 보겠습니다.

//handler.ts
import { Handler } from 'aws-lambda';

export const hello: Handler = (event: any) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'My First name is '+`${process.env.FIRST_NAME}`+' and my last name is '+`${process.env.LAST_NAME}`
      },
      null,
      2
    ),
  };

  return new Promise((resolve) => {
    resolve(response)
  })
}


그게 다야! 람다를 실행하면 다음과 같이 보일 것입니다.


이렇게 하면 일부 매개 변수 저장소를 저장하고 깔끔하고 깨끗하게 유지하는 데 확실히 도움이 될 것입니다. 그러나 이러한 변수가 얻을 수 있는 크기를 고려해야 합니다. Advanced Parameters 의 사용을 고려할 수 있습니다.

참조: Serverless Framework Variables

좋은 웹페이지 즐겨찾기