

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

# の交代ユーザーローテーションを設定する AWS Secrets Manager
<a name="tutorials_rotation-alternating"></a>

このチュートリアルでは、データベース認証情報を含むシークレットに対して、交代ユーザーローテーションを設定する方法について学びます。*交代ユーザーローテーション*とは、Secrets Manager がユーザーのクローンを作成し、ユーザーの認証情報を交代で更新するローテーション戦略です。この戦略は、シークレットの高可用性が必要な場合に適しています。これは、代替ユーザーの 1 人がデータベースへの現在の認証情報を保持し、もう 1 人が更新されているためです。詳細については、「[ローテーション戦略: 交代ユーザー](rotation-strategy.md#rotating-secrets-two-users)」を参照してください。

交代ユーザーローテーションを設定するには、次の 2 つのシークレットが必要です。
+ ローテーションさせたい認証情報を持つ 1 つのシークレット。
+ 管理者認証情報を持つ 2 番目のシークレット。

  このユーザーには、最初のユーザーのクローンを作成し、最初のユーザーのパスワードを変更する権限があります。このチュートリアルでは、Amazon RDS で管理者ユーザー用にこのシークレットを作成します。Amazon RDS は、管理者パスワードのローテーションも管理します。詳細については、「[AWS Secrets Manager シークレットのマネージドローテーション](rotate-secrets_managed.md)」を参照してください。

このチュートリアルの最初の部分では、現実的な環境をセットアップします。ローテーションの仕組みをご覧いただくため、このチュートリアルでは Amazon RDS MySQL データベースの例を使用します。セキュリティのため、データベースはインバウンドのインターネットアクセスを制限する VPC 内にあります。お使いのローカルコンピュータからインターネット経由でこのデータベースに接続するときは、このデータベースに接続できるが、インターネット経由での SSH 接続も可能な VPC 内のサーバー、*踏み台ホスト*を使用します。このチュートリアルで使用する踏み台ホストは Amazon EC2 インスタンスであり、このインスタンスのセキュリティグループでは、他のタイプの接続は禁止されています。

チュートリアルを終了したら、チュートリアルからリソースをクリーンアップすることをお勧めします。本番環境では使用しないでください。

Secrets Manager のローテーションでは、 AWS Lambda 関数を使用してシークレットとデータベースを更新します。Lambda 関数を使用する場合のコストについては、「[料金](intro.md#asm_pricing)」を参照してください。

**Topics**
+ [アクセス許可](#tutorials_rotation-alternating-permissions)
+ [前提条件](#tutorials_rotation-alternating-step-setup)
+ [ステップ 1: Amazon RDS データベースユーザーを作成する](#tutorials_rotation-alternating-step-database)
+ [ステップ 2: ユーザーの認証情報用のシークレットを作成する](#tutorials_rotation-alternating_step-rotate)
+ [ステップ 3: ローテーションされたシークレットをテストする](#tutorials_rotation-alternating_step-test-secret)
+ [ステップ 4: リソースをクリーンアップする](#tutorials_rotation-alternating_step-cleanup)
+ [次の手順](#tutorials_rotation-alternating_step-next)

## アクセス許可
<a name="tutorials_rotation-alternating-permissions"></a>

このチュートリアルの前提条件として、 AWS アカウントの管理者権限が必要となります。本番稼働環境では、各ステップで異なるロールを使用するのがベストプラクティスとなります。例えば、Amazon RDS データベースの作成にはデータベース管理者権限を持つロールを使用し、VPC とセキュリティグループの設定にはネットワーク管理者権限を持つロールを使用します。チュートリアルの各ステップでは同じアイデンティティを使用することが推奨されます。

本番稼働環境で許可を設定する方法については、「[の認証とアクセスコントロール AWS Secrets Manager](auth-and-access.md)」を参照してください。

## 前提条件
<a name="tutorials_rotation-alternating-step-setup"></a>

**Topics**
+ [前提条件 A: Amazon VPC](#tutorials_rotation-alternating-step-vpc)
+ [前提条件 B: Amazon EC2 インスタンス](#tutorials_rotation-alternating-step-setup_ec2)
+ [前提条件 C: Amazon RDS データベースと、管理者認証情報の Secrets Manager シークレット](#tutorials_rotation-alternating-step-database)
+ [前提条件 D: ローカル コンピューターが EC2 インスタンスに接続できるようにする](#tutorials_rotation-alternating-step-ec2connect)

### 前提条件 A: Amazon VPC
<a name="tutorials_rotation-alternating-step-vpc"></a>

このステップでは、Amazon RDS データベースと Amazon EC2 インスタンスを起動できる VPC を作成します。後のステップで、コンピューターを使用してインターネット経由で踏み台に接続し、データベースに接続するため、VPC からのトラフィックを許可する必要があります。これを行うために、Amazon VPC はインターネットゲートウェイを VPC にアタッチし、ルートテーブルにルートを追加して、VPC の外部に向かうトラフィックがインターネットゲートウェイに送信されるようにします。

VPC 内で、Secrets Manager エンドポイントと Amazon RDS エンドポイントを作成します。後のステップで自動ローテーションを設定すると、Secrets Manager は VPC 内に Lambda ローテーション関数を作成して、データベースにアクセスできるようにします。また、Lambda ローテーション関数は Secrets Manager を呼び出してシークレットを更新し、Amazon RDS を呼び出してデータベース接続情報を取得します。VPC 内にエンドポイントを作成することで、Lambda 関数から Secrets Manager と Amazon RDS への呼び出しが AWS インフラストラクチャを離れないようにします。代わりに、VPC 内のエンドポイントにルーティングされます。

**VPC を作成するには**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

1. **[Create VPC（VPC の作成）]** を選択します。

1. **[VPC の作成]** ページで、**[VPC など]** を選択します。

1. **[名前タグの自動生成]** で、**[自動生成]** に **SecretsManagerTutorial** と入力します。

1. **DNS オプションでは**、**Enable DNS hostnames** と **Enable DNS resolution** の両方を選択します。

1. **[Create VPC（VPC の作成）]** を選択します。

**VPC 内に Secrets Manager エンドポイントを作成するには**

1. Amazon VPC コンソールの **[エンドポイント**] 下で、**[エンドポイントの作成]** を選択します。

1. **[Endpoint Settings]** (エンドポイントの設定) の **[Name]** (名前) に **SecretsManagerTutorialEndpoint** と入力します。

1. **[Services]** (サービス) で **secretsmanager** と入力して、リストをフィルタリングし、 AWS リージョンで Secrets Manager エンドポイントを選択します。米国東部 (バージニア北部) であれば、`com.amazonaws.us-east-1.secretsmanager` を選択します。

1. **[VPC]** で、**vpc\$1\$1\$1\$1 (SecretsManagerTutorial)** を選択します。

1. **[Subnets]** (サブネット) で、すべての **[Availability Zones]** (アベイラビリティーゾーン) を選択し、各アベイラビリティーゾーンに **[Subnet ID]** (サブネット ID) を挿入します。

1. **[IP address type]** (IP アドレスタイプ) で、**IPv4** を選択します。

1. **[Security groups]** (セキュリティグループ) で、デフォルトのセキュリティグループを選択します。

1. **[Policy type]** (ポリシーの種類) で、**Full access** を選択します。

1. **エンドポイントの作成** を選択します。

**VPC 内に Amazon RDS エンドポイントを作成するには**

1. Amazon VPC コンソールの **[エンドポイント**] 下で、**[エンドポイントの作成]** を選択します。

1. **[Endpoint Settings]** (エンドポイントの設定) の **[Name]** (名前) に **RDSTutorialEndpoint** と入力します。

1. **[Services]** (サービス) で、**rds** と入力してリストをフィルタリングし、 AWS リージョンで Amazon RDS エンドポイントを選択します。米国東部 (バージニア北部) であれば、`com.amazonaws.us-east-1.rds` を選択します。

1. **[VPC]** で、**vpc\$1\$1\$1\$1 (SecretsManagerTutorial)** を選択します。

1. **[Subnets]** (サブネット) で、すべての **[Availability Zones]** (アベイラビリティーゾーン) を選択し、各アベイラビリティーゾーンに **[Subnet ID]** (サブネット ID) を挿入します。

1. **[IP address type]** (IP アドレスタイプ) で、**IPv4** を選択します。

1. **[Security groups]** (セキュリティグループ) で、デフォルトのセキュリティグループを選択します。

1. **[Policy type]** (ポリシーの種類) で、**Full access** を選択します。

1. **エンドポイントの作成** を選択します。

### 前提条件 B: Amazon EC2 インスタンス
<a name="tutorials_rotation-alternating-step-setup_ec2"></a>

後のステップで作成する Amazon RDS データベースは VPC にあるため、それにアクセスするには踏み台ホストが必要です。踏み台ホストも VPC 内にありますが、後のステップで、セキュリティグループを構成して、ローカルコンピューターが SSH で踏み台ホストに接続できるようにします。

**踏み台ホストの EC2 インスタンスを作成するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. **[Instances]** (インスタンス) を選択し、**[Launch instance]** (インスタンスの作成) を選択します。

1. **[Name and tags]** (名前とタグ) の、**[Name]** (名前) で、**SecretsManagerTutorialInstance** と入力します。

1. **[アプリケーションと OS イメージ]** で、デフォルトの **Amazon Linux 2 AMI (HMV) Kernel 5.10** をそのまま使用します。

1. **[インスタンス タイプ]** で、デフォルトの **t2.micro** をそのまま使用します。

1. **[Key pair]** (キーペア) で **[Create key pair]** (キーペアの作成) を選択します。

   **[キーペア作成]** ダイアログボックスの **[キーペア名]** に **SecretsManagerTutorialKeyPair** を入力し、**[作成]** を選択します。

   キーペアは自動的にダウンロードされます。

1. **[Network settings]** (ネットワーク設定) で、**[Edit]** (編集) を選択し、次の操作を実行します。

   1. VPCで、**vpc-\$1\$1\$1\$1 SecretsManagerTutorial** を選択します。

   1. **[Auto-assign Public IP]** (自動割り当てパブリック IP) で、**Enable** を選択します。

   1. **[Firewall]** (ファイアウォール) の **既存のセキュリティグループ** を選択します。

   1. **[Common security groups]** (共通のセキュリティグループ) で、**default** を選択します。

1. **[インスタンスを起動]** を選択します。

### 前提条件 C: Amazon RDS データベースと、管理者認証情報の Secrets Manager シークレット
<a name="tutorials_rotation-alternating-step-database"></a>

このステップでは、Amazon RDS MySQL データベースを作成し、Amazon RDS が管理者認証情報を含むシークレットを作成するように設定します。次に、Amazon RDS が管理者シークレットのローテーションを自動的に管理します。詳細については、「[マネージドローテーション](rotate-secrets_managed.md)」を参照してください。

データベース作成の一環として、前のステップで作成した踏み台ホストを指定します。次に、Amazon RDS は、データベースとインスタンスが相互にアクセスできるようにセキュリティグループを設定します。インスタンスにアタッチされたセキュリティグループにルールを追加して、ローカルコンピューターもインスタンスに接続できるようにします。

**管理者認証情報を含む Secrets Manager シークレットを使用して Amazon RDS データベースを作成するには**

1. Amazon RDS コンソールで、**[Databases]** (データベース) を選択します。

1. **[Engine options]** (エンジンオプション) セクションで、**エンジンタイプ**として **MySQL** を選択します。

1. **[Templates]** (テンプレート) セクションで、**Free tier** を選択します。

1. **[Settings]** (設定) セクションで、以下の手順を実行します:

   1. **[DB instance identifier]** (DB インスタンス識別子) に**SecretsManagerTutorial** と入力します。

   1. **認証情報設定**で、 **でマスター認証情報を管理する AWS Secrets Manager**を選択します。

1. **[Connect]** (接続) セクションの **[Computer resource]** (コンピューターリソース) で、**[EC2 computer resource]** を選択し、**[EC2 インスタンス]** (EC2 コンピュータリソースに接続) で **SecretsManagerTutorialInstance** を選択します。

1. **[データベースの作成]** を選択します。

### 前提条件 D: ローカル コンピューターが EC2 インスタンスに接続できるようにする
<a name="tutorials_rotation-alternating-step-ec2connect"></a>

このステップでは、前提条件 B で作成した EC2 インスタンスを構成して、ローカルコンピューターが EC2 インスタンスに接続できるようにします。これを行うには、Amazon RDS が Prereq C に追加したセキュリティ グループを編集して、コンピューターの IP アドレスが SSH に接続できるようにするルールを含めます。このルールにより、ローカルコンピューター (現在の IP アドレスで識別される) は、インターネット経由で SSH を使用して踏み台ホストに接続できます。

**ローカルコンピューターが EC2 インスタンスに接続できるようにするには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. EC2 インスタンスの **[SecretsManager TutorialInstance]** (セキュリティマネージャー チュートリアルインスタンス) の **[Security]** (セキュリティ) タブの **[Security groups]** (セキュリティグループ) で、**sg-\$1\$1\$1 (ec2-rds-X)** を選択します。

1. **[Input rules]** (インプットルール) で、**[Edit inbound rules]** (インバウンドルールを編集) を選択します。

1. **[Add rule]** (ルールを追加) を選択し、次の操作を行います。

   1. **[Type]** (タイプ) で、**SSH** を選択します。

   1. **[Source type]** (ソースタイプ) で **My IP** を選択します。

## ステップ 1: Amazon RDS データベースユーザーを作成する
<a name="tutorials_rotation-alternating-step-database"></a>

まず、シークレットにその認証情報を保存するユーザーが必要になります。ユーザーを作成するには、管理者の認証情報を使用して Amazon RDS データベースにログインします。簡単にするために、このチュートリアルでは、データベースへの完全なアクセス許可を持つユーザーを作成します。運用環境では、これは一般的ではないため、最小権限の原則に従うことをお勧めします。

データベースに接続するには、MySQL クライアントツールを使用します。このチュートリアルでは、GUI ベースのアプリケーション、MySQL Workbench を使用します。MySQL Workbench のインストール方法については、[「Download MySQL Workbench」](http://dev.mysql.com/downloads/workbench/)を参照してください。

データベースに接続するには、MySQL Workbench で接続構成を作成します。設定には、Amazon EC2 と Amazon RDS の両方からの情報が必要です。

**MySQL Workbench でデータベースの接続を設定するには**

1. MySQL Workbench で、**[MySQL Connections]** (MySQL 接続) の横にある (\$1) ボタンをクリックします。

1. **[Setup New Connection]** (新しい接続の設定) ダイアログボックスで、次を実行します。

   1. **[Connection Name]** (接続名) に、**SecretsManagerTutorial** と入力します。

   1. **[Connection method]** (接続方法) で、**Standard TCP/IP over SSH** を選択します。

   1. **[Parameters]** (パラメータ) タブで、次を実行します。

      1. **[SSH Hostname]** (SSH ホスト名) に、Amazon EC2 インスタンスのパブリック IP アドレスを入力します。

         この IP アドレスは、インスタンス **[SecretsManagerTutorialInstance]** を選択すると、Amazon EC2 コンソールに表示されます。**[Public IPv4 DNS]** の下に表示された IP アドレスをコピーします。

      1. **[SSH Username]** (SSH ユーザーネーム) に、**ec2-user** と入力します。

      1. **[SSH Keyfile]** (SSH キーファイル) で、前回の前提条件でダウンロードしたキーペアファイル **[SecretsManagerTutorialKeyPair.pem]** を選択します。

      1. **[MySQL Hostname]** (MySQL ホスト名) に、Amazon RDS エンドポイントアドレスを入力します。

         このエンドポイントアドレスは、データベースインスタンス **[secretsmanagertutorialdb]** を選択すると、Amazon RDS コンソールに表示されます。**[Endpoint]** (エンドポイント) の下に表示されたアドレスをコピーします。

      1. **[Username]** (ユーザーネーム) に、**admin** と入力します。

   1. [**OK**] を選択してください。

**管理者パスワードを取得するには**

1. Amazon RDS コンソールで、データベースに移動します。

1. **[Configuration]** (設定) タブの **[Master Credentials ARN]** (マスター認証情報 ARN)で、**[Manage in Secrets Manager]** (Secrets Managerの管理) を選択します。

   Secrets Manager コンソールが開きます。

1. シークレットの詳細ページで、**[Retrieve secret value]** (シークレット値の取得) を選択します。

1. パスワードは **[Secret value]** (シークレット値) セクションに表示されます。

**データベースユーザーを作成するには**

1. MySQL Workbench で、接続 **[SecretsManagerTutorial]** を選択します。

1. シークレットから取得した管理者パスワードを入力します。

1.  MySQL Workbenchの**[Query]** (クエリ) ウィンドウで、次のコマンド (強力なパスワードを含む) を入力し、**[Execute]** (実行) を選択します。ローテーション関数は SELECT を使用して更新されたシークレットをテストするため、**appuser** には少なくともその権限が必要です。

   ```
   CREATE DATABASE myDB;
   CREATE USER 'appuser'@'%' IDENTIFIED BY 'EXAMPLE-PASSWORD';
   GRANT SELECT ON myDB . * TO 'appuser'@'%';
   ```

   **[Output]** (出力) ウィンドウに、コマンドが実行されたことが表示されます。

## ステップ 2: ユーザーの認証情報用のシークレットを作成する
<a name="tutorials_rotation-alternating_step-rotate"></a>

次に、いま作成したユーザーの認証情報を保存するための、シークレットを作成します。これが、後ほどローテーションするシークレットです。自動ローテーションをオンにし、交代ユーザー戦略を指定するために、1 人目のユーザーのパスワードを変更する権限を持った、別のスーパーユーザーのシークレットを選択します。

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

1. **[Store a new secret]** (新しいシークレットを保存する) を選択します｡

1. [**Choose secret type**] (シークレットタイプを選択する) ページで、次の操作を行います。

   1. **[Secret type]** (シークレットタイプ) で、**[Credentials for Amazon RDS database]** (Amazon RDS データベースの認証情報) を選択します。

   1. **[Credentials]** (認証情報) で、ユーザーネーム **appuser** と、MySQL Workbench を使って作成したデータベースユーザー向けに入力したパスワードを入力します。

   1. **[Database]** (データベース) で、**secretsmanagertutorialdb** を選択します。

   1. [**次へ**] を選択します。

1. **[Configure secret]** (シークレットを設定する) ページで、**[Secret name]** (シークレット名) に **SecretsManagerTutorialAppuser** と入力し、**[Next]** (次) を選択します。

1. **[Configure Routing**] (ローテーションを設定する) ページで、以下を実行します。

   1. **[Automatic rotation]** (自動ローテーション) を有効化します。

   1. **[Rotation schedule]** (ローテーションスケジュール) で、**[Days]** (日数) のスケジュールを設定します: **[Duration]** (期間) の **2** 日間: **2h**。**[Rotate immediately]** (すぐにローテーションする) は選択したままにしておきます。

   1. **[Rotation function]** (ローテーション関数) で **[Create a rotation function]** (ローテーション関数を作成) を選択し、[Function Name] (関数名) に **tutorial-alternating-users-rotation** と入力します。

   1. **[ローテーション戦略]** で **[代替ユーザー]** を選択し、**[管理者認証情報シークレット]** で **rds\$1cluster...** という名前のシークレットを選択します。これには、このチュートリアル **secretsmanagertutorial** で作成したデータベースの名前を含む **[説明]** が含まれています (例: `Secret associated with primary RDS DB instance: arn:aws:rds:Region:AccountId:db:secretsmanagertutorial`)。

   1. [**次へ**] を選択します。

1. **[Review]** (確認) ページで **[Store]** (保存) を選択します。

   Secrets Manager はシークレットの詳細ページに戻ります。ローテーション設定のステータスは、ページの上部で確認できます。Secrets Manager では、Lambda ローテーション関数や Lambda 関数を実行する実行ロールなどのリソースを作成するときは CloudFormation を使用します。CloudFormation が終了すると、バナーが**ローテーションが予定されているシークレット**に切り替わります。これで、最初のローテーションは完了です。

## ステップ 3: ローテーションされたシークレットをテストする
<a name="tutorials_rotation-alternating_step-test-secret"></a>

シークレットがローテーションされたので、シークレットに有効な新しい認証情報が含まれていることを確認できます。シークレット内のパスワードが、元の認証情報から変更されました。

**シークレットから新しいパスワードを取得するには**

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

1. **[Secrets]** (シークレット) を選択し、シークレット **SecretsManagerTutorialAppuser** を選択します。

1. **[Secret details]** (シークレットの詳細) ページで、下へスクロールし、**[Retrieve secret value]** (シークレットの値を取得する) を選択します。

1. **[Key/value]** (キー/バリュー) テーブルで、**password** の**シークレットの値**をコピーします。

**認証情報をテストするには**

1. MySQL ワークベンチで、接続 **[SecretsManagerTutorial]** を右クリックし、**[Edit Connection]** (接続を編集) を選択します。

1. **[Manage Server Connections]** (サーバー接続を管理) ダイアログボックスで、**[Username]** (ユーザーネーム) に **appuser** と入力し、**[Close]** (閉じる) を選択します。

1. MySQL Workbench に戻り、接続 **[SecretsManagerTutorial]** を選択します。

1. **[Open SSH Connection]** (SSH 接続を開く) ダイアログボックスで、シークレットから取得したパスワードを **[Password]** (パスワード) に貼り付けて、**[OK]** をクリックします。

   認証情報が有効であれば、MySQL Workbench でデータベースの設計ページが開きます。

こちらは、シークレットのローテーションが完了したことを示しています。シークレット内の認証情報が更新されます。これが、データベースに接続するための有効なパスワードとなります。

## ステップ 4: リソースをクリーンアップする
<a name="tutorials_rotation-alternating_step-cleanup"></a>

別のローテーション戦略であるシングルユーザーローテーションを試したい場合は、リソースのクリーンアップをスキップして [のシングルユーザーローテーションを設定する AWS Secrets Manager](tutorials_rotation-single.md) に進みます。

それ以外の場合は、潜在的な課金を回避し、インターネットにアクセスできる EC2 インスタンスを削除するために、このチュートリアルで作成した次のリソースとその前提条件を削除します。
+ Amazon RDS データベースインスタンス。手順については、「Amazon RDS ユーザーガイド」の「[DB インスタンスの削除](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html)」を参照してください。
+ Amazon EC2 インスタンス。手順については、「*Amazon EC2 ユーザーガイド*」の「[インスタンスの終了](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)」を参照してください。
+ Secrets Manager シークレット `SecretsManagerTutorialAppuser`。手順については、「[AWS Secrets Manager シークレットを削除する](manage_delete-secret.md)」を参照してください。
+ Secrets Manager エンドポイント。手順については、AWS PrivateLink ガイドの「[VPC エンドポイントを削除する](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-vpc-endpoint.html)」を参照してください。
+ VPC エンドポイント 手順については、AWS PrivateLink ガイドの[「VPC の削除」](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#VPC_Deleting)を参照してください。

## 次の手順
<a name="tutorials_rotation-alternating_step-next"></a>
+ [アプリケーションでシークレットを取得する方法](retrieving-secrets.md)について説明します。
+ [その他のローテーションスケジュール](rotate-secrets_schedule.md)について説明します。