プライベート VPC で AWS Secrets Manager シークレットをローテーションするにはどうすればよいですか?
最終更新日: 2021 年 6 月 2 日
Amazon Virtual Private Cloud (Amazon VPC) で AWS のサービスの AWS Secrets Manager シークレットをローテーションしようとしました。しかし、処理が失敗し、Amazon CloudWatch Logs は AWS Lambda のタスクがタイムアウトしたことを示しています。
簡単な説明
Secrets Manager は、Amazon VPC プライベートサブネットにインターネットアクセスがないため、これらのサブネットで実行中の AWS のサービスのシークレットをローテーションできません。
解決方法
以下の手順に従って Amazon VPCインターフェイスエンドポイントを設定し、Secrets Manager Lambda 関数とプライベート Amazon Relational Database Service (Amazon RDS) インスタンスにアクセスします。次の例では、vpc-0abb11f5a28a8abe7 という名前の Amazon VPC のプライベート Aurora RDS インスタンスを使用しています。
重要:
- ここでの作業を始める前に、AWS コマンドラインインターフェイス(AWS CLI)の、インストールと設定を完了する必要があります。
- AWS CLI コマンドの実行時にエラーが発生した場合は、使用している AWS CLI を最新のバージョンにしてください。
Secrets Manager VPC エンドポイント、Amazon RDS インスタンス、および Lambda ローテーション関数のセキュリティグループを作成する
AWS CLI を使用してセキュリティグループを作成するには、以下の手順に従います。実行するステップは、次のコマンドのようになります。
1. Secrets Manager Amazon VPC エンドポイントのセキュリティグループ:
注: vpc-id vpc-0abb11f5a28a8abe7 を VPC ID に置き換えます。
$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name SMVPCEndpointSG --description "secretsmanager VPCEndpoint SG"
{
"GroupId": "sg-vpc-endpoint"
}
2. Lambda ローテーション関数のセキュリティグループ:
$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name LambdaFunctionSG --description "Lambda Rotation Function SG"
{
"GroupId": "sg-lambda-function"
}
3. (オプション) Amazon RDS インスタンスのセキュリティグループを作成します。
注: このステップは、RDS インスタンスがデフォルトのセキュリティグループのみを使用する場合に必要です。
$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name RDSInstanceSG --description "RDS Instance SG"
{
"GroupId": "sg-rds-instance"
}
Amazon VPC エンドポイントと Amazon RDS インスタンスセキュリティグループへのルールの追加
1. VPC の CIDR 範囲を取得します。
$ aws ec2 describe-vpcs --vpc-ids vpc-0a05c93c7ef7a8a1c --query 'Vpcs[].CidrBlock' --output text
10.0.0.0/16
2. 次のように、Amazon VPC エンドポイントのセキュリティグループルールを設定し、VPC からのポート 443 でインバウンドトラフィックを許可します。
$ aws ec2 authorize-security-group-ingress --group-id sg-vpc-endpoint --protocol tcp --port 443 --cidr 10.0.0.0/16
3. Lambda 関数セキュリティグループからのインバウンド接続を許可するように RDS インスタンスセキュリティグループを設定します。
注:
- your-rds-security-group をセキュリティグループ (既存のセキュリティグループまたはオプションの RDS インスタンス SG) に置き換えます。
- db-port を、データベースが使用するように設定されているポートに置き換えます。
$ aws ec2 authorize-security-group-ingress --group-id your-rds-security-group --protocol tcp --port your-db-port --source-group sg-lambda-function
セキュリティグループを AWS リソースに添付する
1. オプションの RDS インスタンス SG を作成した場合は、次のように RDS インスタンスの設定を変更します。
注意: your-existing-rds-security-groups を、RDS インスタンスに添付した 1 つ以上のグループに置き換えます。
$ aws rds modify-db-instance --db-instance-identifier your-rds-instance --vpc-security-group-ids sg-rds-instance your-existing-rds-security-groups
2. 手順に従って、次のような Lambda 関数の設定を更新します。
$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-lambda-function
Secrets Manager サービスの Amazon VPC インターフェイスエンドポイントを作成して、セキュリティグループに関連付ける
手順に従って、次のようなインターフェイスエンドポイントを作成します。
注意 : your-region を、RDS インスタンスに使用されている AWS リージョンとサブネット ID に置き換えます。
$ 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-vpc-endpoint
重要: Amazon VPC では、DNS ホスト名と DNS 解決属性が有効となっている必要があります。詳細については、VPC の DNS サポートを表示および更新するをご参照ください。
Secrets Manager がシークレットをローテーションできることを確認する
1. 手順に従って、次のような Secrets Manager シークレットをローテーションします。
注意: your-secret を Secrets Manager シークレットに置き換えます。
$ aws secretsmanager rotate-secret --secret-id your-secret
Secrets Manager が以前のローテーションを再試行します。
注意: パスワードをローテーションする以前の試行は失敗したため、次のような出力が表示されます。
An error occurred (InvalidRequestException) when calling the RotateSecret operation: A previous rotation isn't complete. That rotation will be reattempted.
2. AWS Lambda コンソールで関数をモニタリングします。ローテーションが成功すると、Amazon CloudWatch ログストリームには次のようなエントリが含まれます。
[INFO] 2019-10-22T07:59:32.627Z 96179023-5b67-4e98-a057-885f68bc69f2 finishSecret: Successfully set AWSCURRENT stage to version 175b5e38-341f-4cd0-8c58-2b1e49769642 for secret arn:aws:secretsmanager:your-region:your-account:secret:your-secret
3. Secrets Manager シークレットを取得し、次のように正常にローテーションされたことを確認します。
注意: your-secret-arn を Secrets Manager のシークレット ARN に置き換えます。
aws secretsmanager get-secret-value --secret-id your-secret-arn
注意: Secrets Manager ローテーション関数はバックグラウンドで非同期的に実行され、完了までに数分かかることがあります。