在秘密堆栈上保留 removalPolicy,这样它就不会在 synth 上被删除

RETAIN removalPolicy on secret stack so it doesn't get deleted on synth

我有一个 cdk 堆栈,包括一个秘密堆栈,我目前正在尝试部署我的应用程序,我最近从 ecr 中删除了一个秘密堆栈和容器。但是,由于当前部署的应用程序依赖于此,我在部署时得到以下信息

Export <redacted>-*******-secrets-stack:ExportsOutputRefoauth2proxysecret66696FAADBFA07E9 cannot be deleted as it is in use by <redacted>-*******-ecs-stack

所以我加回了秘密堆栈

import { Stack, StackProps } from "aws-cdk-lib";
import { Construct } from "constructs";
import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";

interface SecretsStackProps extends StackProps {
  namespace: string;
}

export class SecretsStack extends Stack {
  public oauth2ProxySecrets: secretsmanager.Secret;
  public appSecrets: secretsmanager.Secret;

  constructor(scope: Construct, id: string, props: SecretsStackProps) {
    super(scope, id, props);

    // added this back
    this.oauth2ProxySecrets = new secretsmanager.Secret(this, `oauth2-proxy-secret`, {
        secretName: `${props.namespace}/<redacted>/oauth2-proxy`
      }
    );
    //

    this.appSecrets = new secretsmanager.Secret(this, `app-secret`, {
      secretName: `${props.namespace}/<redacted>/app`
    });
  }
}

我将如何保留这个堆栈,据我所知,因为这个 container/stack 没有被使用它正在尝试删除堆栈,但由于当前的部署不能。

这里有任何帮助都会很棒。

发生这种情况是因为它首先尝试使用秘密更新堆栈,然后是用于导入它们的堆栈。

这失败了,因为无法在导入之前删除导出。

移除堆栈的解决方案是使其成为 two-step 进程。 首先,这是主要部分,我们需要确保即使没有在任何地方进口也能保留出口。为此,存在一个辅助方法:Stack.exportValue.

因此您需要将以下内容添加到导出堆栈中:

this.exportValue(oauth2ProxySecrets.secretArn);
this.exportValue(appSecrets.secretArn);

执行此操作后,部署将完成。 部署后,您可以自由地完全删除堆栈代码,因为它不会与其他堆栈解耦。