보다 효율적인 액세스를 위해 Parameter Store에 관련 암호 저장

우리는 개발 경력에서 조만간 무언가를 달성하기 위해 여러 관련 비밀을 사용해야 하는 상황에 직면하게 됩니다. 이러한 매개변수를 매개변수 저장소에 객체로 저장하고 가져오는 방식으로 관리할 수 있으므로 코드가 더 짧고 읽기 쉽습니다.

1. 시나리오



외부 서비스에 인증해야 한다고 가정해 보겠습니다. 우리는 응용 프로그램이 MongoDB 에 연결되기를 원하므로 여러 매개 변수를 사용하여 연결 문자열을 만들어야 합니다. 응용 프로그램은 데이터베이스 이름, 사용자 이름 및 암호를 알아야 합니다.

다른 비밀에 하나씩 저장한다는 것은 빌드 시(및 환경 변수로 유지) 또는 런타임(응용 프로그램이 직접 가져옴)에 별도로 가져와야 함을 의미합니다.

비밀을 Lambda 함수 구성의 환경 변수로 저장하고 싶지 않고 런타임에 Parameter Store과 같은 보안 저장소에서 가져올 수 있다고 가정해 보겠습니다.

2. 문제



2.1. 매개변수 추가에 더 많은 시간 소요



자연스러운 해결책은 여러 매개변수를 별도의 비밀에 저장하는 것입니다. 예를 들어 다음 명령을 사용하여 데이터베이스 이름을 추가할 수 있습니다.

aws ssm put-parameter --name /dev/db-name --value my-db-name --type SecureString


여기서 name 속성은 경로 매개변수를 참조하며 여러 장점이 있으므로 좋은 방법입니다.

나머지 비밀을 만들기 위해 위의 과정을 몇 번 반복해야 합니다. 또한 사용자 이름과 암호를 저장해야 하므로 API 호출을 두 번 더 수행해야 합니다.

2.2. 매개변수를 가져오기 위한 여러 API 호출



Parameter Store에 암호를 추가하는 것과 마찬가지로 응용 프로그램에서 암호를 사용하려면 암호를 가져와야 합니다.

이는 Parameter Store에 대한 여러 API 호출을 의미합니다. 그 중 하나가 어떤 이유로 실패하면 애플리케이션은 데이터베이스에 연결할 수 없습니다.

3. 해결책



별도의 매개변수에 값을 저장하는 대신 키-값 쌍으로 비밀이 있는 문자열화된 객체를 만들 수 있습니다.

aws ssm put-parameter --name /dev/db-config --value \
'{"dbName": "my-db-name", "dbUsername": "my-db-username", "dbPassword": "my-db-password"}' \
--type SecureString


이렇게 하면 필요한 모든 정보를 포함하는 매개변수가 하나만 있습니다!

유일한 주의 사항은 개체의 크기가 4kBparameter size limit를 초과하지 않도록 해야 한다는 것입니다.

비밀 개체를 저장한 후 전체 매개 변수 집합을 가져오려면 한 번의 함수 호출만 필요합니다.

상점에서 비밀을 얻기 위해 다음과 같이 작성할 수 있습니다.

import AWS from 'aws-sdk';

const ssm = new AWS.SSM({
  apiVersion: '2014-11-06',
  region: 'us-east-1'
});

async function createDbConnection(environment) {
  const params = {
    Name: `/${environment}/db-config`,
    WithDecryption: true
  };

  const response = await ssm.getParameter(params).promise();
  const { dbName, dbUsername, dbPassword } = JSON.parse(response.Parameter.Value)

  // use dbName, dbUsername and dbPassword to build the connection string
  const connectionString = `mongodb+srv://${dbUsername}:${dbPassword}@cluster0.example.com/${dbName}?authSource=admin`

  return connectionString
}


Parameter Store에 대한 하나의 API 호출을 사용하여 전체 객체를 얻었습니다. 문자열화된 개체를 구문 분석한 후 개인을 키와 값으로 액세스할 수 있습니다.

이제 데이터베이스 연결 문자열을 쉽게 만들고 반환할 수 있습니다.

4. 요약



관련 암호 또는 인증 매개변수를 Parameter Store에 문자열화된 객체로 저장할 수 있습니다. 코드 복잡성과 업 및 다운로드 시간 모두에서 호출 수가 줄어듭니다. 동일한 결과를 얻기 위해 더 짧고 깔끔한 코드를 작성하는 것은 항상 승리입니다!

5. 참조 및 추가 자료



경로 매개변수에 대한 자세한 내용과 암호 구성에 도움이 되는 방법은 AWS documentation page on the topic을 참조하십시오.

좋은 웹페이지 즐겨찾기