decadence

個人のメモ帳

RustでもServer::Starterでhot deployをする

Server::Starterを利用すれば、hot-deployが実現出来る。

Server::Starter とは

start_server をざっくりと説明すると、 start_server が作成したsocketを子プロセスへ共有して、あとは start_server にSIGHUPのシグナルを送ってあげることで、子プロセスを入れ替えてhot deployが出来るものだ。詳しくは以下の記事を読んでも良いし、実装自体も少ないのでコードを読めば良い。

Server::Starterから学ぶhot deployの仕組み - $shibayu36->blog;

この子プロセスというのは、start_server の子プロセスになるだけで、以下のような特定の条件を満たせればなんでも良いのだ。

  • hot deploy時に start_server がSIGTERMを子プロセスへ送るので、SIGTERMによりgraceful shutdownを行う
  • 子プロセス起動時に start_server が作成したファイルディスクリプタの情報が環境変数で渡ってくるので、それを用いてacceptする (しなくてもいい)

この対応は、過去にも多くの人がやってきたことではあるが、Rustでも簡単に出来るように、今回、子プロセス用のcrateを作成した。

https://crates.io/crates/server-starter-listener

続きを読む

localstack を aws-sdk-java-v2 で利用する

AWSを活用しているときに、localやCIではAWSのmockとしてlocalstackを利用することがある。 特にS3 / Kinesis / SQS / ...のように複数のAWS Resourceを使う場合にはlocalstackはとても便利だ。 localstackはdocker imageも公式配布されているので本当に便利。

それとは別に、最近ではaws-sdk-javaはv2が主流となりつつある。 こちらはv1と比べてコード生成されたり、非同期APIが提供されたりしている。

aws-sdk-java-v2でlocalstackを利用する際には、以下の点に気をつける必要がある。

  • aws-sdk-java-v2はhttp2でつなぎに行こうとするが、localstackはhttp1.1しか喋れない
  • aws-sdk-java-v2はCBORでやり取りしようとするが、localstackはJSONしか処理出来ない
  • localstackも何も認証情報が取れない環境だとsdkが例外を吐いて通信できないので、どのような環境でも動かせるように、適当なaws key/secretを入れておく
    • もちろんAWS上の本番環境などではaccess key/secretなんかは使わずに、instance profileやexecution roleからassume roleでもして必要なresourceへアクセスされたい
// disable CBOR
System.setProperty(SdkSystemSetting.CBOR_ENABLED.property(), "false")
// use http1.1 not http2
val sdkAsyncHttpClient = NettyNioAsyncHttpClient
  .builder()
  .protocol(Protocol.HTTP1_1)
  .build()
// set static credentials
val credentialsProvider = StaticCredentialsProvider.create(
  AwsBasicCredentials.create("unused", "unused")
)
val client = SqsAsyncClient.builder()
  .region(Region.AP_NORTHEAST_1)
  .credentialsProvider(credentialsProvider)
  .endpointOverride(new URI(s"http://localhost:4576"))
  .httpClient(sdkAsyncHttpClient)
  .build()

client.listQueues(
  ListQueuesRequest
    .builder()
    .build()
)

aws-sdk-java-v2もnettyの依存があるので、他のライブラリでもnettyを使っている時は互換性に注意するんだぞ。 特にnettyのssl周りのclassはすぐにClassNotFoundException吐くからな。