【问题标题】:Deploy AWS-CDK stack on other Regions在其他区域部署 AWS-CDK 堆栈
【发布时间】:2020-11-25 22:33:40
【问题描述】:

基本上,我有一个简单的堆栈(Virginia),其中包含类似的资源

  1. S3 存储桶(有数据)
  2. Glue_Table
  3. 胶水工作

现在,我想在Europe 区域部署相同的堆栈,例如eu-central-1

当我尝试在 eu-central-1 上部署 aws-cdk-stack 时,我收到此错误

Bucket_Name already exists Exception

部署堆栈的命令类似于cdk deploy <stack-name>

目标

我想在不删除现有 s3 存储桶的情况下将现有堆栈部署到另一个区域。

谁能为此提出解决方案?

【问题讨论】:

  • 我认为对于另一个区域,您应该更改 cdk 代码以将现有的 bucket_name 导入
  • 您能分享您在哪里创建 S3 存储桶的 cdk 代码吗?

标签: amazon-web-services amazon-s3 amazon-cloudformation aws-cdk aws-regions


【解决方案1】:

基于docs

Amazon S3 存储桶名称是全球唯一的,并且命名空间由所有 AWS 账户共享。这意味着创建存储桶后,在删除该存储桶之前,该存储桶的名称不能被任何 AWS 区域中的另一个 AWS 账户使用

创建 S3 存储桶时,bucketName 是可选的。如果您遗漏了bucketName,将为您生成一个唯一的存储桶名称。

cdk 项目中的附加资源可以通过引用获取存储桶名称。

例子:

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as glue from '@aws-cdk/aws-glue';


export class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Generate a random bucket name that starts with your cdk stack name
    const bucket = new s3.Bucket(this, 'MyBucket');

    const database = new glue.Database(this, 'MyDatabase', {
      databaseName: 'my_database'
    });

    new glue.Table(this, 'MyTable', {
      database: database,
      bucket: bucket,  // Takes details from the bucket created
      s3Prefix: 'my-table/'
      // other table details...
    });
  }
}

【讨论】:

    【解决方案2】:

    我会将区域名称附加到存储桶的末尾,这可以很容易地完成,因为 AWS 已经为此提供了一个环境变量。因此,在您的堆栈中命名存储桶时,请在其末尾添加类似 Stack.of(this).region 的内容,然后存储桶名称将是唯一的。

    这是一个打字稿 CDK 示例

    const bucket: Bucket = new Bucket(this, "S3_bucket_name", {
          bucketName: "S3_bucket_name_" + Stack.of(this).region,
        });
        
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2020-12-19
      • 2020-12-13
      • 2020-03-05
      • 2020-08-12
      • 2021-02-18
      • 1970-01-01
      • 2018-07-10
      • 2016-07-23
      相关资源
      最近更新 更多