「外部勉強会 リビルドへの道」で「実際にリビルドを完遂してみて」を発表しました!

こんにちは。 エキサイト株式会社の三浦です。 2022年6月27日、エキサイト主催で行った「外部勉強会 リビルドへの道」にて発表させていただきました! 今回は、簡単に振り返りたいと思います。 「外部勉強会 リビルドへの道」とは 「外部勉強会 リビルドへの…

プライベートサブネットにあるサーバ上の開発環境Webページにアクセスする方法

こんにちは。 エキサイト株式会社の三浦です。 AWSで開発を行う場合、多くのアプリケーション用サーバはプライベートサブネットに設置することになるでしょう。 つまり、もしWebアプリケーションの開発環境がサーバ上に存在する場合、本来インターネットから…

Flywayで、S3にあるSQLファイルを使ってマイグレーションする方法

こんにちは。 エキサイト株式会社の三浦です。 JavaのアプリケーションでDBを扱っている場合、DBのマイグレーションのためにFlywayを使っている方も多いのではないでしょうか。 今回は、マイグレーションに使用するSQLファイルについて、ローカルではなくS3…

AWSのプライベートサブネットとパブリックサブネットの違い

こんにちは。 エキサイト株式会社の三浦です。 Amazonが提供しているAWSでは、サーバやDBなどを配置する箱として「サブネット」と呼ばれるものがあります。 そしてサブネットは、「プライベートサブネット」と「パブリックサブネット」の2種類が存在します。…

Docker ComposeでGraceful Shutdownのための時間をかせぐ方法

こんにちは。 エキサイト株式会社の三浦です。 前回、ECS FargateとGraceful Shutdownに関する記事を書きました。 tech.excite.co.jp 今回はこの調査をしている時に直面した、Docker Composeで実行したコンテナの終了時、Graceful Shutdownが完了する前に強…

ECS Fargate Spotでは、STOPSIGNALを変更できない

こんにちは。 エキサイト株式会社の三浦です。 今回は、ECS Fargate SpotでGraceful Shutdownをしたい時に引っかかる可能性のある、STOPSIGNALに関する注意点を説明します。 ECS Fargate Spotとは ECS Fargateは、AWSの提供するマネージドなコンテナ実行サー…

「第二回テクデザ総会」を開催しました!

こんにちは。 エキサイト株式会社の三浦です。 2022年5月13日に、第二回目となる「テクデザ総会」を開催しました! 第二回テクデザ総会 ちなみに、第一回目の様子はこちらになります。 tech.excite.co.jp テクデザ総会 テクデザ総会は、事業部間など、普段は…

DateTimeFormatでは、JSONで受け取った日付をうまく取得できない場合があるという話

こんにちは。 エキサイト株式会社の三浦です。 Javaで日付形式の文字列を受け取る場合、 DateTimeFormat を使うことが多いと思います。 ですが実は、JSONで日付を受け取ろうとするとうまく行かない場合があります。 今回は、JSONで日付を受け取るにはどうす…

Spring Bootにおける、おすすめRedis設定方法

こんにちは。 エキサイト株式会社の三浦です。 以前こちらの記事で、Spring BootのRedisキャッシュで List.of などを使う方法について説明しました。 tech.excite.co.jp 今回はそれも含んだ、Redisキャッシュのおすすめ設定方法を紹介します。 なお実は、弊…

Spring BootのRedisキャッシュで、List.ofを使えるようにする方法

こんにちは。 エキサイト株式会社の三浦です。 Spring Boot には様々な機能が用意されており、その一つに Redis へのキャッシュ機能があります。 非常に便利なのですが、少なくとも Spring Boot の ver.2.6.6 では、 List.of (正確には、 List.of などによ…

Spring Bootで、JDBC設定にTLSプロトコルの指定が不要になった話

こんにちは。 エキサイト株式会社の三浦です。 今回は、Spring Bootのアップデートによって、DB設定がちょっと簡単になった話をします。 Spring BootとDB設定 Spring BootでDBと接続したい場合、 application.yml ファイルに以下のように設定します。 spring…

2回目以降のCheckstyle実行結果を見る方法

こんにちは。 エキサイト株式会社の三浦です。 皆さんは、Checkstyleを使っていますか? Javaのコードが指定したコード規約に即しているかをチェックしてくれるツールで、これによってコードの品質を保つことができます。 Gradleからタスクを実行したりして…

ConstructorPropertiesを使ったAPIリクエストモデルでは、ParameterObjectは使えないという話

こんにちは。 エキサイト株式会社の三浦です。 JavaのSpring Bootでは、OpenAPIのライブラリを使用することでAPIのリクエストモデルを簡単にドキュメント化することができます。 ただ、リクエスト用のモデルで ConstructorProperties を使っていると、うまい…

GitHubのIssueでは、Milestoneが役に立つという話

こんにちは。 エキサイト株式会社の三浦です。 皆さんは、GitHubでIssueを使っているでしょうか? 今回は、Issueを使う場合、併せてMilestoneを使うのがオススメ、という話をします。 GitHubのIssue GitHubには、Issueという機能があります。 コードを書いて…

Spring Bootで、環境ごとに異なる値を持つモデルクラスを作るオススメ方法

こんにちは。 エキサイト株式会社の三浦です。 コードを書いていると、たまに環境ごとに異なる値を使いたくなるときがあります。 例えば、開発環境と本番環境で使用するDBが異なる場合は、DBのURLは環境ごとに異なるはずです。 今回は、Spring Bootでそのよ…

AWS Lambdaのhandler内外でのexitの挙動について

こんにちは。 エキサイト株式会社の三浦です。 AWSには、サーバーレスで処理を実行できる「AWS Lambda」というサービス(以降Lambda)があります。 Lambdaでは、実行の起点となるメソッド(handler)を指定することで、Lambdaの実行イベントが走ったときにそ…

Excite × iXIT TechConで「Spring Bootという強すぎるフレームワークについて」を発表しました!

こんにちは。 エキサイト株式会社の三浦です。 先日、弊社内で Excite × iXIT TechCon というカンファレンスが行われました! tech.excite.co.jp 私は「Spring Bootという強すぎるフレームワークについて」というタイトルで発表させていただきました。 Sprin…

Spring Bootで、文字列型の空クエリパラメータを受け取るときの注意点

こんにちは。 エキサイト株式会社の三浦です。 Spring BootのAPI等で空のクエリパラメータを受け取るとき、受け取り側の型や「空」の指定方法によって取得される値が違うことはご存知でしょうか? 今回は、その違いについて紹介していきます。 Spring Bootと…

サービスを停止せずにテーブルをリプレイスする方法

こんにちは。 エキサイト株式会社の三浦です。 長い間サービスを運用していると、やがてテーブルの構造を変えたいと思うときが来ることがあります。 「Indexを追加する」程度であればそこまで問題ではありませんが、「特定のカラムの照合順序を変更する」な…

MySQLでMaterialized Viewを実現する

こんにちは。 エキサイト株式会社の三浦です。 tech.excite.co.jp 以前こちらのブログで、「MySQLにおいて、Indexだけではパフォーマンス改善に限界があり、一定以上複雑なSQLやデータ構造に対してはIndex以外の手段を講じる必要がある」ことを説明しました…

MySQLの「Indexが当たる」とはどういうことなのか

こんにちは。 エキサイト株式会社の三浦です。 MySQLを使用してデータを取得する際、その取得速度を高めるためにほとんどの場合Indexを使用することになります。 シンプルなSQLでデータを取得するのであれば、そのSQLに当たるIndexはわかりやすいでしょう。 …

MySQLでテーブルを作る際に注意すべきこと

こんにちは。 エキサイト株式会社の三浦です。 アプリケーションを作る上で、データを格納するためにMySQLを立ててテーブルを作成する機会は多いと思います。 今回は、テーブルを作成する際に注意すべきことをいくつか書いていきます。 一意なデータにはユニ…

MySQLの自動Index選択にどこまで任せるべきか

こんにちは。 エキサイト株式会社の三浦です。 MySQLでは、SQL実行時に適切なIndexを自動的に選んでくれる機能(オプティマイザ)があります。 ただこれは、万能というわけではありません。 今回は、手動でIndexを選んだ方が早い例を挙げ、そのことを確認し…

Spring Bootで、DBのPrimary/ReplicationインスタンスにSQLを振り分ける2つの方法

こんにちは。 エキサイト株式会社の三浦です。 DBでは、可用性の担保のために Primary と Replication のインスタンスをそれぞれ用意することが多々あります。 こうしたDBをSpring Bootで扱う際、適切にSQL実行先を振り分けないとせっかく分けた意味がなくな…

Spring Bootで、Webアクセスのパラメータをクラスで受け取るときの注意点

こんにちは。 エキサイト株式会社の三浦です。 Spring BootでAPIなどを作る時は、Webからのアクセスを受け取ることになります。 そのアクセスにクエリパラメータ等でパラメータが付いている場合、そのパラメータを何かしらの方法で受け取る必要があります。 …

Spring BootのRedisキャッシュで、Master/Replicaを呼び分ける方法

こんにちは。 エキサイト株式会社の三浦です。 アドベントカレンダーも14日目となり、中盤を過ぎてきました。 今回はRedisとSpring Bootの話になります。 Redisの可用性を高めるために有用な手段ですので、参考にしていただければ幸いです。 はじめに Redis…

Github ActionsでのECSへの手動デプロイ

こんにちは。 エキサイト株式会社の三浦です。 アプリケーションのデプロイ方法は、エンジニアなら誰もが頭を悩ませるものでしょう。 コマンドライン、AWS CodePipeline、Jenkinsなど、様々な方法が考えられます。 今回は、ECSへのデプロイ方法としてGithub …

Spring Bootで、AWSパラメータストアから簡単にDBのパスワードを取得する方法

こんにちは。 エキサイト株式会社の三浦です。 いよいよ今年も12月になりました。 「師走」の文字通り、忙しくしている方も多いのではないでしょうか。 この「12月」ですが、我々エンジニアにとっては別の意味も持っています。 すなわち、アドベントカレンダ…

ECSで複数のターゲットグループを紐付けるときの注意点

こんにちは。 エキサイト株式会社の三浦です。 AWSをインフラとしている場合、アプリケーションを動かす環境としてECSは選択肢の大きな一つです。 それがWebアプリケーションであれば、ECSとALBのターゲットグループを紐付けることが多いでしょう。 実はECS…

JavaのRestTemplateでタイムアウトを設定する方法

こんにちは。 エキサイト株式会社の三浦です。 APIにアクセスする際、一定時間までにレスポンスが返ってこなかったらエラーとして処理したい、というのはよくある要望かと思います。 そのために使用するタイムアウト設定について、JavaのRestTemplateで設定…