非対応データベースのために AWS Secrets Manager シークレットのローテーション関数を作成するにはどうすればよいですか?

最終更新日: 2020 年 10 月 19 日

他のデータベースまたはサードパーティーサービスの AWS Secrets Manager シークレットをローテーションする、AWS Lambda 関数の作成方法を教えてください。

簡単な説明

Amazon Relational Database Service (Amazon RDS) でサポートされるデータベースと他の AWS サポートサービスで作成された Secrets Manager のシークレットは、Lambda ローテーションを自動的に作成します。サポートされていない AWS データベースとサービスの場合は、Lambda 関数を手動で作成できます。

解決方法

汎用ローテーション関数テンプレートを使用してシークレットをローテーションします。別のデータベースまたはサービスのシークレットのローテーションを有効にする前に、Lambda ローテーション関数用のコードを作成する必要があります。

重要:

汎用ローテーション関数テンプレートに基づいて AWS CloudFormation 変更セットを作成する

これらの値に対して AWS CLI コマンド、create-cloud-formation-change-set を実行します。

--stack-name: 変更セットの作成対象である AWS CloudFormation スタックの名前です。

--parameter-override: お使いのリージョンの AWS Secrets Manager リージョンエンドポイントと、テンプレートが作成する Lambda ローテーション関数の名前です。

aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate --stack-name MyLambdaCreationStack --parameter-overrides Name=endpoint,Value=https://secretsmanager.REGION.amazonaws.com Name=functionName,Value=MySecretsManagerRotationFunction --capabilities CAPABILITY_IAM CAPABILITY_RESOURCE_POLICY

注: arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate の Amazon リソースネーム (ARN) を表示のとおり正確に使用してください。

テンプレート用に AWS CloudFormation 変更セットが作成されます。AWS CloudFormation スタックの名前は Aws-serverless-repository- で始まり、スタックステータスコードREVIEW_IN_PROGRESS に設定されます。

変更セットを使用してスタックを更新する

create-cloud-formation-change-set コマンドは、ApplicationIdChangeSetIdSemanticVersion、および StackId を返します。スタックのステータスを更新するには、ChangeSetIdchange-set-name に提供する必要があります。change-set-name は出力を生成せず、スタックのステータスコードを CREATE_COMPLETE に変更します。AWS CloudFormation スタックは、Lambda 関数と、 必要なアクセス権限を持つ Lambda 関数にアタッチされた IAM ロールを作成します。

以下の AWS CLI コマンドを実行します。

aws cloudformation execute-change-set --change-set-name arn:aws:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE

Lambda 関数が作成されたかを検証する

以下の AWS CLI コマンドを実行します。

aws lambda list-functions

Output
{
    ...
    "FunctionName": "MySecretsManagerRotationFunction",
    ...
    "FunctionArn": "arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction",
    ... 
}

注意: Lambda 関数の名前は、--parameter-overrides で指定した関数名の値です。

Amazon Virtual Private Cloud (Amazon VPC) へアクセスするための Lambda 関数を設定する

データベースまたはサービスが Amazon VPC に存在する場合は、次のような update-function-configuration コマンドを実行します。update-function-configuration コマンドは、VPC 内で実行する Lambda ローテーション関数を設定します。VPC サブネット ID とセキュリティグループ ID を必ず指定してください。詳細については、VPC 内のリソースにアクセスするための Lambda 関数の設定を参照してください。

注意: データベースまたはサービスが Amazon VPC に存在しない場合は、この手順をスキップします。

$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-0aed64f81acc4c037

Secrets Manager サービスの VPC エンドポイントを作成する

データベースまたはサービス、および Lambda ローテーション関数がある VPC にインターネットアクセスがない場合は、VPC に Secrets Manager 用のプライベートサービスエンドポイントを設定します。これによって、ローテーション関数が VPC 内のエンドポイントで Secrets Manager にアクセスできるようになります。次のような create-vpc-endpoint コマンドを実行します。

注意: お使いのデータベースまたはサービスが Amazon VPC 内に格納されていない場合は、このステップを省略してください。

$ aws ec2 create-vpc-endpoint --vpc-id  vpc-0abb11f5a28a8abe7 --vpc-endpoint-type Interface \
--service-name com.amazonaws.your-region.secretsmanager  --subnet-ids subnet-076c28105d486f3bd subnet-0af00c796ccdc725f \
--security-group-ids sg-0bacf4bbed67e4df5

Lambda 関数とデータベースまたはサービス間のネットワーク接続をセットアップする

Lambda 関数が、必要なネットワークポートを介してデータベースまたはサービスにルーティングできることを確認します。これはデータベースまたはサービス、およびそれに関連付けられている VPC 設定によって異なります。

注意: お使いのデータベースまたはサービスが Amazon VPC 内に格納されていない場合は、このステップを省略してください

ユースケースに合わせてローテーション関数をカスタマイズする

ローテーションテンプレートは、createSecret ステップと finishSecret ステップを実装します。setSecret ステップと testSecret ステップでは、ユースケースとデータベースに合わせて手動で実装する必要があります。詳細については、Lambda ローテーション関数のステップを参照してください。

シークレットのローテーションを有効にする

--rotation-rules および AutomaticallyAfterDays の各パラメーターを使って、ローテーションの間隔の日数を指定します。

aws secretsmanager rotate-secret --secret-id production/MyAwesomeAppSecret --rotation-lambda-arn arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction --rotation-rules AutomaticallyAfterDays=7