使用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" }], });
解决方案
核心问题分析
- 权限主体错误:Transfer连接器执行连接时,使用的是
accessRole指定的IAM角色(transferUserRole),而非Transfer服务主体本身。之前给Secret添加的资源策略无效,权限应该直接附加到transferUserRole上。 - SFTP配置未关联Secret:
CfnConnector的sftpConfig是空的,没有指定存储SFTP凭证的Secret ARN,导致Transfer服务无法获取认证信息,这是触发错误的核心原因。 - 缺失必要权限:除
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
相关产品推荐
相关产品推荐

