AWS CLI を使用して自動ローテーションを設定する - AWS Secrets Manager

AWS CLI を使用して自動ローテーションを設定する

このチュートリアルでは、Lambda 関数によるローテーション を使用して、AWS CLI を設定する方法について説明します。シークレットのローテーションを行うと、シークレット、ならびに、そのシークレットのデータベースまたはサービスの認証情報が更新されます。

また、コンソールを使用してローテーションを設定することもできます。データベースシークレットについては、「データベースシークレットの自動ローテーション (コンソール)」を参照してください。他のすべてのタイプのシークレットについては、「非データベースシークレットの自動ローテーション (コンソール)」を参照してください。

AWS CLI を使用してローテーションを設定するには、データベースシークレットをローテーションする場合、最初にローテーション戦略を選択する必要があります。交代ユーザー戦略を選択する場合は、データベースのスーパーユーザーの認証情報を含むシークレットを別途保存する必要があります。次に、ローテーション関数コードを記述します。Secrets Manager には、関数のベースとなるテンプレートが用意されています。コードを使用して Lambda 関数を作成し、Lambda 関数と Lambda 実行ロールの両方にアクセス許可を設定します。次のステップとして、Lambda 関数がネットワーク経由で Secrets Manager とデータベースまたはサービスの両方にアクセスできることを確認する必要があります。最後に、ローテーションのシークレットを設定します。

データベースシークレットの前提条件: ローテーション戦略を選択する

Secrets Manager が提供する戦略の詳細については、「Lambda 関数のローテーション戦略」を参照してください。

オプション 1: 単一ユーザー戦略

単一ユーザー戦略を選択した場合は、ステップ 1 に進むことができます。

オプション 2: ユーザー交代戦略

ユーザー交代戦略を選択した場合は、以下を行う必要があります。

  • シークレットを作成し、データベースのスーパーユーザーの認証情報をその中に保存します。ユーザー交代ローテーションでは、最初のユーザーのクローンが作成されますが、ほとんどのユーザーにはその権限がないため、スーパーユーザーの認証情報を含むシークレットが必要です。

  • スーパーユーザーシークレットの ARN を元のシークレットに追加します。詳細については、「AWS Secrets Manager シークレットの JSON 構造 」を参照してください。

Amazon RDS Proxy は、ユーザー交代戦略をサポートしていないことに注意してください。

ステップ 1: ローテーション関数コードを記述する

シークレットをローテーションするには、ローテーション関数が必要です。ローテーション関数は、Secrets Manager がシークレットをローテーションさせるために呼び出す Lambda 関数です。詳細については、「Lambda 関数によるローテーション」を参照してください。このステップでは、シークレットを更新するコードと、シークレットの対象となるサービスまたはデータベースを記述します。

Secrets Manager は、ローテーション関数のテンプレート で Amazon RDS、Amazon Aurora、Amazon Redshift、Amazon DocumentDB データベースシークレットのテンプレートを提供します。

ローテーション関数コードを記述する
  1. 次のいずれかを行います。

    • ローテーション関数テンプレートのリストを確認します。サービスとローテーション戦略に一致するものがある場合は、コードをコピーします。

    • その他のタイプのシークレットについては、独自のローテーション関数を記述します。手順については、Lambda ローテーション関数 を参照してください。

  2. 必要な依存関係と共にファイルを ZIP ファイル (my-function.zip) として保存します。

ステップ 2 : Lambda 関数を作成する

このステップでは、ステップ 1 で作成した ZIP ファイルを使用して Lambda 関数を作成します。関数が呼び出されたときに Lambda が引き受けるロール (Lambda 実行ロール) も設定します。

Lambda ローテーション関数と実行ロールを作成するには
  1. Lambda 実行ロールの信頼ポリシーを作成した後に JSON ファイルとして保存します。詳細情報と例については、「AWS Secrets Manager における Lambda 関数の実行ロールへのアクセス許可」を参照してください。ポリシーは次の条件を満たす必要があります。

    • ロールがシークレットの Secrets Manager オペレーションを呼び出すことを許可します。

    • 例えば、新しいパスワードを作成するなど、ロールがシークレットが使用するサービスを呼び出すことを許可します。

  2. Lambda 実行ロールを作成し、iam create-role を呼び出して、以前のステップで作成した信頼ポリシーを適用します。

    aws iam create-role \ --role-name rotation-lambda-role \ --assume-role-policy-document file://trust-policy.json
  3. lambda create-function を呼び出して、ZIP ファイルから Lambda 関数を作成します。

    aws lambda create-function \ --function-name my-rotation-function \ --runtime python3.7 \ --zip-file fileb://my-function.zip \ --handler .handler \ --role arn:aws:iam::123456789012:role/service-role/rotation-lambda-role
  4. Lambda 関数にリソースポリシーを設定し、lambda add-permission を呼び出すことで Secrets Manager がそれを呼び出せるようにします。

    aws lambda add-permission \ --function-name my-rotation-function \ --action lambda:InvokeFunction \ --statement-id SecretsManager \ --principal secretsmanager.amazonaws.com \ --source-account 123456789012

ステップ 3: ネットワークアクセスを設定する

詳細については、「Lambda ローテーション関数へのネットワークアクセス」を参照してください。

ステップ 4: シークレットのローテーションを設定する

シークレットの自動ローテーションをオンにするには、rotate-secret を呼び出します。ローテーションスケジュールは cron() または rate() のスケジュール式で設定でき、ローテーション期間を設定できます。詳細については、「ローテーションスケジュール」を参照してください。

aws secretsmanager rotate-secret \ --secret-id MySecret \ --rotation-lambda-arn arn:aws:lambda:Region:123456789012:function:my-rotation-function \ --rotation-rules "{\"ScheduleExpression\": \"cron(0 16 1,15 * ? *)\", \"Duration\": \"2h\"}"

次のステップ

AWS Secrets Manager におけるローテーションのトラブルシューティング」を参照してください。