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 データベースシークレットのテンプレートを提供します。
ローテーション関数コードを記述する
-
次のいずれかを行います。
ローテーション関数テンプレートのリストを確認します。サービスとローテーション戦略に一致するものがある場合は、コードをコピーします。
その他のタイプのシークレットについては、独自のローテーション関数を記述します。手順については、Lambda ローテーション関数 を参照してください。
必要な依存関係と共にファイルを ZIP ファイル (
my-function.zip
) として保存します。
ステップ 2 : Lambda 関数を作成する
このステップでは、ステップ 1 で作成した ZIP ファイルを使用して Lambda 関数を作成します。関数が呼び出されたときに Lambda が引き受けるロール (Lambda 実行ロール) も設定します。
Lambda ローテーション関数と実行ロールを作成するには
Lambda 実行ロールの信頼ポリシーを作成した後に JSON ファイルとして保存します。詳細情報と例については、「AWS Secrets Manager における Lambda 関数の実行ロールへのアクセス許可」を参照してください。ポリシーは次の条件を満たす必要があります。
ロールがシークレットの Secrets Manager オペレーションを呼び出すことを許可します。
例えば、新しいパスワードを作成するなど、ロールがシークレットが使用するサービスを呼び出すことを許可します。
-
Lambda 実行ロールを作成し、
iam create-role
を呼び出して、以前のステップで作成した信頼ポリシーを適用します。aws iam create-role \ --role-name
rotation-lambda-role
\ --assume-role-policy-document file://trust-policy.json
-
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
-
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-account123456789012
ステップ 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 におけるローテーションのトラブルシューティング」を参照してください。