我已经使用 CloudFormation 设置了 AWS Transfer SFTP,并使用自定义身份提供商设置,API 网关位于 Lambda 函数前面。以前,我的设置运行良好,但 API 网关是公开的,我想将其设为私有并将其带入 VPC 内部。我设置了一个 VPC 接口端点并将其与 API 网关关联。相关的 CloudFormation 位如下:
APIVPCEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
ServiceName: com.amazonaws.us-east-1.execute-api
VpcEndpointType: Interface
SubnetIds:
- subnet-11111111
- subnet-22222222
SecurityGroupIds:
- sg-111111111111111
VpcId: vpc-222222
CustomIdentityProviderApi:
Type: AWS::ApiGateway::RestApi
Properties:
Name: SFTP Custom ID Provider
FailOnWarnings: true
EndpointConfiguration:
Types:
- PRIVATE
VpcEndpointIds:
- Ref: APIVPCEndpoint
但是,使用此设置后,API 网关的 DNS 名称不再在 DNS 中解析,并且我的 SFTP 实例无法访问它。我收到错误:
{
"Response": "",
"StatusCode": 0,
"Message": "Unable to call identity provider: Unable to execute HTTP request: randomname.execute-api.us-east-1.amazonaws.com: Name or service not known",
"Url": "https://blablabla.execute-api.us-east-1.amazonaws.com/prod/servers/s-blablablabla/users/myusername/config"
}
我使用 进行了验证dig
,nslookup
DNS 确实无法解析。解析的是终端节点的名称,但是,当我尝试将该名称粘贴到 AWS 传输控制台作为我的自定义身份提供商的调用 URL 时,我收到另一个错误:
Failed to edit server details: Invalid API Gateway endpoint
我感觉自己已经陷入了“不受支持的配置”领域,现在我要将 API 网关移出 VPC,并将其再次公开,以便系统正常运行。但是,如果有人这样做过并且有任何建议,我很想看看我是否可以让私有配置正常工作。
答案1
我们刚刚尝试做了类似的事情(面向互联网的 SFTP 服务器,该服务器由 VPC 托管,并使用私有 API 网关 + Lambda 作为自定义身份提供商),并从 Amazon 直接确认,API 网关端点目前必须是区域性的(至少目前如此)。我们要求他们在文档中澄清这一点,并将其添加到他们的路线图中;当他们更新文档时,我会尝试更新此回复。
答案2
事实证明,对于我们的用例来说,正确的答案是根本不让 Lambda 调用刷新缓存 API。2020 年 6 月,AWS 向文件网关添加了有针对性的自动缓存刷新选项:
此功能基于每个目录的“自上次访问以来的持续时间”。在计时器仍在运行时发出的所有访问请求都将目录内容视为当前内容。计时器到期后,下次访问目录将导致目录刷新。如果计时器为 30 分钟,则该目录的内容反映的 Amazon S3 中的内容不超过 30 分钟前的内容。
选项范围从 1 分钟到几天不等。我把时间设置为 5 分钟,我相信这对我们来说没问题。