Как правильно передать RDS DatabaseCluster из одного стека в другой? - PullRequest
0 голосов
/ 01 июня 2019

У меня есть стек дБ, который затем передается другому стеку:

class DbStack extends cdk.Stack {
  public dbSocket: string;
  public dbReadSocket: string;
  constructor(scope: cdk.Construct, id: string, props: { vpc: ec2.Vpc }) {
    super(scope, id);
    const { vpc } = props;
    const db = new DatabaseCluster(this, "Database", {
      engine: rds.DatabaseClusterEngine.AuroraPostgresql,
      ....
    });
    this.dbSocket = db.clusterEndpoint.socketAddress;
    this.dbReadSocket = db.clusterReadEndpoint.socketAddress;
  }
}

const dbStack = new DbStack(app, "db", { vpc });

new MyStack(app, "mystack", {
  vpc,
  dbSocket: dbStack.dbSocket,
  dbReadSocket: dbStack.dbReadSocket,
}

В другом стеке я передаю эти сокеты переменным среды ECS:

export class PpfStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: MyStackProps) {
    super(scope, id, props);

    const { vpc, dbSocket, dbReadSocket } = props;

    new MyService(this, "svc", {
      vpc,
      ...
      environment: {
        NODE_ENV: "production",
        DATABASE_RO_SOCKET: dbReadSocket,
        DATABASE_RW_SOCKET: dbSocket,
      },
    });

К сожалению, переменные окружения в итоге получаются как:

db-databasec2aad89b-1t1yxzplxjsvu.cluster-cppalohfw5gz.us-east-2.rds.amazonaws.com:{IndirectPort}

ОБНОВЛЕНИЕ Это похоже на ошибку: https://github.com/awslabs/aws-cdk/issues/2711

1 Ответ

0 голосов
/ 03 июня 2019

На мой взгляд, самый простой и простой способ - использовать вывод.В ваш первый стек вы добавляете вывод (предположим, что вы определили 'databaseOutput: CfnOutput;' на уровне класса вашего стека):

this.databaseOutput = new CfnOutput(this, 'DatabaseOutput', {
    export: 'db-stack-database-cluster',
    value: db.clusterIdentifier
});

Затем в другом стеке вы можете вызвать метод импорта 'fromDatabaseClusterAttributes':

const db = DatabaseCluster.fromDatabaseClusterAttributes(this, 'ImportedDatabase', {
    clusterIdentifier: Fn.importValue('db-stack-database-cluster');
});

Затем объект DatabaseCluster соответствующим образом инициализируется, и вы можете получить доступ ко всем его свойствам и затем передать их переменным среды.

Если идентификатор кластера не является уникальным(извините, я не так глубоко связан с RDS), вы можете определить больше выходных данных и использовать их для предоставления большего количества значений.Затем вы можете использовать их все во время вызова fromDatabaseClusterAttributes.

Посмотрите на https://github.com/awslabs/aws-cdk/blob/b86404116cb8f3666e86d6c40e0a7f1a36b04fbb/packages/%40aws-cdk/aws-rds/lib/cluster-ref.ts#L46, чтобы узнать, какие свойства вы можете использовать.

...