You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CDK跨文件栈调用:如何在另一栈中使用定义的S3 Bucket

AWS CDK跨栈资源共享:S3 Bucket跨栈访问实现

核心概念

在AWS CDK中,每个Stack是独立的部署单元,但跨栈共享资源的核心逻辑是显式暴露资源引用,通过栈之间的属性传递实现访问。CDK会自动识别栈之间的依赖关系,确保被依赖的资源栈先完成部署,避免因资源未就绪导致的部署失败。这种模式可复用在所有跨栈资源共享场景,比如共享VPC、IAM角色、DynamoDB表等。

实现步骤

1. 修改资源栈(bucket.ts):暴露共享资源

将需要共享的S3 Bucket声明为栈类的公共属性,让外部栈可以直接访问该资源的引用:

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

export class PipelineSourceBucket extends cdk.Stack {
    // 声明公共属性,暴露Bucket引用
    public readonly sourceBucket: s3.Bucket;

    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        this.sourceBucket = new s3.Bucket(this, 'pipelineSourceBucket', {
            versioned: true, // CodePipeline源Bucket必须开启版本控制
        });
    }
}

2. 修改使用栈(pipeline.ts):通过自定义Props接收资源引用

定义自定义Props接口接收外部传入的Bucket引用,再在栈中使用该引用:

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as s3 from 'aws-cdk-lib/aws-s3';

// 自定义Props接口,声明需要传入的资源类型
interface PipelineStackProps extends cdk.StackProps {
    readonly sourceBucket: s3.Bucket;
}

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

        const sourceOutput = new codepipeline.Artifact();

        const pipeline = new codepipeline.Pipeline(this, 'CodePipeline', {
            pipelineName: 'jatin-ci-cd',
            crossAccountKeys: false, // 非跨账号部署无需开启
        });

        // 使用传入的Bucket引用配置SourceAction
        const sourceAction = new codepipeline_actions.S3SourceAction({
            actionName: 'S3Source',
            bucket: props.sourceBucket,
            bucketKey: 'path/to/file.zip',
            output: sourceOutput,
        });

        // 将SourceAction添加到Pipeline的Source阶段
        pipeline.addStage({
            stageName: 'Source',
            actions: [sourceAction],
        });
    }
}

3. 入口文件(app.ts):关联两个栈并传递资源引用

在CDK应用入口中,先实例化资源栈,再将资源引用传入使用栈,CDK会自动处理部署依赖:

import * as cdk from 'aws-cdk-lib';
import { PipelineSourceBucket } from './bucket';
import { PipelineStack } from './pipeline';

const app = new cdk.App();

// 先创建资源栈
const bucketStack = new PipelineSourceBucket(app, 'PipelineSourceBucketStack', {
    env: { account: 'YOUR_ACCOUNT_ID', region: 'YOUR_REGION' }
});

// 创建Pipeline栈,传入Bucket引用
new PipelineStack(app, 'PipelineStack', {
    sourceBucket: bucketStack.sourceBucket,
    env: { account: 'YOUR_ACCOUNT_ID', region: 'YOUR_REGION' }
});

app.synth();

通用复用方法

所有跨栈资源共享场景都可遵循以下流程:

  • 资源提供栈:将需要共享的资源声明为类的公共属性(public readonly)
  • 资源使用栈:定义自定义Props接口,接收需要的资源引用类型
  • 入口关联:先实例化资源栈,再将资源引用传入使用栈,CDK自动维护部署依赖

内容的提问来源于stack exchange,提问作者Jatin Mehrotra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:55:21