プライベート VPC で AWS Secrets Manager シークレットをローテーションするにはどうすればよいですか?

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

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 RDS インスタンスにアクセスします。次の例では、vpc-0abb11f5a28a8abe7 という名前の Amazon VPC のプライベート Aurora RDS インスタンスを使用しています。

重要:

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-0bacf4bbed67e4df5"
}

2.    Lambda ローテーション関数のセキュリティグループ:

$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name LambdaFunctionSG --description "Lambda Rotation Function SG"
{
    "GroupId": "sg-0aed64f81acc4c037"
}

3.    (オプション) Amazon RDS インスタンスのセキュリティグループを作成します。

注意: このステップは、RDS インスタンスがデフォルトのセキュリティグループのみを使用する場合に必要です。

$ aws ec2 create-security-group --vpc-id vpc-0abb11f5a28a8abe7 --group-name RDSInstanceSG --description "RDS Instance SG"
{
    "GroupId": "sg-0d06795dffa052563"
}

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-0bacf4bbed67e4df5 --protocol tcp --port 443 --cidr 10.0.0.0/16

セキュリティグループを 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-0d06795dffa052563 your-existing-rds-security-groups

2.    手順に従って、次のような Lambda 関数の設定を更新します。

Secrets Manager サービスの Amazon VPC インターフェイスエンドポイントを作成して、セキュリティグループに関連付ける

手順に従って、次のようなインターフェイスエンドポイントを作成します。

注意 : your-region を、RDS インスタンスに使用されている AWS リージョンとサブネット ID に置き換えます。

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

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