0

基本上,我有一个简单的堆栈(Virginia),它将拥有类似的资源

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

Europe现在,我想在eu-central-1.

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

Bucket_Name already exists Exception

部署堆栈的命令就像cdk deploy <stack-name>

目标

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

任何人都可以为此提出解决方案吗?

4

2 回答 2

3

基于文档

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...
    });
  }
}

于 2020-11-26T13:49:36.833 回答
0

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

这是一个打字稿 CDK 示例

const bucket: Bucket = new Bucket(this, "S3_bucket_name", {
      bucketName: "S3_bucket_name_" + Stack.of(this).region,
    });
    
于 2020-11-30T10:46:41.467 回答