Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

HashiCorp Terraform & Vault Enterprise 勉強会 in 金沢に参加しました

こちらの勉強会に参加してきました。HashiCorp Japanより伊藤さんをお招きしての開催。ありがたい。

connpass.com

Terraformは実戦投入したことないのですが、個人で触ったことがあるレベル(入門中)。Vaultの方は名前だけ聞いたことあるけど触ったことはないという前提で話を聞いてきました。

ここからはメモです。

  • インフラの理想状態をコードで表してTerraformによって実際に適用されるイメージ
  • TerraformのEnterprise版があるの知らなかった
    • SaaSとして提供されている(Private install版もある)
    • GitHubの特定ブランチに対してpush or mergeされるとフックしてtfファイルが適用される。CI/CDのワークフローが完成されている状態
    • 複数ユーザーが操作してもStateの共有を良い感じにしてくれる
    • ガバナンス(Policy as code)
    • 適用時のログが残るので監査的にも良さそう
  • Terraformはコミュニティベースのモジュールレジストリがあって、良い文化だと思った
  • Vaultの主な機能: シークレットの一元管理、アイデンティティベースのアクセス、暗号化
  • 動的なシークレット(クレデンシャル)の発行はアツい
  • Encrypt as a Serviceとしての側面も持っている
  • AWSのサービスで言うと、VaultはSecretsManagerとKMSとACMが全て含まれているようなイメージ

インフラの構成の潮流としてオンプレ→クラウド→マルチクラウドという風になっていて、自分の携わっているところではAWS内で完結しているのでマルチクラウドのイメージはあまりないけど、基本はAWSで構築して特定のサービスはGCPまたはPaaSでみたいな構成は選択肢としてはありえると。そうなったときに、インフラを管理するのにTerraformを使うと便利な場面がでてきて、シークレットおよびクレデンシャルの管理にVaultが力を発揮する場面がでてくるのだなー、とHashiCorp伊藤さんの説明を聞いて思いました。また、HashiCorpが提供しているプロダクトとしてはNomadとConsulというものもあって、これらもマルチクラウドという文脈に沿っていて思想がプロダクトとして体現されていて良いなあと感じました。トップページに軽くこの辺の思想が載っていました。 https://www.hashicorp.com

Hashicorp様よりステッカー頂きました(TerraformとConsul)。

懇親会

懇親会は丸奄。お魚美味しかった。HashiCorp伊藤さんと経験のあるエンジニア達がいる席になって、ディスカッションが盛り上がっていて楽しかったです。自分はあまり発言できなかったけど、素振りも業務も経験を増やしていろいろ自分はこう思うって言う話ができるようになっていきたいですね。

Consulの役割からマイクロサービスの話になり、昔SOAPというのがあったけど今で言うとgRPCがあってこれはうまくできてるし使われてるよね、マイクロサービスが現実的なソリューションになっていてやっと時代が追いついてきたよねっていうような話が面白かったです。歴史は繰り返す、というのは良く言われることですが、こういうところからも歴史を学ぶのは意義があることだなあと思います。

これはブリを燻したやつ。香りもよくめちゃくちゃ美味しかった。

二次会は串カツ田中。一次会で結構お腹パンパンだったはずなのに、串カツならなぜか食べられてしまう不思議...。

Rubyで確定申告楽したい2019

今年も無事に確定申告が終わりました。昨年3月のkzrbで確定申告用のスクリプトを作った話をしたのですが、その続き。

www.blogaomu.com

去年の時点では以下の機能が実装されていました。

  • 金融機関からダウンロード済みのCSVファイルを読み込む
  • 金融機関毎にCSVデータをパースしてオブジェクトの配列にする

特定の支払いを抽出するのはできていたのですが、経費としてfreeeに登録するのは手動で行っていたのでfreeeにインポートできる形式でファイル出力する機能を実装しました。今回実装したのは以下になります。

  • 金融機関毎のデータオブジェクトをfreeeインポート用データオブジェクトに変換する
  • freeeデータオブジェクトの配列をCSVファイルに出力する
  • 一連の処理を rake タスク化

freeeの取引インポート機能についてはこちらを参照。 support.freee.co.jp

処理の詳細

こんな感じでデータを表すクラスと処理(=今回はCSV出力)を扱うクラスを作成。属性の名前はfreeeさんのhtmlから拝借しました🙇 Freee#export の datas には FreeeData の配列が渡ってくる想定。

require 'csv'

class FreeeData
  attr_reader :deal_type # 収支区分
  attr_reader :admin_number # 管理番号
  attr_reader :date # 発生日
  attr_reader :settlement_date # 決済期日
  attr_reader :partner # 取引先
  attr_reader :account_item # 勘定科目
  attr_reader :tax # 税区分
  attr_reader :amount # 金額
  attr_reader :tax_calculate_type # 税計算区分
  attr_reader :tax_amount # 税額
  attr_reader :description # 備考
  attr_reader :item # 品目
  attr_reader :section # 部門
  attr_reader :default # メモタグ
  attr_reader :transaction_date # 決済日
  attr_reader :walletable_name # 決済口座
  attr_reader :settlement_amount # 決済金額

  def initialize(**params)
    params
      .select {|k,v| self.methods.include?(k) }
      .each {|k,v| self.instance_variable_set("@#{k}".to_sym, v)}
  end
end

class Freee
  def export(datas, filename)
    option = {
      encoding: 'Shift_JIS'
    }
    CSV.open(filename, 'wb', option) do |csv|
      csv << ['収支区分','管理番号','発生日','決済期日','取引先','勘定科目','税区分','金額','税計算区分','税額','備考','品目','部門','メモタグ(複数指定可、カンマ区切り)','決済日','決済口座','決済金額']
      datas.each do |d|
        csv << [d.deal_type, d.admin_number, d.date, d.settlement_date, d.partner, d.account_item, d.tax, d.amount, d.tax_calculate_type, d.tax_amount, d.description, d.item, d.section, d.default, d.transaction_date, d.walletable_name, d.settlement_amount]
      end
    end
  end
end

初期化処理はこちらを参考にしました。ありがとうございます。

tex2e.github.io

そして、もともと実装済みの金融機関毎の処理に FreeeData オブジェクトへ変換する処理を実装。なんかデータ変換ロジックって誰が知っていると都合が良いのか分からず、いったん金融機関データクラスに実装してしまった。ここで時間を使うよりも確定申告処理に時間を使いたかったので雑になったのは言い訳です。

# 実装イメージ(なんかしっくりこない)
# 金融機関のデータを表すクラス
class HogeBankData
  attr_reader :date
  # ...

  def convert_to_free
    # 銀行データは FreeeData について知っている必要がある???
    FreeData.new(
      date: date.strftime('%Y/%m/%d'),
      # ...
    )
  end
end

# 処理クラス
class HogeBank
  def import(filename)
    # ...
  end
end

ともかく、金融機関のデータリストからfreeeインポート用のデータに変換してファイルに出力するという処理の流れを作る準備ができました。今までどおりreplでポチポチやってもいいのですが、さすがにだるいので rake タスクにしてコマンド一発でファイル出力できるようにしておきました。

# これも実装イメージ
$LOAD_PATH.push('lib')

require 'hoge_bank'
require 'fuga_card'
require 'freee'

task :export do
  hoge = HogeBank.new
  hoge.import('data/hoge_bank/data.csv')
  f_data = hoge.parsed_data.select {|d| d.is_transaction_for_freee? }.map {|d| d.convert_to_freee }
  fuga = FugaCard.new
  Dir.glob('data/fuga_card/*.csv') do |csv| # 月別にCSVファイルがあるパターン
    fuga.import(csv)
  end
  f_data += fuga.parsed_data.select {|d| d.is_transaction_for_freee? }.map {|d| d.convert_to_freee }
  
  freee = Freee.new
  freee.export(f_data, 'freee.csv')
end

感想

  • 目視確認して手入力していた去年に比べて自動化が進み楽になった
  • とはいいつつ申告期限もあったので、雑に作った節は否めない
  • マッピングのところは泥臭くなってしまう
  • 何年か振りに Rakefile 触った
  • 来年は金融機関のサイトからCSVファイルをダウンロードするところを自動化したい(スクレイピング行けるんだろうか)

Kanazawa.rb meetup #78 に参加しました #kzrb

実は77にも参加していたけどブログ書くの飛ばしてしまった...。なので2019年初のkzrb参加日記になります。

kzrb.doorkeeper.jp

buffbuffのテストコードを書く

github.com

ひとまずgem化するところまではできて落ち着いたのですが、今後メンテナンスしていくときにはテストコードが必要だろうと思い、もくもく会で書いていました。しかし Buffbuff::Command のspecを書いている途中で時間切れ。 主に以下の点でハマっていました。

あまり記事も見当たらなかったので、ベースとしているライブラリのthorのテストコードから同じようなことやってないかなーと調べるのに時間を費やしていました。

懇親会

MJダイニング
〒920-0853 石川県金沢市本町2-12-4 ステーションタウン小森1F
4,000円(平均)
r.gnavi.co.jp

www.hotpepper.jp

冬キャン、組織の文化と採用、勉強会やカンファレンスの会場問題、インシデントとどう向き合うか、その他オフレコトークについて話していました。珍しく日本酒を多く飲んでた記憶。

おわりに

来月はHashiCorpプロダクトのTerraform, Vaultについての勉強会です!ぜひご参加を。

connpass.com

JAWS-UG金沢 #38 に参加しました #jawsug

jawsug-kanazawa.doorkeeper.jp

re:Invent 2018の振り返りがメインの会でした。私は以前から要望のあったDockerコンテナ運用の話をしてきました。

発表

以前からJAWS-UG金沢の中でDockerコンテナの運用について話してほしいと言われていて、満を持して今回発表ということになりました。お手伝いしている zozo.com の構成をほんのり紹介しながら Elastic Beanstalk を使ったDockerコンテナ運用についてまとめました。Webアプリケーションの実行基盤っていろいろ選択肢があって、さらにDockerを使うにしても今なら Kubernetes を使う選択肢もあるし Heroku も選択肢に含まれるのではと思います。今思うと、スライド内で紹介したEBを選んだ理由は後付けの部分が少しあったりしますが実際使ってみて感じたところです。

re:Invent 2018 振り返り

www.slideshare.net

なんと自費で re:Invent に参加した方がおられて発表していただきました。すごい。。

あとは re:Invent で発表された新サービスや新機能についてお互いに発表し合うというコーナーも設けられました。DynamoDB TransactionやLambdaのCustom runtime サポートについて注目している人が多かった印象です。

docs.aws.amazon.com

docs.aws.amazon.com

機械学習勉強会レポート

www.icloud.com

昨年福井で行われた機械学習勉強会について発表していただきました。Amazon SageMaker を使ったハンズオンが行われて簡単に画像分類(手書き数字)できるよという内容だったそうです。

感想

仕事でお世話になっている cozima さんが東京から参加してきてくれ、北陸で一緒に酒を飲めたのが感慨深かったです。 2月はJAWS DAYSに行くぞー。

2018年個人的振り返り

毎年やってるやつです。年が明けてから振り返るのも悪くはないでしょう。

www.blogaomu.com

仕事

2018年も引き続きZOZOのお仕事を手伝っておりました。

zozo.com

立ち上げ→リリース→運用というフェーズに変わって、(マイクロサービスの)チームのリーダーから1メンバー、そして技術課題を解決するチームの1メンバーと自分の役割も変わった1年でもありました。その傍らでインフラとPythonサーバーチームのお手伝いをしていて、相変わらずいろんなところに顔を出す人として動き回っていました。

チームのリーダーとしてやっていた頃はコミュニケーションの質・量ともに課題があり行き詰まってしまったので、自分からこれ以上リーダーの役割はできないと相談し、実際に1メンバーとしての役割に移してもらいました。自分の設計スキルやそれを言葉にして伝えるスキルが足りなかった、という要因も少なくはないのですが、オフィス勤務のメンバーがマジョリティでリモート側がマイノリティになってしまう環境的要因もあったのかなーと感じています。

1メンバーとしての役割に戻った後は、実装、レビューのサイクルをひたすら回すという感じでリリースまで走り抜け、運用段階に入ってくると技術課題を解決するチームに移りました。(チームといっても2人ですがw) ここでは日々の開発で困っていることを解決したり技術的方向性を決めたりするのが役割で、具体的なタスクを一つ上げるとCI/CDを速くするというのに取り組んでいるところです。ここの部分って地味ではあるんですが、関わってるメンバーに最も見られる部分でもあるので今まで以上にやっていかないとなという気持ちになっています。

いろんなところに顔を出す人としては、どうしてもあれもやらなきゃこれもやらなきゃと考えてしまって時間が足りなくなってしまうのですが、2018年はScalaとDockerに重点を置いたのかなと思います。2019年はマイクロサービスやKubernetesの思想とパターンを身に付けたいです。

コミュニティ活動

定期的な活動としては、Kanazawa.rb 11回、JAWS-UG金沢 5回に参加しました。2018年の裏目標としては、発表(1回の質・量にこだわらず)をたくさんする、というのがありまして Kanazawa.rb ではそこそこできたかなと思います。発表の準備をする中でも特にこの2つに気付けたのはよかったのかなと思いました。

  • 資料をディスプレイに映して声を出して練習する
  • だいたい時間オーバーするので削る作業を行う(何を大事にして話すか決める)

発表はまだまだ慣れてはいないので、2019年も継続してやっていきたいです。

大きなカンファレンスとしては、Japan Container Days v18.04、Scala関西Summit 2018の2つに参加しました。カンファレンス参加はかなり久しぶりでしたが、やはり刺激になるし普段は一人でやっているので情報を仕入れるという点でも良いですね。

www.blogaomu.com

www.blogaomu.com

また上記とは毛色が異なるところでは、ホクリク魅力ソンというアイデアソンに参加しました。ブログ記事はまだ書けてないのですが💦 アイデアソンには初めて参加し難しさも覚えながらも自分の感心のあるスポーツというトピックで技術の観点からアイデアへの貢献はできたのかなと思います。

riac.nict.go.jp

Uターンして2年過ぎましたが、こうして技術的なコミュニティ、さらにフットサルやサッカー観戦などでも知り合いが増えてきて、拠り所が複数できているのはありがたいなあと思います。普段はSlackやzoomでは繋がってるけど一人で作業していることがほとんどなので、雑談したり相談したりそういうことができる場は大切だなと感じています。

個人開発

Kanazawa.rb の運営から派生して以下のツールを作りました。なんかこんなのあったら良さげ?という会話ベースのところから始まったのですが、何とか形にできたのはとても良かったです。自分の作ってるプロジェクトはだいたい途中で挫折しがちなので💦

github.com

2019年は MH-Z19 というCO2センサーを手に入れたので、これを使ってお部屋のCO2濃度検知くんを作りたいなーと考えています。これも無事に形にするところまで持っていきたい。

上手い酒を飲めるように生きていきます。

buffbuff をgem化するにあたってのメモ

概要

buffbuff をgem化しました。

github.com

当初は clone してそのまま利用するという作りにしていたのですが、gem としてインストール(from GitHub)できるように修正を行いました。この作業でハマった点や気付いた点などを書き残しておきます。

メモ

Kanazawa.rb meetup #76 に参加しました #kzrb

DMM.com 金沢南町営業所のイベントスペースをお借りして開催でした。広くて画面がでかくてよいですね。

f:id:TAKAyuki_atkwsk:20181215133410j:plain

kzrb.doorkeeper.jp

今回は年末恒例のLT大会回でした!参加者全員発表だよ、わいわい!

話したこと

少し前から作っていた Buffer への投稿ツールの話をしました。

github.com

LTではツールを作るモチベーションのところと実際のコマンドについて話しました。当初話の内容を考えているときは、どういうライブラリを使っていてとか作っていてこう思ったとかということも含めようとしていたのですが、練習で喋ってみると優に5分をオーバーしたので泣く泣く削ることにしました。なので、技術的な話というよりも問題をどう解決するのがいいかなっていうところを話の中心に据えたイメージです。

ということで、削ってしまった部分の作って思ったところをいくつか紹介します。

ツールを作った感想

  • bundle gem コマンドで gem のひな形を作ってくれるので、最初からこれを利用すれば良かった
    • 久しぶりにRubyでプロジェクト作ったのですっかり忘れていた...
    • require でlib以下のソースコードを参照するのに上手くいかない箇所があった
    • 自力では解決できなさそうなので、他のgemを参考にしようとした
    • いろいろ調べていたら以下の記事が参考になった
    • https://tech.crevo.jp/entry/2018/10/02/150430
  • VSCodeで開発してみた
    • 今まではVimだったけど
    • オススメプラグインあれば教えてください><
  • Thor ライブラリ便利だった
    • ANSIカラー表示とかYes/Noインタラクションを簡単に実装できる
    • シェルスクリプトで実装しようとするとまあまあだるいのでありがたい
  • Arrayタイプのオプション指定方法が好みじゃない
    • オプション値の切れ目が分かりづらい
    • command <Arrayタイプのオプション> <引数> という方法でコマンド実行すると引数もオプションの値としてパースされる
    • docker run--env みたいなのが好み
      • ex.) docker run --env VAR1=value1 --env VAR2=value2 ubuntu bash

今後はgemとしてインストールできるようにする(おそらくテンプレートディレクトリが上手く読めなくなるはず)というところが直近の修正ポイントになります。 @kiyohara さんも早速使いたいと言ってくれたので良かったです!

懇親会

ピザを食べつつ技術や組織、就職、転職、スプラトゥーン(自分はついていけなかったけど)などの話をしてました。ピザの量、調整するの難しいですね!注文時はテンションが上がってどうしても多めに頼んでしまうw

f:id:TAKAyuki_atkwsk:20181215171227j:plain

今年も Kanazawa.rb お疲れさまでした。また来年もゆるゆるやっていきましょう。