CloudFormation を使用せずに、Lambda-backed API を my Transfer Family サーバーのカスタム ID プロバイダーとして使用するにはどうすればよいですか?

最終更新日:2021年11月22日

AWS Transfer Family サーバーのカスタム ID プロバイダーとして AWS Lambda-backed Amazon API Gateway API を使用したいと考えています。ただし、設定に AWS CloudFormation スタックテンプレートの 1 つを使用したくありません。あるいは、設定をカスタマイズしたいと考えています。この方法でカスタム ID プロバイダーをセットアップするにはどうすればよいですか?

簡単な説明

CloudFormation スタックテンプレートの 1 つを使用する代わりに、Lambda-backed API Gateway API を Transfer Family サーバーのカスタム ID プロバイダーとして手動で設定することを選択できます。これを行うために、サーバーで Lambda 関数と API Gateway API を直接設定できます。

たとえば、基本スタックテンプレートと同じ設定をセットアップするには、次の手順に従います。

1.    Lambda 実行ロールの AWS Identity and Access Management (IAM) ロールを作成します。

2.    Lambda 関数を作成します。

3.    (オプション) API Gateway ロギングロールの IAM ロールを作成します。

4.    ID プロバイダーとして 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.    [Execution role] (実行ロール) で、作成した 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"
    }
  ]
}

ID プロバイダーとして API Gateway API をセットアップする

1.    API Gateway Console にログインします。

2.    ナビゲーションペインで、[APIs] を選択します。

3.    [Create API] (API の作成) を選択します。

4.    APIタイプを選択で、REST APIに移動し、構築を選択します。次に、次のように入力します:プロトコルの選択REST を選択します。Create new API(新しい API の作成) で、New API (新しい API) を選択します。API 名 に、API の名前を入力します。Endpoint Type(エンドポイントタイプ) で、Regional(リージョン) を選択します。

注: REST API Private optionから 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に、次のように入力します:統合タイプLambda 関数を選択します。Lambda リージョンについて、Lambda 関数が含まれている AWS リージョンを選択します。Lambda 関数で、作成した関数を選択します。

21.    [Save] (保存) を選択します。

22.    Method Request (メソッドリクエスト) を選択します。次に、次のように入力します:認可で、AWS_IAM を選択します。HTTP Request Headersで、ヘッダーの追加を選択します。その後、ヘッダー名として Password と入力します。URL Query String パラメータ URLで、クエリ string の追加を選択します。その後、クエリ文字列名としてプロトコルを入力します。もう一度 クエリstring の追加を選択し、別のクエリ文字列名として sourceIp を入力します。

23.    GET メソッドのナビゲーションバーから、Method Executionを選択して、GET - Method Executionページに戻ります。

24.    [Integration Request] (統合リクエスト) を選択します。その後、[Mapping Templates] (マッピングテンプレート) を展開します。

25.    [Request body passthrough] (リクエスト本文のパススルー) で、[When no template matches the request Content-Type header] (リクエストの 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.    [ Save] (保存) を選択します。

29.    GET メソッドのナビゲーションバーから、[Method Execution] (メソッドの実行) を選択して、[GET - Method Execution] ページに戻ります。

30.    [Integration Response] (統合レスポンス) を選択します。マッピングテンプレートがないこと、およびレスポンス本文がメソッドレスポンスに渡されていることを確認します。

31.    GET メソッドのナビゲーションバーから、[Method Execution] (メソッドの実行) を選択して、[GET - Method Execution] ページに戻ります。

32.    Method Responseを選択します。 次に、200を展開します。

33.    [Response Body for 200] (200 のレスポンス本文) で、Models 値を編集してから、手順 7〜10 で作成した UserConfigResponseModel を選択します。チェックアイコンを選択して確認します。

34.    リソースナビゲーションペインから、GETアクションDeploy APIの順に選択します。次のように入力します:デプロイステージ [新しいステージ] を選択します。Stage name(ステージ名) で、ステージの名前を入力します。

35.    [Deploy] (デプロイ) を選択します。

36.    ナビゲーションペインで、Stagesを選択します。次に、作成を選択し、次のように入力します:ステージ名 prod と入力します。デプロイ で、作成したデプロイを新しいステージとして選択します。

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] (ID プロバイダーの種類) で、[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 Resource Name (ARN) です。

セットアップのテストとトラブルシューティング

次の方法でセットアップをテストできます:

セットアップで問題が発生した場合は、次の方法でトラブルシューティングを行うことができます。

  • テスト ID プロバイダーからのレスポンスを確認してください。ステータスコードが 200 でない場合は、API のセットアップに問題がある可能性があります。
  • 作成した IAM ロールに正しいアクセス許可と信頼関係があることを確認してください。
  • この設定によりログが有効になり、Lambda 実行ログ、API Gateway ログ、および Transfer Family ログを確認して問題を特定できます。
  • 必要なカスタム アイデンティティプロバイダーのセットアップが利用可能な CloudFormation スタックの 1 つと一致する場合は、CloudFormation テンプレートをデプロイし、セットアップと比較して問題を特定することを試みることができます。

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?