ヤマムギ

growing hard days.

*

VPC内のLambdaからVPCエンドポイント経由でSecrets Managerを使う

      2021/05/18

InternetGatewayのないVPCでMySQLに対して一日数回のレポーティングのための抽出処理をするLambdaがあるとします。
MySQLのパスワードは定期更新が必要で、パスワード管理もしたくないので、AWS Secrets Managerを使いたいとします。
そうなると、VPCエンドポイントを使うことになると思いますので、上記の構成を試しました。

MySQL(Aurora Serverless)の準備

MySQLはAurora Serverlessを使ってみました。

作業用のEC2から、SQLコマンドでサンプルテーブルとレコードを作成しました。

VPCエンドポイントの作成

VPCエンドポイントを作成する前に、Secrets ManagerのエンドポイントのDNSを確認しておきました。

パブリックIPアドレスが引けました。

Secrets Manager用のVPCエンドポイントを作成しました。

作成完了して利用可能になったあと、もう一度DNSを確認しました。

プライベートIPアドレスが引けました。

Secrets Managerシークレットの作成

「RDSデータベースの認証情報」としてシークレットを作成しました。
Auroraインスタンスを選択して、ローテーション構成を設定するだけでした。

Lambdaのサンプルコード

LambdaでVPC起動を指定して作りました。

IAMロールに設定したSecrets Manager向けのIAMポリシーはこちらです。

ランタイムはPython 3.8です。
pymysqlはレイヤーから使っています。
シークレットを作成すると、サンプルコードが生成されているので、それを使いまわしました。

途中でパスワードをprintしてますが、これはローテーションの動作確認のためなので、本番でやっちゃうとだめですね。
せっかくパスワードを知らなくてもいい運用にしているのに、CloudWatch Logsにパスワードが記録されてしまいます。

このコードを実行しました。

テーブルに保存されたレコードを取得できました。
パスワードは初期に設定した “demo-password”なことがわかりました。

パスワードのローテーション

パスワードをローテーションするためのLambdaが自動的に作成されているのですが、これVPC設定されてないので、このままだとデータベースに接続できません。
昔作ったときは自動的に設定されていたと思うのですが、今回は環境上のなんらかの条件が違ったのかもしれません。

なにはともあれ、データベースに対して接続できないとパスワード更新もできませんので、VPCの設定をします。
もちろんセキュリティグループIDはAurora側のセキュリティグループでインバウンド許可のソースにする必要があります。

そしてSecrets Managerの[すぐにシークレットをローテーションさせる]を実行しました。

そして、Lambda関数を[テスト]ボタンから再実行しました。

ローテーションにより更新されたパスワードでデータベースに接続できたことがわかりました。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS , , ,

  関連記事

WordPress、プラグインのアップデートしてBlue/Greenデプロイ

現在のブログの構成です。 WordPressとプラグインのアップデートをして、デ …

AWS Protonの管理者ガイドとユーザーガイドのチュートリアル

AWS Proton管理者ガイドのAWS Management Console …

EC2 Instance Connect向けのセキュリティグループのソースにプレフィックスリストを

EC2 Instance Connect、便利ですね。 キーペア不要で、EC2イ …

AWS CLIを使用したIAMロールの引き受けコマンドのメモ

よく忘れて調べるのでメモです。 公式のこちらAWS CLI を使用して IAM …

CodeWhisperer(Visual Studio Code)でセキュリティスキャン

CodeWhispererのセキュリティスキャンを実行してみました。 画面下の[ …

S3オブジェクトロックを試しました

S3オブジェクトロックが必要になる要件に今のところ、出会ってないのでまだ設定した …

Amazon CloudWatch RUMはじめました

新機能 – Amazon CloudWatch RUM をご紹介 2021年12 …

API Gateway Lambdaプロキシ統合で渡されるリクエストを確認しました

API Gatewayの統合リクエストでLambdaを指定するときにプロキシ統合 …

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました!

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました。 久 …

AWS Client VPNのクライアント接続ハンドラを試してみました

AWS Client VPNを設定しましたで証明書とかせっかく作ったので、いろい …