#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
.
При таком подходе первый стек уже должен быть развернут.