

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon API Gateway メソッドをカスタム ID プロバイダーとして設定する
<a name="gateway-api-tutorial"></a>

このチュートリアルでは、Amazon API Gateway メソッドをセットアップし、それをカスタム ID プロバイダーとして使用して AWS Transfer Family サーバーにファイルをアップロードする方法を説明します。このチュートリアルでは、「[基本スタックテンプレート](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)」 やその他の基本的な機能のみを例として取り上げます。

**Topics**
+ [前提条件](#prereq-api-gateway-tutorial)
+ [ステップ 1: CloudFormation スタックを作成する](#create-cf-stack)
+ [ステップ 2：サーバーの API Gateway メソッド設定を確認する](#deploy-api-gateway)
+ [ステップ 3: Transfer Family サーバーの詳細を表示する](#create-transfer-server)
+ [ステップ 4: ユーザーがサーバーに接続できることを確認する](#test-user-server-connect)
+ [ステップ 5: SFTP 接続とファイル転送をテストする](#test-sftp-connection)
+ [ステップ 6: バケットへのアクセスを制限する](#example-bucket)
+ [Amazon EFS を使用する場合に Lambda を更新する](#lambda-posix)

## 前提条件
<a name="prereq-api-gateway-tutorial"></a>

で Transfer Family リソースを作成する前に CloudFormation、ストレージとユーザーロールを作成します。

**ストレージを指定してユーザーの役割を作成する**

1. 使用しているストレージに応じて、次のドキュメントを参照してください。
   + Amazon S3 バケットを作成するには、Amazon Simple Storage Service ユーザーガイドの「[S3 バケットを作成するには？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket-overview.html)」を参照してください。
   + Amazon EFS ファイルシステムを作成するには、「」を参照してください[Amazon EFS ファイルシステムを設定する](configure-storage.md#requirements-efs)。

1. ユーザーロールを作成するには、[IAM ポリシーとロールを作成する](requirements-roles.md) を参照してください

 CloudFormation 次のセクションで スタックを作成する際に、ストレージとユーザーの役割の詳細を入力します。

## ステップ 1: CloudFormation スタックを作成する
<a name="create-cf-stack"></a>

**提供されたテンプレートから AWS CloudFormation スタックを作成するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソールを開きます。

1. [**Create stack**] (スタックの作成) を選択し、[**With new resources (standard)**] (新しいリソースを使用 (標準)) を選択します。

1. **前提条件 - テンプレートの準備**ペインで、**既存のテンプレートの選択**を選択します。

1. このリンクで「[基本スタックテンプレート](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml)」 をコピーして [**Amazon S3 URL**] フィールドに貼り付けます。

1. [**Next**] (次へ) をクリックします。

1. スタックの名前を含めてパラメータを指定します。必ず以下のことをしてください。
   + [**UserName**] と[**UserPassword**] のデフォルト値を置き換えます。
   + **[ユーザーホームディレクトリ]** には、前に作成したAmazon S3バケットまたはAmazon EFSファイルシステムのストレージの詳細を入力してください。
   + デフォルトの **[UserRolAn]** を、前に作成したユーザー ロールに置き換えます。 AWS Identity and Access Management (IAM) ロールには適切なアクセス許可が必要です。IAM ロールとバケットポリシーの例については、「[ステップ 6: バケットへのアクセスを制限する](#example-bucket)」を参照してください。
   + パスワードではなくパブリックキーを使用して認証する場合、[**UserPublicKey1**] フィールドにパブリックキーを入力します。SFTP を使用してサーバーに初めて接続する場合、パスワードの代わりにプライベートキーを指定します。

1. **[Next]** (次へ) を選択してから [**Configure stack options**] (スタックオプションの設定) ページでもう一度 [**Next**] (次へ) をクリックします。

1. 作成しようとするスタックの詳細を確認してから [**Create stack**] (スタックの作成) を選択します。
**注記**  
ページ下部の [**Capabilities**] (機能) の下で、 CloudFormation で IAM リソースが作成される可能性があることを承認する必要があります。

## ステップ 2：サーバーの API Gateway メソッド設定を確認する
<a name="deploy-api-gateway"></a>

**注記**  
セキュリティを強化するために、ウェブアプリケーションのファイアウォールを設定できます。 AWS WAF はウェブアプリケーションファイアウォールで、これにより Amazon API Gateway に転送される HTTP および HTTPS リクエストのモニタリングが可能です。詳細については、「[ウェブアプリケーションファイアウォールを追加する](web-application-firewall.md)」を参照してください

**API Gateway キャッシュを有効にしない**  
Transfer Family のカスタム ID プロバイダーとして使用する場合、API Gateway メソッドのキャッシュを有効にしないでください。次の理由により、キャッシュは認証リクエストに対して不適切で無効です。  
各認証リクエストは一意であり、キャッシュされたレスポンスではなく、ライブレスポンスが必要です
Transfer Family は API Gateway に重複または繰り返しリクエストを送信しないため、キャッシュには利点はありません。
キャッシュを有効にすると、API Gateway が不一致データで応答し、認証リクエストへの無効な応答が発生します。

**サーバーの API Gateway メソッドの設定を確認し、デプロイするには**

1. <a name="step_invoke_url"></a>

   API Gateway コンソール (「[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway/)」) を開きます。

1.  CloudFormation テンプレートが生成した **Transfer Custom Identity Provider の基本テンプレート API** を選択します。

1. [**Resource**] (リソース) ペインで[**GET**] を選択してから[**Method Request**] (メソッドの作成) を選択します。

1. [**Actions**] (アクション) で [**Deploy API**] (API のデプロイ) を選択します。[**Deplyment stage**] (デプロイステージ) で [**prod**] を選択してから [**Deploy**] (デプロイ) を選択します。

   API Gateway メソッドが正常にデプロイされると、[**Stage Editor**] (ステージエディタ) セクションにそのパフォーマンスが表示されます。
**注記**  
ページの最上部に表示される [**Invoke URL**] (呼び出し URL) アドレスをコピーします。次のステップで必要になります。

## ステップ 3: Transfer Family サーバーの詳細を表示する
<a name="create-transfer-server"></a>

テンプレートを使用して CloudFormation スタックを作成すると、Transfer Family サーバーが自動的に作成されます。

**Transfer Family サーバーの詳細を表示するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソールを開きます。

1. 作成したスタックを選択します。

1. **[リソース]** タブを選択してください。  
![Transfer Family サーバーの詳細が強調表示された、 CloudFormation スタックの作成時に作成されたリソースのリストを示す画面。](http://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/apig-find-server-id.png)

   サーバー ARN は、**[TransferServer]** **[行の物理 ID] ** 列に表示されます。サーバー ID は ARN に含まれています (例: **[s-11112222333344445]**)。

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) で AWS Transfer Family コンソールを開き、**サーバー**ページで新しいサーバーを選択します。

   サーバー ID は、 の **TransferServer** リソースに表示される ID と一致します CloudFormation。

## ステップ 4: ユーザーがサーバーに接続できることを確認する
<a name="test-user-server-connect"></a>

**Transfer Family コンソールを使用して、ユーザーがサーバーに接続できるかどうかをテストするには**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) で AWS Transfer Family コンソールを開きます。

1. [**Servers**] (サーバー) ページで新しいサーバーを選択し、[**Actions**] (アクション) を選択してから [**Test**] (テスト) を選択します。

1. サインイン資格情報のテキストを**[ユーザー名] **フィールドと[**パスワード] **フィールドに入力します。これらは、 CloudFormation スタックをデプロイしたときに設定した値です。

1. [**Server Protocol**] (サーバープロトコル) について、[**SFTP**] を選択し、[**Source IP**] (送信元 IP) に **127.0.0.1** を入力します。

1. [**Test**] (テスト) を選択します。

   ユーザー認証が成功すると、テストの結果として `StatusCode: 200` HTML レスポンスおよびユーザーのロールとパーミッションの詳細を含む JSON オブジェクトが返されます。例えば、次のようになります。

   ```
   {
       "Response": "{\"Role\": \"arn:aws:iam::{{123456789012}}:role/{{my-user-role}}\",\"HomeDirectory\": \"/${transfer:HomeBucket}/\"}",
       "StatusCode": 200,
       "Message": "",
       "Url": "https://{{1a2b3c4d5e}}.execute-api.{{us-east-2}}.amazonaws.com/prod/servers/s-{{1234abcd5678efgh0}}/users/{{myuser}}/config"
   }
   ```

   テストが失敗した場合は、API Gateway AWS 管理ポリシーの 1 つを API に使用しているロールに追加します。

## ステップ 5: SFTP 接続とファイル転送をテストする
<a name="test-sftp-connection"></a>

**SFTP 接続をテストするには**

1. Linux または macOS の場合、コマンドターミナルを開きます。

1. 認証にパスワードまたはキーペアのどちらを使用すかに応じて、次のいずれかのコマンドを入力します。
   + パスワードを使用する場合、このコマンドを入力します。

      ` sftp -o PubkeyAuthentication=no {{myuser}}@{{server-ID}}.server.transfer.{{region-code}}.amazonaws.com ` 

     プロンプトが表示されたら、パスワードを入力します。
   +  キーペアを使用する場合、このコマンドを入力します。

     ` sftp -i {{private-key-file}} {{myuser}}@{{server-ID}}.server.transfer.{{region-code}}.amazonaws.com `
**注記**  
これらの `sftp` コマンドには、Transfer Family サーバーが置かれている AWS リージョン のコードを挿入します。たとえば、サーバーが米国東部 (オハイオ) にあるならば「**us-east-2**」を入力します。

1.  `sftp>` プロンプトで、ディレクトリとファイル (`pwd` と `ls`) をアップロード (`put`)、ダウンロード (`get`)、および表示できることを確認します。

## ステップ 6: バケットへのアクセスを制限する
<a name="example-bucket"></a>

特定の Amazon S3 バケットにアクセスできるユーザーを制限できます。次の例は、CloudFormation スタック内およびユーザーについて選択したポリシー内で使用する設定を示しています。

この例では、 CloudFormation スタックに次のパラメータを設定します。
+ [**CreateServer**]: `true`
+ [**UserHomeDirectory**]: `/amzn-s3-demo-bucket1`
+ [**UserName**]: `myuser`
+ [**UserPassword**]: `MySuperSecretPassword`
**重要**  
これはパスワードの例です。API Gateway メソッドを設定する際には、必ず強力なパスワードを入力してください。
+ [**UserPublicKey1**]: `{{your-public-key}}`
+ [**UserRoleArn**]: `arn:aws:iam::{{role-id}}:role/myuser-api-gateway-role`

`` [**UserPublicKey1**] は、パブリックキーとプライベートキーのペアの一部として生成されたパブリックキーです。

`{{role-id}}` は、作成するユーザーロールに固有です。`myuser-api-gateway-role` にアタッチされるポリシーは次のとおりです。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:PutObjectAcl",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

 SFTP を使用してサーバに接続するには、プロンプトで次のいずれかのコマンドを入力します。
+ パスワードで認証する場合、次のコマンドを実行します。

   ` sftp -o PubkeyAuthentication=no {{myuser}}@{{transfer-server-ID}}.server.transfer.{{region-id}}.amazonaws.com` 

  プロンプトが表示されたら、パスワードを入力します。
+  キーペアで認証する場合、次のコマンドを実行します。

  ` sftp -i {{private-key-file}} myuser@{{transfer-server-ID}}.server.transfer.{{region-id}}.amazonaws.com `

**注記**  
これらの`sftp`コマンドでは、Transfer Family サーバー AWS リージョン がある の ID を使用します。たとえば、サーバーが米国東部 (オハイオ) にあるならば「`us-east-2`」を使用します。

 `sftp` プロンプトで、ホームディレクトリに誘導され、`pwd` コマンドを実行することによってそれを表示できます。例: 

```
sftp> pwd
Remote working directory: /amzn-s3-demo-bucket1
```

ユーザーは、ホームディレクトリよりも上位のディレクトリを表示できません。例: 

```
sftp> pwd
Remote working directory: /amzn-s3-demo-bucket1
sftp> cd ..
sftp> ls
Couldn't read directory: Permission denied
```

## Amazon EFS を使用する場合に Lambda を更新する
<a name="lambda-posix"></a>

 Transfer Family サーバーのストレージオプションとして Amazon EFS を選択した場合、スタックの lambda 関数を編集する必要があります。

**Lambda 関数に Posix プロファイルを追加するには**

1. Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) を開きます。

1.  先ほど作成した Lambda 関数を選択します。Lambda 関数の形式は **{{stack-name}}-GetUserConfigLambda-{{lambda-identifier}}** であり、ここで {{stack-name}} は CloudFormation スタック名、{{lambda-identifier}} は関数の ID です。

1.  [**Code**] (コード) タブで **index.js** を選択して関数のコードを表示します。

1.  `response` で `Policy` と `HomeDirectory` の間に次の行を追加します。

    ` PosixProfile: {"Uid": {{uid-value}}, "Gid": {{gid-value}}}, ` 

    {{uid-value}} と {{gid-value}} はそれぞれユーザー ID とグルー ID を表す 0 以上の整数です。

   たとえば、Posix プロファイルを追加すると、レスポンスフィールドは次のようになります。

   ```
    response = {
         Role: 'arn:aws:iam::123456789012:role/api-gateway-transfer-efs-role', // The user will be authenticated if and only if the Role field is not blank
         Policy: '', // Optional JSON blob to further restrict this user's permissions
         PosixProfile: {"Gid": 65534, "Uid": 65534},
         HomeDirectory: '/fs-fab2c234' // Not required, defaults to '/'
       };
   ```