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

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

重要: 始める前に、AWS コマンドラインインターフェイス (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-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"
}

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

重要: Amazon VPC では、DNS ホスト名と DNS 解決属性が有効となっている必要があります。詳細については、「VPC の DNS サポートを表示および更新する」をご参照ください。

Amazon VPC エンドポイントと Amazon RDS インスタンスセキュリティグループへのルールの追加

1.    Amazon VPC エンドポイントのセキュリティグループルールを設定し、ポート 443 で Lambda 関数のセキュリティグループからのインバウンドトラフィックを許可します。

$ aws ec2 authorize-security-group-ingress --group-id sg-0bacf4bbed67e4df5 --protocol tcp --port 443 --source-group sg-0aed64f81acc4c037

2.    Amazon RDS インスタンスのセキュリティグループは、ポート 3306 で Lambda 関数のセキュリティグループからのインバウンド接続を許可します。

注意: your-rds-security-group をセキュリティグループ (既存のセキュリティグループまたはオプションの RDS インスタンス SG) に置き換えます。

$ aws ec2 authorize-security-group-ingress --group-id your-rds-security-group --protocol tcp --port 3306 --source-group sg-0aed64f81acc4c037

セキュリティグループを 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 関数の設定を更新します。

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

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