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 のローテーション関数は非同期でバックグラウンドで実行されます。ローテーション関数の完了には数分かかる場合があります。