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

如何在AWS CloudFormation中获取带随机后缀的Secret ARN

解决方案:动态获取Secrets Manager密钥ARN到CloudFormation模板

下面提供几种可行的方案,根据你的实际场景选择:

方案1:通过跨栈导入获取ARN(适用于密钥由其他CloudFormation栈管理的情况)

如果你的密钥是在另一个CloudFormation栈中创建的,可在该栈添加输出配置,然后在当前栈中导入:

  1. 在密钥所在的CloudFormation栈中添加Outputs段:
Outputs:
  MySecretARN:
    Value: !Ref MySecret
    Export:
      Name: MySecretARN-${AWS::Region}-${AWS::AccountId}
  1. 在当前模板的环境变量中使用!ImportValue引用该输出:
SECRET_ARN: !ImportValue MySecretARN-${AWS::Region}-${AWS::AccountId}

这种方式能确保获取到的是准确、最新的密钥ARN,无需手动处理后缀问题。

方案2:使用Lambda-backed自定义资源动态查询ARN(适用于密钥非CloudFormation管理的情况)

通过自定义资源调用Lambda函数,在CloudFormation部署时动态查询密钥的ARN:

  1. 定义一个用于查询密钥ARN的Lambda函数(Node.js示例):
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();

exports.handler = async (event) => {
  const secretName = event.ResourceProperties.SecretName;
  try {
    const secretInfo = await secretsManager.describeSecret({ SecretId: secretName }).promise();
    return {
      PhysicalResourceId: secretInfo.ARN,
      Data: { ARN: secretInfo.ARN }
    };
  } catch (err) {
    throw new Error(`查询密钥ARN失败:${err.message}`);
  }
};
  1. 在CloudFormation模板中添加Lambda资源和自定义资源:
Resources:
  GetSecretARNFunction:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs14.x
      Handler: index.handler
      CodeUri: ./lambda-get-secret-arn/
      Policies:
        - Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action: secretsmanager:DescribeSecret
              Resource: "*"

  MySecretARN:
    Type: Custom::GetSecretARN
    Properties:
      ServiceToken: !GetAtt GetSecretARNFunction.Arn
      SecretName: mysecret
  1. 在Function的环境变量中引用自定义资源的输出:
SECRET_ARN: !GetAtt MySecretARN.ARN

部署模板时,CloudFormation会调用Lambda查询最新的密钥ARN,自动处理后缀变化。

方案3:在Lambda运行时动态查询ARN(无需修改CloudFormation传递逻辑)

直接在Lambda业务代码中查询密钥ARN,而非通过环境变量传递:

const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();

async function fetchSecretARN(secretName) {
  const secretDetails = await secretsManager.describeSecret({ SecretId: secretName }).promise();
  return secretDetails.ARN;
}

exports.handler = async (event) => {
  // 运行时获取最新ARN
  const secretARN = await fetchSecretARN('mysecret');
  // 后续使用secretARN执行操作
  // ...
};

这种方式无需调整CloudFormation模板,将ARN获取逻辑移到代码运行时,自动适配ARN的任何变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:15:47