ヤマムギ

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関数を[テスト]ボタンから再実行しました。

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


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

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

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

【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。

 - AWS , , ,

ad

ad

  関連記事

RDSのスナップショットをS3へエクスポートが日本語マネジメントコンソールでもできるようになってました

RDSスナップショットをS3にエクスポートする新機能を試そうかと思ったのときは、 …

Amazon EC2 インスタンスメタデータサービス(IMDS) v2のみにしました

今さらながらですが、EC2 インスタンスメタデータサービス(IMDS) v2を確 …

Amazon Route 53 Resolverを設定確認

Route 53 Resolverを設定しました。 東京リージョンのVPCをオン …

GoogleフォームからAPI Gatewayで作成したREST APIにPOSTリクエストする

「API GatewayからLambdaを介さずにSNSトピックへ送信」の続きで …

AWS東京リージョンのAZ(apne1-az1)障害時の当ブログで発生していたことの記録

日本時間2/19 23:01頃より、東京リージョン、特定AZの1つでEC2インス …

Rocket.ChatのOutGoingWebhookからのAPI GatewayからのDynamoDB

少し前に、Rocket.ChatからOut Going Webhookを設定して …

「re:CAP ~サーバーワークス re:Invent 2018 報告会~」でre:Invent2018について思われたことを聞かせていただいた

サーバーワークスさんのre:Invent re:CAPにおじゃましました。 re …

AWS WAF Web ACLとルールをv1(Classic)からv2に自動移行しました

新しいものは、課題が解決されていたり、機能追加されたりするのでいいものです。 長 …

ALBにWAFを関連付けて特定のヘッダー以外はブロックする

おかげさまで、ブログのアクセスも増えてきて、t3.nano EC2インスタンス単 …

Amazon Auroraのスナップショットの暗号化とリージョン間コピーを改めて試しました

Amazon Auroraデータベースを暗号化して、スナップショットを作成、クロ …