如何使用 Lambda 支持的 API 作为 Transfer Family 服务器的自定义身份提供商而不使用 CloudFormation?

上次更新时间:2020 年 8 月 20 日

我想使用 AWS Lambda 支持的 Amazon API Gateway API 作为 AWS Transfer Family 服务器的自定义身份提供商。但是,我不想为我的配置使用 AWS CloudFormation 堆栈模板之一。或者,我想自定义我的配置。如何以这种方式设置自定义身份提供商?

简短描述

您可以选择手动配置由 Lambda 支持的 API Gateway API 作为 Transfer Family 服务器的自定义身份提供商,而不使用其中一个 CloudFormation 堆栈模板。为此,您可以直接利用服务器配置 Lambda 函数和 API Gateway API。

例如,要设置与基本堆栈模板相同的配置,请执行以下步骤:

1.     为 Lambda 执行角色创建 AWS Identity and Access Management (IAM) 角色。

2.     创建 Lambda 函数。

3.     (可选)创建 IAM 角色作为 API Gateway 日志记录角色。

4.     设置 API Gateway API 作为身份提供商。

5.    为 Transfer Family 服务器和服务器用户创建 IAM 角色。

6.    创建 Transfer Family 服务器。

7.    设置凭证存储。

解决方法

重要提示:此配置是如何在不使用 CloudFormation 堆栈模板的情况下设置自定义身份提供商的示例。您必须根据自己对自定义身份提供商的具体需要修改配置步骤。

为 Lambda 执行角色创建 IAM 角色

1.    使用 IAM 控制台创建执行角色
注意:对于此配置,您只需要基本执行权限。但是,请务必为您的使用案例自定义权限。

2.    修改角色的信任策略以添加以下语句:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

创建 Lambda 函数

按照以下步骤使用控制台创建 Lambda 函数。请务必配置以下内容:

1.    对于执行角色,选择您创建的 Lambda 执行角色。

2.    对于函数代码,您可以使用默认 Lambda 函数进行身份验证。或者,您也可以使用自定义函数。

(可选)创建 IAM 角色作为 API Gateway 日志记录角色

您可以使用 Amazon CloudWatch Logs 来帮助您使用 REST API 调试错误。要创建日志记录角色,请执行以下步骤:

1.    为 API Gateway 创建 IAM 角色,并将 AmazonAPIGatewayPushToCloudWatchLogs 托管策略附加到该角色。

2.    修改角色的信任策略以添加以下语句:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

设置 API Gateway API 作为身份提供商

1.    打开 API Gateway 控制台

2.    从导航窗格中,选择 API

3.    选择 Create API(创建 API)。

4.    对于 Choose an API type(选择 API 类型),导航到 REST API,然后选择 Build(构建)。然后,输入以下内容:
对于 Choose the protocol(选择协议),选择 REST
对于 Create new API(创建新 API),选择 New API(新建 API)。
对于 API name(API 名称),输入 API 的名称。
对于 Endpoint Type(终端节点类型),选择 Regional(区域)。

注意:不要从 REST API 专用选项构建您的 API。

5.    选择 Create API(创建 API)。

6.    从导航窗格中选择 Models(模型)。然后,选择 Create(创建)。

7.    对于 Model name(模型名称),输入 UserConfigResponseModel

8.    对于 Content type(内容类型),输入 application/json

9.    对于 Model schema(模型架构),输入以下内容:

{"$schema":"http://json-schema.org/draft-04/schema#","title":"UserUserConfig","type":"object","properties":{"Role":{"type":"string"},"Policy":{"type":"string"},"HomeDirectory":{"type":"string"},"PublicKeys":{"type":"array","items":{"type":"string"}}}}

10.    选择 Create model(创建模型)。

11.    从导航窗格中选择 Resources(资源)。

12.    展开 Actions(操作),然后选择 Create Resource(创建资源)。

13.    为 Transfer Family 服务器创建资源。对于 Resource Name(资源名称),输入 Servers。对于 Resource Path(资源路径),输入 servers

14.    为服务器 ID 创建资源。对于 Resource Name(资源名称),输入 ServerID。对于 Resource Path(资源路径),输入 {serverId}

15.    为服务器用户创建资源。对于 Resource Name(资源名称),输入 Users。对于 Resource Path(资源路径),输入 users

16.    为用户名创建资源。对于 Resource Name(资源名称),输入 Username。对于 Resource Path(资源路径),输入 {username}

17.    为用户配置创建资源。对于 Resource Name(资源名称),输入 GetUserConfig。对于 Resource Path(资源路径),输入 config

18.    展开 Actions(操作),然后选择 Create Method(创建方法)。

19.    从下拉菜单中,选择 GET。然后,选择 GET 旁边的复选图标以创建方法。

20.    对于 GET - Setup(GET - 设置),输入以下内容:
对于 Integration type(集成类型),选择 Lambda Function(Lambda 函数)。
对于 Lambda Region(Lambda 区域),选择您的 Lambda 函数所处的 AWS 区域。
对于 Lambda Function(Lambda 函数),选择您创建的函数。

21.    选择 Save(保存)。

22.    选择 Method Request(方法请求)。然后,输入以下内容:
对于 Authorization(授权),选择 AWS_IAM
对于 HTTP Request Headers(HTTP 请求标头),选择 Add header(添加标头)。然后,输入 Password(密码)作为标头名称。
对于 URL Query String Parameters(URL 查询字符串参数),选择 Add query string(添加查询字符串)。然后,输入协议作为查询字符串名称。
选择 Add query string again(再次添加查询字符串),然后输入 sourceIp 作为另一个查询字符串名称。

23.    从 GET 方法的导航栏中,选择 Method Execution(方法执行)以返回到 GET - Method Execution (GET - 方法执行)页面。

24.    选择 Integration Request(集成请求)。然后,展开 Mapping Templates(映射模板)。

25.    对于 Request body passthrough(请求正文直通),选择 When no template matches the request Content-Type header(当没有模板与请求内容-类型标头匹配时)。

26.    对于 Content-Type(内容类型),输入 application/json。选择复选图标进行确认。

27.    对于模板,输入以下内容:

{ "username": "$input.params('username')", "password": "$util.escapeJavaScript($input.params('Password')).replaceAll("\\'","'")", "serverId": "$input.params('serverId')", "protocol": "$input.params('protocol')","sourceIp": "$input.params('sourceIp')" }

28.     选择 Save(保存)。

29.    从 GET 方法的导航栏中,选择 Method Execution(方法执行)以返回到 GET - Method Execution (GET - 方法执行)页面。

30.    选择 Integration Response(集成响应)。确认没有映射模板,并且响应正文已传递给方法响应。

31.    从 GET 方法的导航栏中,选择 Method Execution(方法执行)以返回到 GET - Method Execution (GET - 方法执行)页面。

32.    选择 Method Response(方法响应)。然后,展开 200

33.    对于 Response Body for 200(200 的响应正文),编辑 Models(模型)值,然后选择您在步骤 7 到 10 中创建的 UserConfigResponseModel。选择复选图标进行确认。

34.    从 Resources(资源)导航窗格中,依次选择 GETActions(操作)和 Deploy API(部署 API)。输入以下内容:
对于 Deployment stage(部署阶段),选择 [New Stage]([新阶段])。
对于 Stage name(阶段名称),输入该阶段的名称。

35.    选择 Deploy(部署)。

36.    在导航窗格中,选择 Stages(阶段)。然后,选择 Create(创建)并输入以下内容:
对于 Stage name(阶段名称),输入 prod
对于 Deployment(部署),选择作为新阶段创建的部署。

37.    选择 Create(创建)。

为 Transfer Family 服务器和服务器用户创建 IAM 角色

1.    为授权其调用您所创建的 API 的权限的 Transfer Family 服务器创建 IAM 角色,类似于以下内容:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Action": [
              "execute-api:Invoke"
          ],
          "Resource": "arn:aws:execute-api:{Region}:{AWS-Account-ID}:{API-Gateway-id}/{stage}/GET/*",
          "Effect": "Allow"
      },
      {
          "Action": [
              "apigateway:GET"
          ],
          "Resource": "*",
          "Effect": "Allow"
      }
  ]
}

2.    修改角色的信任策略以添加以下语句:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    为授权其访问 Amazon Simple Storage Service (Amazon S3) 存储桶Transfer Family 服务器用户创建 IAM 角色。然后,修改角色的信任策略以添加步骤 2 中的语句。

4.    为向 CloudWatch 发送日志Transfer Family 服务器创建 IAM 角色。然后,修改角色的信任策略以添加步骤 2 中的语句。

创建 Transfer Family 服务器

按照以下步骤创建 Transfer Family 服务器。请务必配置以下内容:

1.    对于 Identity provider type(身份提供商类型),选择 Custom(自定义)。然后,对于 Custom provider(自定义提供商),输入您创建的 API。

2.    对于 Invocation role(调用角色),选择授予其调用您创建的 API 所需的服务器权限的 IAM 角色。

3.    对于 Logging role(日志记录角色),选择向 CloudWatch 发送日志的服务器的 IAM 角色。

设置凭证存储

您必须为用户配置设置凭证存储。有关设置凭证存储的更多信息,请参阅默认 Lambda 函数以及使用 AWS Secrets Manager 为 AWS Transfer for SFTP 启用密码身份验证

您至少必须为用户设置以下字段,他们才能够对 Amazon S3 存储桶执行操作:

  • 用户名
  • 密码
  • HomeDirectory
  • 角色

注意:角色是指您为授权服务器用户访问 Amazon S3 存储桶而创建的 IAM 角色的 Amazon 资源名称 (ARN)。

测试您的设置并排查故障

您可以通过以下方式测试您的设置:

如果您在设置过程中遇到问题,可以通过以下方式进行故障排查:

  • 检查测试身份提供商的响应。如果状态代码不是 200,则 API 设置可能存在问题。
  • 确认您创建的 IAM 角色拥有正确的权限和信任关系。
  • 此配置启用了日志记录功能,因此您可以审核 Lambda 执行日志、API Gateway 日志和 Transfer Family 日志以找出问题。
  • 如果您需要的自定义身份提供商设置与可用的 CloudFormation 堆栈之一匹配,则可以尝试部署 CloudFormation 模板并与您的设置进行比较以找出问题。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?