AWS CDK: 환경별 구성 패턴

9753 단어 iacawscdk

소개 👋



종종 프로젝트는 배포된 각 환경에 대해 서로 다른 구성 값을 갖습니다. 기능 토글, 타사 서비스의 URL 또는 기타 변수가 될 수 있습니다.

AWS CDK를 사용하면 구성이 간단합니다. 이 문제에 대한 몇 가지 다른 접근 방식을 보았습니다. 이 블로그에서는 TypeScript에서 사용하기에 적합한 몇 가지를 공유할 것입니다.

방법 1️⃣: 스택 구성 기능



이 접근 방식은 매퍼 기능을 사용하여 구성을 반환합니다. EnvironmentConfig 인터페이스에 단일 구성 속성이 정의되어 있음을 알 수 있습니다.

interface IEnvironmentConfig {
  readonly myEnvSpecificApiEndpoint: string;
}

const environmentConfig = (environment: string): IEnvironmentConfig => {
  const environmentMapper: {
    [environment: string]: {
      myEnvSpecificApiEndpoint: string;
    };
  } = {
    local: {
      myEnvSpecificApiEndpoint: 'https://dev.google.com/api',
    },
    test: {
      myEnvSpecificApiEndpoint: 'https://test.google.com/api',
    },
    production: {
      myEnvSpecificApiEndpoint: 'https://google.com/api',
    },
  };
  return environmentMapper[environmentName];
};


이 함수는 다음과 같이 스택에서 호출됩니다. process.env.ENV_NAME는 환경 이름(선택한 CI/CD 파이프라인의 환경 이름 변수로 대체)에 해당하거나 정의되지 않은 경우 기본값은 로컬입니다.

const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = environmentConfig(environment);


그런 다음 다음과 같이 구성에 액세스할 수 있습니다.

const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;

apiEndpoint 변수는 이제 스택에서 사용할 준비가 되었습니다.

방법 2️⃣: CDK 런타임 컨텍스트



CDK Context 값은 스택 또는 구성과 연결할 수 있는 키-값 쌍입니다. 이러한 값을 구성하는 방법에는 여러 가지가 있습니다. 이에 대한 자세한 내용은 위의 설명서 링크를 참조하십시오.

이 예에서는 CDK 프로젝트의 루트에 있는 cdk.context.json 파일을 사용하여 스택을 구성하겠습니다.

다음은 예입니다cdk.context.json.

{
   "local":{
      "myEnvSpecificApiEndpoint":"https://dev.google.com/api"
   },
   "test":{
      "myEnvSpecificApiEndpoint":"https://test.google.com/api"
   },
   "production":{
      "myEnvSpecificApiEndpoint":"https://google.com/api"
   }
}


예상되는 구성 데이터 유형을 정의하기 위해 인터페이스를 생성할 수도 있습니다.

interface IEnvironmentConfig {
  readonly myEnvSpecificApiEndpoint: string;
}


이러한 값은 다음과 같이 액세스할 수 있습니다.

const environment: string = process.env.ENV_NAME || 'local';
const envConfig: IEnvironmentConfig = scope.node.tryGetContext(environment);
const apiEndpoint: string = envConfig.myEnvSpecificApiEndpoint;


방법 3️⃣: StackProps 확장



AWS CDKStackProps 인터페이스를 확장하여 구성 속성을 추가할 수 있습니다. 이 예제에서는 AWS CDK 인터페이스를 확장하여 myEnvSpecificApiEndpoint 라는 속성을 추가합니다.

interface IEnvironmentConfig extends StackProps {
  readonly myEnvSpecificApiEndpoint: string;
}


이제 스택 초기화 파일(bin 디렉토리에 있음)에서 이것을 전달할 수 있습니다.

const app = new cdk.App();
new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
    myEnvSpecificApiEndpoint: 'https://dev.google.com/api'
});


이제 이것의 한 가지 단점은 환경별로 구성하기 위해 여전히 방법 1 또는 2와 같은 것을 구현해야 한다는 것입니다. 방법 1의 경우 다음과 같습니다.

new TheScheduledLambdaStack(app, 'TheScheduledLambdaStack',{
    myEnvSpecificApiEndpoint: envConfig.myEnvSpecificApiEndpoint;
});


결론 🤌



세 가지 방법을 모두 볼 때 저는 개인적으로 방법 2를 좋아합니다. 최근까지 저는 CDK가 이미 이 문제를 '해결'했다는 사실을 모르고 있었습니다.

나는 '코드는 책임이다'라는 말에 따라 생활합니다. 즉, 관리하는 코드가 적을수록 좋습니다.

당신은..
  • 이미 이러한 방법을 사용하고 계십니까?
  • 더 나은 방법이 있습니까?
  • 최적의 솔루션에 대해 다른 의견이 있습니까?

  • 댓글로 알려주세요!

    좋은 웹페이지 즐겨찾기