Skip to main content

Posts

Showing posts from October, 2020

なぜQuarkusを使うのだろう

開発者仲間に問いかけられて言語化したので、一応記録しておく。 Java界隈だと、王道はSpringで、特にSpringBootはJavaでWeb APIアプリを作るときのデファクト、と言っても過言ではないと思う。 その背景を前提に、なぜあえてQuarkusを選んでいるのか?というのがお題。 とりあえずJavaでの開発経験やコンテナ周りの業務使用経験のあるメンバーで出てきた話や結論としては次の通り。 * SpringBootは便利だが、基礎の枠組みを超えることをする場合にはSpring Frameworkの知識が必要なので、必要となる知識レベルが一定のポイントで急上昇するかも * Quarkusの場合はFrameworkとしてはもう少し薄いラッパーに近いため、取り入れる各ツールの知識を蓄えれば良さそう * 最終的にQuarkusでもSpring Bootでもできること自体には大きな差異はなさそう * JVMで動かすのも良いけど、Nativeにできてとてもつもない高速で起動できるのが強みな気もする * Spring Frameworkに精通しているメンバーがいたら無理にQuarkusを使用する理由はなさそう * Spring Frameworkに精通しているメンバーいないならSpring BootよりもQuarkusを使う方が楽な場合もありそう 自分が携わっているプロジェクトではSpring周りの知識に強い人が特別いたわけではないことと、メジャーリリース以前の2019年央頃から好きで自分がQuarkusを推していたことから、Quarkusを使用しているのが現状。 SpringBootをベースにしたプロジェクトで以前に少し辛い思いをしたことも後押しにはなってる。 そもそも使い出したのも、なんか使ってみたら簡単でワクワクしたから、くらいの理由。 でも、今はこれなしでWeb API作るのは結構辛いなあと思う。OpenAPI Generatorと並んで重宝してる。 というわけで、正直突出してQuarkusでなければいけない理由、はないかもしれない、という結論に至った。 一方で、Springに疲れた人たちの十分な代替的選択肢として使えそう、という結論にも至った。 Quarkus採用について、自分はArchitectural Decision Recordを残していなかった。 なぜ

AWSでアカウントをまたいだ接続を実現する

前回のNLBとRDSを組み合わせて使っていた話の続き。 ELBのNLBとRDSを組み合わせ使う場合の設定 Elastic Load Balancer (ELB) のNetwork Load Balancer (NLB) を経由し blog.tkhm.dev 設定がわかれば、ああそういうものなのか、とわかるのが多いという印象のAWSのサービス。これもその類だった。 VPC Endpointサービスでは、接続元をConsumerと呼び、接続先をProviderと呼ぶ。 VPC endpoint services (AWS PrivateLink) - Amazon Virtual Private Cloud Create your own application and configure it as an AWS Privat docs.aws.amazon.com その上で、設定としては、まずProvider側で"VPC Endpoint Service"を有効にする。 そうすると、Service Nameというものが発行される。これを鍵にConsumer側からは繋ぐことになる。 Consumer側では"VPC Endpoint"を有効にし、その際に先ほどのService Nameを使用する。 すると、VPC Endpointに対してアクセスすれば、別のアカウントにあるVPC Endpoint Serviceを経由してNLB、そして前回の例で行けばRDSへと接続ができる。 このとき、Consumer側でアプリがDBのアクセス先に指定するべきなのはConsumer側のVPC EndpointのDNS Name。 そこが自分の場合は勘違いしていた。VPC EndpointとVPC Endpoint Serviceでトンネルのようなものを作るので、そのトンネルの向こうのNLBの名前を指定するべきなんだろう、と思っていたが、そうではなく、あくまで自分のアカウント内のVPC Endpointを指定すると、Service Nameを介してNLBに到達できる仕組みらしい。 なので、仕組み的にはリバースプロキシーを設定しているのと同じと考えると結構わかりがいい。 細かい点としては、特にProvider側でいくつか。 * Provider側のV

Podの払い出しに kubernetes-client / openshift-client ライブラリを使う

  アプリからPodを払い出したいという要求があった。 最初はOpenShiftのAPIを直接呼び出して払い出すのが良いかと思って調べ出していたところ、次のライブラリを教えてもらった。  fabric8io/kubernetes-client Java client for Kubernetes & OpenShift . Contribute to fa github.com 開発のオーナーシップを持っているのはあのfabric8なので、信頼感もある。 fabric8: open source Integrated Development Platform for Kubernetes The fabric8 project has been discontinued fabric8.io で、実際に使ってみると、KubernetesやOpenShiftの中にあるコンセプトがクラスになっていて、本当に使いやすいと感じた。 最近使ったライブラリの中で最も洗練されているように感じたし、使い方も割とすぐわかった。 まずライブラリの読み込みは、Gradleの場合はこんな感じ。 implementation 'io.fabric8:openshift-client:4.12.0' kubernetes-clientも公開されているが、それとは別にopenshift-clientも使われている。 openshift-client側はkubernetes-clientを内側に含んでいるので、もしOpenShiftの操作に使おうとしているならopenshift-clientを使うのが賢明。 * io.fabric8 : openshift-client : 4.12.0 - Official search of Maven Central Repository  https://search.maven.org/artifact/io.fabric8/openshift-client/4.12.0/jar * io.fabric8 : kubernetes-client : 4.12.0 - Official search of Maven Central Repository  https://search.maven.org/artifact/io.f

OpenShiftで動かしているPodからIBM Cloudのファイルストレージへの書き込みに失敗する

コンテナを非root権限で動かすのは徐々に一般的なこととして受け入れられつつあるように思う。 その一方で、非rootで動かしているが故に困ることはまだまだあるなあとも感じる。 今回引っかかったのは、IBM Cloudのファイルストレージを払い出して、OpenShiftのPVとして使用する時の話。 簡単に結論を言えば、次のようにして、対象のサービスアカウントに権限を付してDeploymentに書いてしまうのが手っ取り早い(ただし本番での使用は推奨できない)し、もう少し時間が取れるならInitContainerを使用する方法なども検討の余地がありそう。(リンク先参照) oc create sa mysa oc adm policy add -scc-to-user anyuid -z mysa IBM Cloud Docs cloud.ibm.com ちなみにこの手っ取り早い現実解はOpenShiftの師匠から教えてもらった。身近にそういう人がいると、自学自習も進みやすくてとてもありがたい。 今回だと、NGINXのコンテナからマウントして参照しつつ、アプリから当該マウント先の下に動的にディレクトリを作ってファイルを出力するような使い方が必要だった。 もちろん、コンテナ自体にroot権限を付して動かせばそれはそれで一つの解決方法なのかもしれないけれど、基本的にはそれは個人的に取りたくない方法だった。 そうなると、今回のように必要なクラスター操作の権限を持っているなら、長期的な方針が決まるまではOpenShiftの権限設定で対応するとして、意思決定を先延ばしにする、というのは現実解としてとても気に入っている  

JAR内のリソースファイルにアクセスする

Javaで開発をしてからは随分と長い。少なくとも自分のITエンジニアとしてのキャリアの中心かそれに近い位置にJavaという言語があることは否めない。 ......のだけれど、つい最近初めて知った、知ってそうで知らなかったことがある。 それが、JARやZIPファイル内へのプログラムからのアクセス方法。 通常のリソースファイルをsrc/main/resources直下においたとすると、こんな感じでアクセスできる。 final String targetFilePath = "/xxx.zip" ; URL url = this .getClass().getClassLoader().getResource(projectFilePath); File downloadable = new File(url.getPath()); が、これをJARファイルにしたアプリで実行すると、urlがnullになりNullPointer Exception(NPE)が発生する。 自分の場合はJARにしたファイルをコンテナに乗せて動かすことが前提になっていたので、/deployments/app.jarへのアクションを前提として書く。 final String jarLocationPath = "jar:file:/deployments/app.jar!/xxx.zip" ; final String copyTargetPath = "/deployments/xxx.zip" ; URI uri = null ; try { URL url; url = new URL(jarLocationPath + projectFilePath); JarURLConnection connection = (JarURLConnection) url.openConnection(); connection.connect(); uri = URI.create(url.toString()); } catch (IOException e) { e.printStackTrace(); } Map < String , String > env = ne

Quarkusとmicroprofileで動的にアクセス先リソースURLを置き換え

Quarkusでアプリを書いている。 そうすると、自然とmicroprofileを使用した状態になる。 前回Java関連で書いたWebAPIクライアントにつながる話だけど、接続する対象のURLは変わりうるので、環境変数などで差し込めるようにしたいというニーズがあった。 例えばこういう例で、application.propertiesで次のように定義すれば、該当のFoodsApiクラスが接続する先は"https://foods.example.com"にできることは確認済だった。 application.propertiesに定義できるものは基本的に全て環境変数からも差し込めるようになっているはず、なので、今回はそれを実現してみた。 myapp.resources.FoodsApi/mp-rest/url=http: //foods.example.com で純粋な疑問として、スラッシュ"/"とかハイフン"-"とかはどう扱えばいいのだろう、という話。 そこで次のリンクに、制約や置き換えのルールが書いてある。雑に言えば、記号は全てアンダースコア"_"にするし、小文字は全て大文字にする、とのこと。(Quarkusのガイドから飛べるGitHub上のMicroprofileの説明がわかりやすい) Quarkus - Configuring Your Application Quarkus: Supersonic Subatomic Java quarkus.io eclipse/microprofile-config MicroProfile Configuration Feature. Contribute to eclipse/mic github.com なので、上記の例なら後から差し込む場合は、次のような感じ。もちろん、FOOFSAPIをFoodsApiと書いててもmicroprofileの探索ルールに基づいて探してもらえるので問題ない。 export MYAPP_RESOURCES_FOODSAPI_MP_REST_URL=http: //newfoods.example.com 使い始めるまで少しだけ困惑するけど、わかれば難しくないし、とても便利。

SDGsの個人ゴール設定

友人が広報に携わっている関係で、最近SDGsの取り組みについて調べているらしい。 友人は元々生物学などを学んでいたために関心があったのだけど、社内の人の反応を見るとイマイチらしく、気になって声をかけてきてくれた。 自分も会社でSDGsの話は聞いていたけれど、個人ゴールの設定までは至っていなかったので、改めてちょっと調べてみた。 まずは総務省で公表されているのがあるんだけど、これは本当に、政府として、みたいな部分が強くて、ここの企業や個人のできるアクションには到底至っていないけど、とりあえず仮の訳もあるのは誰かの役に立っているのだと思う。 総務省|政策統括官(統計基準担当)|持続可能な開発目標(SDGs) www.soumu.go.jp 総務省のをもう少し個別に砕いて一覧化してくれているこのページの方が個人的には分かりやすくて好き。 SDGs(持続可能な開発目標)17の目標&169ターゲット個別解説 | 一般社団法人イマココラボ このページは17の目標に紐づく169のターゲットを一覧で記載します。 SDGs17の目標(アイコンをクリックすると、該当の imacocollabo.or.jp で、ここまでのは企業とか大きな単位の目標なので、個人ゴール設定には少し遠い。 17の目標に関連づけて個人ゴールの例を出してくれているここの例がまあまあわかりやすい。 SDG目標別の個人・家庭でできる取り組みの例 – 持続可能な地域創造ネットワーク www.colgei.org で、最後に国連の出しているアクションガイド。わかりやすいのだけど、これを17の目標とか169のターゲットに結びつけてくれるとよかったなと思う。 294×210_181226_国連広報センター様_ol (変なファイル名だな......) 294×210_181226_国連広報センター様_ol www.unic.or.jp で、ここまで見てみると、割と個人でできることのうち手近なものは、既にやっているものが多いことに気づく。 国連の出してるPDFなどを見てみても、すぐにできそうな次のようなのは取り組んでいた。 * 使ってない電源を切る * 紙じゃなくて電子での決済をなるべく使う * 簡易包装品を買う * マイバッグを使う * 訳あり品の野菜などを買う * 買い物は地元でする もう少し加速させる意味で、目標に