プライベート VPC 内で Secrets Manager シークレットをローテーションするにはどうすればよいですか?
Amazon Virtual Private Cloud (Amazon VPC) 内の AWS サービスの AWS Secrets Manager シークレットをローテーションしようとしました。しかし、操作が失敗し、Amazon CloudWatch Logs には AWS Lambda タスクがタイムアウトしたことが表示されています。
簡単な説明
AWS Secrets Manager は、Amazon VPC プライベートサブネットで実行されている AWS サービスのシークレットをローテーションできません。これは、これらのサブネットがインターネットアクセスを持っていないためです。
解決策
重要: 始める前に、AWS コマンドラインインターフェイス (AWS CLI) のインストールと設定が済んでいることを確認してください。
注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
次の手順に従って Amazon VPC インターフェイスエンドポイントを構成し、Secrets Manager の Lambda 関数とプライベート Amazon Relational Database Service (Amazon RDS) インスタンスにアクセスします。次の例では、vpc-0abb11f5a28a8abe7 という名前の Amazon VPC 内のプライベート Aurora RDS インスタンスを使用しています。
Secrets Manager VPC エンドポイント、RDS インスタンス、Lambda ローテーション関数用のセキュリティグループを作成する
AWS CLI を使用して セキュリティグループ (SG) の作成手順を実行します。
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.(オプション) RDS インスタンス用の SG を作成します。
注: RDS インスタンスがデフォルトのセキュリティグループのみを使用する場合、この手順が必要です。
$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name RDSInstanceSG --description "RDS Instance SG" { "GroupId": "sg-rds-instance" }
Amazon VPC エンドポイントと 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.RDS インスタンス用のセキュリティグループを構成し、Lambda 関数のセキュリティグループからのインバウンド接続を許可します。
注:
- your-rds-security-groupを、SG (既存の SG またはオプションの RDS インスタンス SG のいずれか) で置き換えてください。
- your-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 インスタンス用セキュリティグループを作成した場合は、RDS インスタンスの構成を変更します。
注: your-existing-rds-security-groups は、RDS インスタンスにアタッチされた、実際の単一または複数のグループで置き換えます。
$ 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 を、AWS リージョンと RDS インスタンスで使用されるサブネット 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 のローテーション関数は非同期でバックグラウンドで実行されます。ローテーション関数の完了には数分かかる場合があります。
- 言語
- 日本語
