他のデータベースまたはサードパーティーサービスの 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 コマンドは、ApplicationId、ChangeSetId、SemanticVersion、および StackId を返します。スタックのステータスを更新するには、ChangeSetId を change-set-name に提供する必要があります。change-set-name は出力を生成せず、スタックのステータスコードを CREATE_COMPLETE に変更します。AWS CloudFormation スタックは、Lambda 関数と、必要な許可を持つ Lambda 関数にアタッチされた IAM ロールを作成します。
次のような AWS CLI コマンド execute-change-set を実行します。
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 にプライベートサービスエンドポイントを設定し、VPC 内のエンドポイントでローテーション関数をオンにします。次のような 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 ステップでは、ユースケースとデータベースに合わせて手動で実装する必要があります。詳細については、「ローテーションの仕組み」を参照してください。
シークレットのローテーションをオンにする
--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
詳細については、「AWS Secrets Manager シークレットのローテーション」を参照してください。
関連情報
AWS Secrets Manager ローテーション関数のテンプレート
How to connect to AWS Secrets Manager service within a Virtual Private Cloud (仮想プライベートクラウド内で AWS Secrets Manager サービスに接続する方法)