このエントリーをはてなブックマークに追加

産休&育休から復帰した志賀です :baby:

ちょうど 前回の記事 が産休直前で、そこから約1年ぶりの記事となります。

復帰直後は、リハビリという名の小さめタスクをやらせていただいてました。

そのおかげでどうにか調子も戻ってきてコードもバリバリ書いてます!(自称)

そこで今回は復帰後〜1ヶ月のリハビリと称された期間でやったことを紹介します :information_desk_person:

おまけでコードが書けなくなるのが怖くて休暇中にやっていたこともご紹介できたらなと思います。

復帰後〜1ヶ月(リハビリ期間)にやったこと

私はPHPチームに所属しており、リーダーからリハビリ期間でふってもらったタスクはこんな感じのものでした。

  • URLの変更
  • 既存APIのレスポンス項目の追加
  • API調査

保育園から呼び出し等の心配をしていただいた上で期限にゆとりがあるものや優先度低めのものを中心にふってもらいました :bow:

タスクをこなしつつSymfonyを思い出していました。

テストの書き方を結構忘れており、既存コードを参考にさせてもらい改めて勉強になりました。

おまけ

私の場合、特に妊娠中は暇なせいか「コードが書けなくなったらどうしよう」と不安になることがあったので、たまにコードを書いたり本を読んだりしてました。

その中でやっていたことを紹介します。

  • ぴよログや授乳ノートみたいなLINE:left_right_arrow:スプレットシートで記録できるアプリを作った。(結局、授乳ノートで記録してましたが、最近は記録さえしてないです。)
  • デザインパターンの本(「Head First デザインパターン」 )を再読した。
  • 育児ブログ書こうかなと思ってワードプレスでブログ作った。(育児が忙しくなってもう更新してないですw)
  • ペチコンやPHPerKaigi、Symfony Meetup Kansaiに参加した。(オンラインのため育児中でも参加しやすかったです。)

妊娠中は体調も良くて暇だったのでもっと本読んだりコード書いたりしておけば良かったな〜と思いました。

子どもが生まれると時間が作れずほぼコードを書く時間はなくなりました。そのおかげか今は昔よりコード書きたい欲が増した気がします!:star2:

今思えばいい充電期間だったのかなと思います。

子どもが生まれて改めて育児しながらお仕事してる方はすごいな〜と尊敬しました。とくにカルテット開発部はママさん・パパさんが多いので本当に尊敬してます!

そして自分も無理はせず、育児と仕事両立できるかっこいい母になりたいな〜:sunglasses:と思いました。

カルテットでは子の看護休暇があったり、私は会社まで少し遠いこともありリモートワークで働かせてもらったりと柔軟な対応のおかげでとても働きやすく楽しくコードを書けてます。


このエントリーをはてなブックマークに追加

はじめに

Aurora Serverless いいですよね。常時起動の必要のないアプリケーションなどにおいて利用することでコストメリットを享受でき心理的にストレスが随分減ります。
今回はこの Aurora Serverless の MySQL エディション使用時にユーザのアクセス制御でつまづいたのでその内容を記しておきたいと思います。

MySQL におけるアクセス制御

MySQL にはアクセスするクライアントの制御を行う仕組みがあります。これを適切に運用することで予期せぬユーザの振る舞いによるデータの変更などを避けられます。便利ですね。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2 MySQL アクセス権限システム

Aurora MySQL による IAM 制御

一方、Aurora MySQL には AWS のサービスならではの仕組みがあります。それは IAM による制御です。

の IAM データベース認証 - Amazon Aurora

(機械翻訳によるためタイトルの日本語がバグっているようです :sweat_smile:

しかし、 Aurora Serverless ではそれは不可能です。

Aurora Serverless では、以下の機能はサポートされていません。
  • AWS Identity and Access Management (IAM) データベース認証

:

Amazon Aurora Serverless を使用する - Amazon Aurora

以上より、今回は先述の MySQL の機能を利用して特定の CIDR からのアクセスのみを許容するすることを実現しようと試みました。

Aurora Serverless MySQL で IP アドレス制御

たとえば、ユーザ naoyesmydb データベースへのアクセスを以下のように制御したい場合、

  • 10.5.0.0/24 という CIDR を保有するサブネット内にからのアクセスは許容
  • それ以外の CIDR を保有するサブネット内からのアクセスは拒否

下記クエリを流すことで実現できます。

GRANT ALL ON mydb.* TO `naoyes`@`10.5.0.%` IDENTIFIED BY 'pa55w0rd';

これを実施したのち、さっそく 10.5.0.% という CIDR を保有するサブネット内に配置された EC2 インスタンスから MySQL クライアントでアクセスを試みると

SQLSTATE[HY000] [1045] Access denied for user 'naoyes'@'10.1.0.33' (using password: YES)

といったエラーメッセージとともにアクセスが拒否されました。
10.5.0.% に配置された EC2 インスタンスからのアクセスなのに「10.1.0.33 からのアクセスはダメよー」と言われてしまったのです。

結論

できない

理由

どうも解せないのでサポートに問い合わせてみました。
回答によると

  • Aurora Serverless の DB クラスターを作成した際に以下の挙動が起こる
    • Router fleet が作成される
    • VPC 内に VPC エンドポイント(インターフェイスエンドポイント)が作成され、それが Router fleet との PrivateLink のエンドポイントとなる
    • Aurora Serverless にアタッチされた Security Group が上述の VPC エンドポイントに適用される
  • MySQL においてはクライアントの IP アドレスとして Router fleet のものが認識される
    • Router Fleet の IP アドレス範囲はスケールの状況などにより変動する可能性がある。そのため、MySQL の設定におけるホスト名としては、ワイルドカード ‘%’ を指定しておくと良い

とのことでした。
(参考: Aurora Serverless v1 アーキテクチャ
この場合、当該 Router fleet が 10.1.0.33 に配置されていたためエラーメッセージのホスト IP アドレスが 10.1.0.33 となっていたということのようです。
よって以上より、

GRANT ALL ON mydb.* TO `naoyes`@`%` IDENTIFIED BY 'pa55w0rd';

とすることが正しいとのことでした。
アクセス制御を行う場合には Security Group を適切に使うようにとのアドバイスいただきました。

(参考: セキュリティグループによるアクセスコントロール - Amazon Relational Database Service

さいごに

DB をパブリック・アクセス可能にしているわけでなかったら Security Group の制御のみで充分ですね。
そのあたりを意識せずに思考停止していたなと反省しました。適切なレイヤーで適切な制御を行うことを心がけたいと思った次第です。
また、Aurora Serverless のアーキテクチャ、 VPC エンドポイントおよび PrivateLink への理解も深まり得るものが多いつまづきでした。


このエントリーをはてなブックマークに追加

PHPerKaigi2021にて「そのコード、フレームワークの外でも動きますか?」を発表しました。スライドを公開します。



説明に使用したLaravel版とSymfony版のコードは下記で公開しています。 説明した各リファクタステップごとにタグやブランチを切ってあるので、各ステップでコードがどのような状態になっていたか興味のある方は詳細を見てみてください。
https://github.com/77web/fortune-teller-laravel
https://github.com/77web/fortune-teller-symfony