【问题标题】:AWS CDK- Access resource from other stackAWS CDK- 从其他堆栈访问资源
【发布时间】:2020-12-19 20:09:51
【问题描述】:

假设我在一个堆栈中有一个资源,比如 stepfunction 活动。如何访问它在其他堆栈中的 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

但是 value 是私有的,所以不能使用它。

【问题讨论】:

    标签: aws-cdk aws-step-functions


    【解决方案1】:

    如果您在一个可部署的 cdk-app 中拥有堆栈,则可以通过使其从外部/非私有访问来从堆栈中访问属性值。 我建议做的是保留它readonly,这样它就不能从堆栈外部重新初始化。

    // file: ./lib/first-stack.ts
    
    // import statements
    
    export class FirstStack extends Stack {
      readonly vpc: IVpc;
      
      constructor(...) {
         // setup
         this.vpc = new Vpc(this, "VPC", {...});
      }
    }
    

    在依赖栈中,可以通过(自定义)props 传递。

    // 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 会生成资源 ID,并且在合成阶段它可以将资源令牌放入生成的模板中。

    当您分离 cdk-apps / 堆栈部署时,这不起作用,因为 CDK 在 cdk-synth 期间无法解析(现有)资源 ID 令牌。 有了这个,你需要有另一种方法:

    // 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...
      }
    }
    

    基本上,您从CfnOutput 构造中获取exportName 作为标识符并通过核心Fn.importValue 导入它。 使用这种方法,已经需要部署第一个堆栈。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2021-06-19
      • 2021-05-24
      • 1970-01-01
      相关资源
      最近更新 更多