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

使用CDK创建AWS Transfer SFTP连接器时测试连接无法访问Secret Manager

问题

使用TypeScript编写CDK代码创建AWS Transfer SFTP连接器,cdk deploy执行成功,但在控制台点击“Test Connection”时收到提示:

Cannot access secret manager

已为Transfer服务授予指定Secret的访问权限,但怀疑“访问Secret Manager”需要更通用的权限。相关代码如下:

const blitherSFTPSecret = secretsmanager.Secret.fromSecretCompleteArn(
    this, "BlitherSFTPSecret", BLITHER_SFTP_SECRET_ARN);
const secretPolicy = new iam.PolicyStatement({
    principals: [new iam.ServicePrincipal('transfer.amazonaws.com')],
    actions: [
        "secretsmanager:GetSecretValue",
        "secretsmanager:TagResource",
        "secretsmanager:UntagResource",
    ],
    resources: [BLITHER_SFTP_SECRET_ARN],
});
blitherSFTPSecret.addToResourcePolicy(secretPolicy);

// Host and port are not really secrets.
const host = blitherSFTPSecret.secretValueFromJson("host").unsafeUnwrap().toString();
const port = blitherSFTPSecret.secretValueFromJson("port").unsafeUnwrap().toString();

this.transferConnector = new cdk.aws_transfer.CfnConnector(this, 'BlitherSftpConnector', {
    url: `sftp://${host}:${port}`,
    accessRole: transferUserRole.roleArn,
    loggingRole: loggingRole.roleArn,
    sftpConfig: {
    },
    tags: [{ key: "Name", value: "BlitherSFTPConnector" }],
});
解决方案

核心问题分析

  1. 权限主体错误:Transfer连接器执行连接时,使用的是accessRole指定的IAM角色(transferUserRole),而非Transfer服务主体本身。之前给Secret添加的资源策略无效,权限应该直接附加到transferUserRole上。
  2. SFTP配置未关联Secret:CfnConnector的sftpConfig是空的,没有指定存储SFTP凭证的Secret ARN,导致Transfer服务无法获取认证信息,这是触发错误的核心原因。
  3. 缺失必要权限:除GetSecretValue外,连接测试还需要secretsmanager:DescribeSecret权限,确保角色能读取Secret的基本元数据。

修复后的代码

const blitherSFTPSecret = secretsmanager.Secret.fromSecretCompleteArn(
    this, "BlitherSFTPSecret", BLITHER_SFTP_SECRET_ARN);

// 给transferUserRole添加Secret访问权限,替换原有的Secret资源策略
transferUserRole.addToPrincipalPolicy(new iam.PolicyStatement({
    actions: [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
    ],
    resources: [BLITHER_SFTP_SECRET_ARN],
}));

// 避免使用unsafeUnwrap,保留SecretValue的token形式,避免明文暴露
const host = blitherSFTPSecret.secretValueFromJson("host").toString();
const port = blitherSFTPSecret.secretValueFromJson("port").toString();

this.transferConnector = new cdk.aws_transfer.CfnConnector(this, 'BlitherSftpConnector', {
    url: `sftp://${host}:${port}`,
    accessRole: transferUserRole.roleArn,
    loggingRole: loggingRole.roleArn,
    // 关键配置:指定存储SFTP凭证的Secret ARN
    sftpConfig: {
        userSecretId: BLITHER_SFTP_SECRET_ARN
    },
    tags: [{ key: "Name", value: "BlitherSFTPConnector" }],
});

额外验证项

  • 确认transferUserRole的信任策略允许Transfer服务假设该角色,示例配置如下:
const transferUserRole = new iam.Role(this, 'TransferUserRole', {
    assumedBy: new iam.ServicePrincipal('transfer.amazonaws.com'),
    // 其他角色配置...
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:41:10