AWS CDK를 사용하여 서로 다른 AWS 계정을 기반으로 서로 다른 CloudFormation 스택 배포

AWS CDK는 좋아하는 언어로 AWSinfrastructure as code를 작성할 수 있는 훌륭한 도구입니다. CDK가 제공하는 모든 멋진 기능 외에도 제가 개인적으로 좋아하는 것 중 하나는 CDK가 don't repeat ourselves 또는 DRY principal인지 확인하는 데 도움이 된다는 것입니다.

대부분의 팀이 제품을 구축하기 위해 여러 환경을 사용하므로 모든 환경에 리소스를 배포해야 합니다. 항상 환경에 동일한 리소스나 구성이 있는 것은 아닙니다. 사실 대부분의 경우 dev 또는 prod와 비교하여 staging에 대해 다른 리소스 또는 설정이 있습니다. AWS에서는 보안, 액세스 분산 등 다양한 이유로 인해 환경마다 다른 계정을 갖게 됩니다.

제 경우에는 이러한 환경에 최대한 효율적으로 배포하고 싶었습니다. 저는 이러한 환경과 각 환경에 특정한 일부 리소스 사이에 공통 리소스가 있습니다. 반면에 다른 환경에 대한 배포를 처리하는 CDK 앱은 하나만 갖고 싶습니다.

내가 생각한 솔루션은 사용 중이었습니다assume role 배포할 계정을 파악할 수 있으며 해당 계정 번호와 환경과 계정 간의 간단한 매핑을 기반으로 배포하려는 환경이 무엇인지 파악합니다. 해당 환경에 원하는 스택을 배포하기만 하면 됩니다.

보시다시피 인프라를 명령적으로 작성하고 있기 때문에 매우 쉽습니다.

/* eslint-disable no-new */

const AWS = require("aws-sdk");
const cdk = require("@aws-cdk/core");
const { CommonStack } = require("./stack");
const { DevStack } = require("./dev-stack");
const { ProdStack } = require("./prod-stack");


const sts = new AWS.STS({});

const TEST_REGION = "eu-west-1";
const DEV_REGION = "eu-west-1";

const AWS_ACCOUNT_IDS = {
  development: "000000000",
  quality: "00000000",
  production: "000000000",
};

class App extends cdk.App {

  deployCommonStacks() {
    this.commonStack = new CommonStack(
      this,
      "commonStack",
      {}
    );
  }

  deployDevStacks() {
    this.devStack = new DevStack(
      this,
      "devStack",
      {}
    );    
  }

  deployProdStacks() {
    this.prodStack = new ProdStack(
      this,
      "prodStack",
      {}
    );    

  }

  async deployStacks() {
    const assumed = await sts.getCallerIdentity({}).promise();
    console.log("deployStacks() caller identity:", assumed);

    this.deployCommonStacks();

    if (assumed.Account === AWS_ACCOUNT_IDS.development) {
      console.log("Deploying to development account:");
      this.deployDevStacks();
    }

    if (assumed.Account === AWS_ACCOUNT_IDS.production) {
      console.log("Deploying to production account:");
      this.deployProdStacks();
    }

    return assumed.Account;
  }
}

const app = new App();
app
  .deployStacks()
  .then(acc => {
    console.log(`deployStacks() completed for account: ${acc}`);
  })
  .catch(e => {
    console.log("error in deployStacks():", e);
  });

좋은 웹페이지 즐겨찾기