AWS CDK- доступ к ресурсу из другого стека

#aws-cdk #aws-step-functions

#aws-cdk #aws-step-функции

Вопрос:

Предположим, у меня есть ресурс, скажем, действие пошаговой функции, в одном стеке. Как я могу получить доступ к его arn в другом стеке?

Я нашел CfnConstruct, подходящие для экспорта (https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core .CfnOutput.html ). На данный момент я использовал CfnConstruct для его экспорта:

 this.initiateValidationActivityArn = new cdk.CfnOutput(this, 'InitiateValidationActivityArn', {
      value: igvsStateMachine.initiateValidationActivity.activityArn
    });
  

Теперь, как я могу получить к нему доступ в другом файле. Я пробовал это:

 ecsService.initiateValidationActivityArn.value
  

Но значение является закрытым для создания, поэтому его нельзя использовать.

Ответ №1:

Если у вас есть стеки в одном развертываемом cdk-приложении, вы можете получить доступ к значению свойства из стека, сделав его доступным извне / не приватным. Что я рекомендую сделать, так это сохранить его readonly , чтобы его нельзя было повторно инициализировать извне стека.

 // file: ./lib/first-stack.ts

// import statements

export class FirstStack extends Stack {
  readonly vpc: IVpc;
  
  constructor(...) {
     // setup
     this.vpc = new Vpc(this, "VPC", {...});
  }
}
  

В зависимом стеке вы можете передать его через (пользовательские) реквизиты.

 // file: ./lib/second-stack.ts

export interface SecondStackProps extends StackProps {
   importedVpc: IVpc;
}

export class SecondStack extends Stack {
  constructor(scope: cdk.Construct, id: string, props: SecondStackProps) {
    super(scope, id, props);
    const importedVpc = props.importedVpc;

    // do sth. with your imported resource
  }
}
  

Почему это работает, вы можете спросить …?
Это работает, потому что CDK генерирует идентификаторы ресурсов и на этапе синтеза может помещать токены для ресурсов внутри сгенерированных шаблонов.

Это не работает, когда вы разделили cdk-приложения / развертывания стеков, потому что CDK не может разрешить (существующие) токены идентификатора ресурса во время cdk-synth. Для этого вам нужен другой подход:

 // file: ./lib/first-stack-separated-deployment.ts

// import statements

export class FirstStackSeparatedDeployment extends Stack {
  cfnVpcId: CfnOutput;
  
  constructor(...) {
     // setup
     const vpc = new Vpc(this, "VPC", {...});
     this.cfnVpcId= new cdk.CfnOutput(this, "FirstStackCfnVpcId", {
      value: vpc.vpcId,
      exportName: "UniqueNameForYourVpcId"
    });
  }
}
  

В другом стеке, для которого требуется уже развернутый ресурс, вы делаете следующее:

 // file: ./lib/second-stack-separated-deployment.ts
export class SecondStackSeparatedDeployment extends Stack {
  constructor(...) {
    // setup
    const vpcId = Fn.importValue("UniqueNameForYourVpcId")
    const importedVpc = ec2.Vpc.fromVpcAttributes(this, "ImportedVpc", {
      vpcId: vpcId,
      availabilityZones: [this.region],
    })

    // proceed further...
  }
}
  

По сути, вы берете exportName из CfnOutput конструкции в качестве идентификатора и импортируете его через ядро Fn.importValue .
При таком подходе первый стек уже должен быть развернут.