AWS Secrets Managerを利用して、Redshiftのパスワードを自動的にローテーションさせる

redshift-data cliを利用して、sqlを実行する時に、認証方法としてAWS Secrets Managerを利用したいと思います。 Secrets Managerコンソール上で新たなシークレットを作成し、Redshiftのパスワードを自動ローテーションさせる設定までやってみました。 構成 Redshiftクラスターはbastionサーバーを利用し、外部からのアクセスを可能にし、パスワードを自動ローテーションさせるLambdaはNATゲートウェイでなはく、VPCエンドポイントを通すように設定しました。 シークレット作成と自動ローテーション設定 新たなシークレットを作成します。Redshiftクラスターのユーザー名とパスワードを入力し、対象クラスターを選びます。KMSキーはデフォルトを選びました。 自動ローテーションを有効にし、ローテーション間隔を入力し、新しいLambda関数を作成します。 しかし、自動作成されるCloudformationスタック作成に失敗しました。サブネットの数超過による失敗でした。 Properties validation failed for resource SecretsManagerRedshiftRotationSingleUser with message: #/VpcConfig/SubnetIds: expected maximum item count: 16, found: 20 手動で自動ローテーション再設定 失敗したCloudformationスタックを削除し、同じテンプレートでスタックを再度作成します。 パラメーターは失敗したスタックと同じ値を入力し、サブネットはLambdaを作成するサブネットを入力します。 Key Value kmsKeyArn - excludeCharacters :/@"'\ functionName SecretsManagerRedshiftRotationLambda endpoint https://secretsmanager.ap-northeast-1.amazonaws.com invokingServicePrincipal secretsmanager.amazonaws.com vpcSecurityGroupIds sg-0b3xxxcfa vpcSubnetIds subnet-0e171673999462f90,subnet-0c21ae038cbe71f48 Cloudformationスタック作成が完了したら、シークレット自動ローテーション設定画面を開き、作成されたLambda関数を選択します。 Lambda実行失敗 Lambda関数に設定したSecurity GroupはRedshiftへ設定されたSecurity Groupと同じです。(自動でLambda関数が作成される場合もRedshiftクラスターと同様なSecurity Groupが設定されます。) Redshiftへ設定されているSecurity GroupはAWS Secrets Managerが作成するLambda関数のInboundアクセスの許可が必要です。 [ERROR] d352ae22-3b4b-4203-88cf-224160303d56 setSecret: Unable to log into database with previous, current, or pending secret of secret arn arn:aws:secretsmanager:ap-northeast-1:xxxx:secret:dev/Demo/Redshift-8c3rDL [ERROR] ValueError: Unable to log into database with previous, current, or pending secret of secret arn arn:aws:secretsmanager:ap-northeast-1:xxxx:secret:dev/Demo/Redshift-8c3rDL Security GroupへInboundアクセス追加 Redshift Security GroupへSecurity Group自身からRedshiftへアクセスできるようにInboundアクセスを追加 すぐにシークレットをローテーションさせるを実行 正常にパスワードが変更されました。...

2021-07-26 · bokyung