如何在不使用 CloudFormation 的情況下使用 Lambda 支持的 API 作為我的 Transfer Family 伺服器的自訂身分供應商?

3 分的閱讀內容
0

我想使用 AWS Lambda 支援的 Amazon API 閘道 API 作為我的 AWS Transfer Family 伺服器的自訂身分供應商。不過,我不想為我的組態使用其中一個 AWS CloudFormation 堆疊範本。或者,我想自訂我的組態。如何以這種方式設定自訂身分供應商?

簡短描述

您可以選擇手動將 Lambda 支援的API Gateway API 設定為 Transfer Family 伺服器的自訂身分供應商,而不是使用其中一個 CloudFormation 堆疊範本。為此,您可以使用伺服器直接設定 Lambda 函數和 API Gateway API。

例如,若要設定與基本堆疊範本相同的組態,請依照下列步驟執行:

1.    為 Lambda 執行角色建立 AWS 身分和存取管理 (IAM) 角色。

2.    建立 Lambda 函數。

3.    (選擇性) 為 API Gateway 日誌記錄角色建立 IAM 角色。

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 函數進行驗證。或者,您可以使用自訂函數。

(選擇性) 為 API Gateway 日誌記錄角色建立 IAM 角色

您可以使用 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.    從導覽窗格中選擇 APIs

3.    選擇建立 API

4.    對於選擇 API 類型,導覽至 REST API,然後選擇建置。然後,輸入以下內容: 對於選擇通訊協定,選取 REST。對於建立新 API,選取新增 API。對於 API 名稱,輸入 API 的名稱。對於端點類型,選取區域

**注意:**不要從 REST API Private 選項構建您的 API。

5.    選擇建立 API

6.    從導覽窗格中選擇模型。然後,選擇建立

7.    對於模型名稱,輸入 UserConfigResponseModel

8.    對於內容類型,輸入 application/json

9.    對於模型架構,輸入以下內容:

{"$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.    選擇 建立模型。 11.    從導覽窗格中,選擇資源

12.    展開動作,然後選擇建立資源

13.    為您的 Transfer Family 伺服器建立資源。為資源名稱,輸入 Servers。為資源路徑,輸入 servers

14.    建立伺服器 ID 的資源。為資源名稱,輸入 ServerID。為資源路徑,輸入 {serverId}

15.    為您的伺服器使用者建立資源。為資源名稱,輸入 Users。為資源路徑,輸入 users

16.    建立使用者名稱的資源。為資源名稱,輸入 Username。為資源路徑,輸入 {username}

17.    建立使用者組態的資源。為資源名稱,輸入 GetUserConfig。為資源路徑,輸入 config

18.    展開動作,然後選擇建立方法

19.    從下拉清單中,選取 **GET。**然後,選擇 GET 旁邊的檢查圖示以建立方法。

20.    對於 GET - 安裝程式,輸入下列內容: 對於整合類型,選取 Lambda 函數。對於 Lambda 區域,選取 Lambda 函數所在的 AWS 區域。對於 Lambda 函數,選取您建立的函數。

21.    選擇儲存

22.    選擇方法請求。然後,輸入以下內容: 對於授權,選取 AWS\ _IAM。對於 HTTP 要求標頭,選擇新增標頭。然後,輸入密碼作為標頭名稱。對於 URL 查詢字串參數,選擇新增查詢字串。然後,輸入 protocol 作為查詢字串名稱。再次選擇新增查詢字串,然後輸入 sourceIp 作為其他查詢字串名稱。

23.    從 GET 方法的導覽列中,選擇方法執行以返回 GET - 方法執行頁面。

24.    選擇整合請求。然後,展開對應範本

25.    對於要求內文傳遞,選取沒有範本符合要求 Content-Type 標頭時

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.    選擇 儲存。 29.    從 GET 方法的導覽列中,選擇方法執行以返回 GET - 方法執行頁面。

30.    選擇整合回應。確認沒有對應範本,並且回應主體傳遞至方法回應。

31.    從 GET 方法的導覽列中,選擇方法執行以返回 GET - 方法執行頁面。

32.    選擇**方法回應。**然後,展開 200

33.    對於 200 的回應主體,編輯模型值,然後選取您在步驟 7 至步驟 10 中建立的UserConfigResponseModel。選擇檢查圖示進行確認。

34.    從資源導覽窗格中,選擇 GET,選擇動作,然後選擇部署 API。輸入以下內容: 對於部署階段,選取**[新建階段]。對於階段名稱**,輸入階段的名稱。

35.    選擇部署

36.    從導覽窗格中,選擇階段。然後,選擇建立並輸入下列內容: 對於階段名稱,輸入 prod。對於部署,請選取您建立為新階段的部署。

37.    選擇建立

為 Transfer Family 伺服器和伺服器使用者建立 IAM 角色

1.    為 Transfer Family 伺服器建立 IAM 角色,以授予權限呼叫您建立的 API,類似下列內容:

{
  "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.     為 Transfer Family 伺服器使用者建立 IAM 角色,以授予對 Amazon Simple Storage Service (Amazon S3) 儲存貯體的存取權。然後,修改角色的信任政策以新增步驟 2 中的陳述式。

4.    為 Transfer Family 伺服器建立 IAM 角色,以將日誌傳送到 CloudWatch。然後,修改角色的信任政策 以新增步驟 2 中的陳述式。

建立 Transfer Family 伺服器

請依照下列步驟建立 Transfer Family 伺服器。請務必設定下列項目:

1.    對於身分供應商類型,選取自訂。然後,對於自訂供應商,輸入您建立的 API。

2.    對於調用角色,選取 IAM 以授予調用您建立的 API 的伺服器權限。

3.    對於日誌記錄角色,為將日誌傳送至 CloudWatch 的伺服器選取 IAM 角色。

設定憑證存放區

您必須為使用者組態設定憑證存放區。如需設定憑證存放區的詳細資訊,請參閱預設 Lambda 函數使用 AWS Secrets Manager 為 SFTP 的 AWS 傳輸啟用密碼驗證

您至少必須設定下列欄位,使用者才能在 Amazon S3 儲存貯體上執行動作:

  • 使用者名稱
  • 密碼
  • 主目錄
  • 角色

**注意:**角色是您建立用來授予伺服器使用者存取 Amazon S3 儲存貯體之 IAM 角色的 Amazon Resource Name (ARN)。

測試設定並進行疑難排解

您可以透過下列方式測試設定:

如果您在設定時遇到問題,可以透過下列方式進行疑難排解:

  • 檢查測試身分供應商的回應。如果狀態碼不是 200,則 API 設定可能存在問題。
  • 確認您建立的 IAM 角色具有正確的權限和信任關係。
  • 此組態會開啟日誌記錄,您可以檢閱 Lambda 執行日誌、API Gateway 日誌和 Transfer Family 日誌以識別問題。
  • 如果您需要的自訂身分供應商設定與其中一個可用 CloudFormation 堆疊相符,則您可以嘗試部署 CloudFormation 範本並與您的設定進行比較,以找出問題。

AWS 官方
AWS 官方已更新 2 年前