電気ひつじ牧場

技術メモ

プラットフォームエンジニアリングについてパネルディスカッションを行いました

早いものでもう1ヶ月ほど経ってしまいましたが、5/21にGoogle Cloud様主催のInnovators Live Japanでパネルディスカッションに参加させていただきました。

cloudonair.withgoogle.com

タイトルとしては「先進企業が語る、Platform Engineering 導入のリアル:成功と課題」ということで、最近話題のプラットフォームエンジニアリングに関して各社の取り組みや実際やってみた課題感などをディスカッションしました。

Ubieでは Ubieにおけるプラットフォームエンジニアリングの取り組み2023 - 電気ひつじ牧場 でも述べたように、最近プラットフォームエンジニアリングを通したプロダクト開発エンジニアの生産性向上に力を入れています。この記事は昨年末に書かれたものであるため、まだ構想段階のものや、その時点で移行が計画されていた将来の基盤に関する情報がいくつか説明されていました。

今回のパネルディスカッションは、今年3月に実施された新基盤への移行を経て、記事中で言及のあるようなtemplate toolやサービスカタログを用いたUbieのプラットフォームについて触れています。それらを活用したサービス構築、運用の改善効果や、プラットフォームエンジニアリングの第一歩としてどのような施策が有効かといった踏み込んだ話まで述べています。(アーカイブが見られるようなので興味ある方は是非)

共にディスカッションさせていただいたメルカリ様、リクルート様はUbieと比較して組織規模が非常に大きいため、そのような組織におけるプラットフォームエンジニアリングの実践方法については非常に学びになりました。

さて、今回ディスカッションした内容についてより踏み込んだ内容を、7/9のPlatform Engineering Kaigiの方で発表させていただきます。ぜひ聴きに来ていただけると嬉しいです。

www.cnia.io

CircleCIのfailをSlackにメンション付きで通知する

初めに

CIがコケたらSlackに通知するというのは一般的なユースケースだと思います。 特に、失敗したビルドを実行したユーザにだけメンションが飛ばせると便利ですね。 ここでは会社のメールアドレス = Slackの登録メールアドレス = CircleCIの登録メールアドレスのようなよくある環境を想定します(CircleCIのEnterprise版を使っている場合)。

続きを読む

Terraformのvariables.tfを生成するツールを作った

Terraformのvariablesあるある(?)

  • variablesブロックを変数ごとに書くのがめんどくさい。
  • 色々インフラの変更をした結果、未使用のvariablesが放置されがち

1つ目に関しては変数の数が増えてきたら特にめんどくさくなります。大体の変数がstringかnumber型なので、variablesブロックも大体同じ感じの定義がずっと続くことになります。

2つ目はtflintを毎回実行して未使用の変数を除去すれば良いのですが、不幸にもそれができていないまま変数が1000個くらいに膨れ上がってしまったプロジェクトもあったりします。

そんなわけでvariables.tfをいい感じに生成してくれるツールを書きました。

できたもの

github.com

これがやることはシンプルで、

  • 不足しているvariablesブロックを追加したvariables.tfを出力する
  • syncモードの時は、↑に加えてさらに未使用のvariablesブロックも削除する
  • オプションをつけると、tfvarsファイルも一緒に整理する

それぞれ次のように定義されていたとします。

my_resource.tf

resource "my_resource" "myvar" {
  url        = "http://semvar.co.jp/${var.appname}/${var.env}"
  # title      = var.moge
  expiration = var.expiration_days
}

variables.tf

variable "env" {}

variable "unused" {
  description = "my variable"
}

variable "appname" {
  description = ""
}

dev.tfvars

env = "dev"

unused = {
  "abc"  = "def"
  "bird" = "owl"
}

appname = "myapp"

実行結果はこうなります。

$ tfv -sync --tfvars-file dev.tfvars

variable "env" {}

variable "appname" {
  description = ""
}

variable "expiration_days" {
  description = ""
}

使われてないunusedを除去し、定義されていないexpiration_daysを追加したものが出力されます。

また、dev.tfvars.generatedにはこのようなファイルが生成されます。

env = "dev"

appname = "myapp"

できないこと

真面目にパーサを書いてないので、%{}を含む構文には対応していません。つまり、%{}で囲まれているvar.fooのような変数の利用があっても正しく認識されない場合があります。

そもそも%{}をあまり見ないのでこれは何?って感じなんですが、これは文字列の中に制御構文を埋め込む記法です。

developer.hashicorp.com

公式サイトの例にあがっているのが次のような書き方です。

"Hello, %{ if var.name != "" }${var.name}%{ else }unnamed%{ endif }!"

%{}再帰的な構造を持つことができるので、行ごとにGoのregexpでパターンマッチする方針だと上手く扱えませんでした。ただ%{}を使うことがあまりないので、大体のケースでなんとかなると思います。

Request is missing Authentication Token: OperationErrorになる

StepFunctionをlambda(Go 1.x)からキックするようなコードを書いてる時に、StartExecutionを呼び出すと次のようなエラーが出た。

operation error SFN: StartExecution, https response error StatusCode: 400, RequestID: xxxx-xxxx-xxx-xxxx, api error MissingAuthenticationTokenException: Request is missing Authentication Token: OperationError

lamdbaのロールを変更してみても解決せず、ggってもそれらしいのが出てこないのでなんだこれってなってた。

続きを読む

ECSヘルスチェックベストプラクティス

ECSの文脈でヘルスチェックといえば、次の2通りが挙げられる。

  1. ELBのターゲットグループで指定するヘルスチェック
  2. タスク定義のコンテナ定義パラメータで指定するヘルスチェック

1はECSではなくELBの機能なので、これら2つを組み合わせて使う場合に限定される。

続きを読む

TerraformerでNewRelicのリソースをTerraformに取り込めるようにした

あるプロダクトの監視にはNewRelicを使っているが、手作業で作られたNewRelicのアラートが大量に放置されていた。 そのため、どのアラートが作成されているのかがわからない、不要なものもわからない、レビューがやりにくいといった問題があった。

そこでTerraformerを使ってそれらを取り込みコード化することができたので、方法を記載する。

続きを読む