ようへいの日々精進XP

よかろうもん

2020 年 01 月 01 日 (水)

ジョギング

  • 引き続き, お休み
  • 右足の大腿裏の痛みが続いている
  • 夕方, 少し散歩してみたけど突っ張りが続いている

お雑煮

ゆっくり起き出してお雑煮を作る. ここ数年は自分がお雑煮を作る流れになっている. 今年は茅の舎の出汁をとって酒と醤油で味付けしたシンプルなお汁に焼いた餅と蒲鉾, 三つ葉のシンプル構成. なかなか美味しかった.

ニューイヤー駅伝

スタートから観戦. ランナーを見ていて自分が走れていない状況が辛くて切なかった... あー, 早く足が治って欲しい...

今年の目標

テーマとしては, 以下の振り返り記事にも書いた.

inokara.hateblo.jp

以下の三つ.

  • 健康
  • 学び
  • 家族

健康. なんだか何かやる度に年齢を感じるようになってきて久しいけど, より健康には気を遣いたいなと. 毎朝のジョギングは出来る限り続けていくつもりだけど, これを書いている時点で足を痛めているので走れていない. しかも, 2/2 には別府大分毎日マラソンに出走予定なのに何をやってるんだ. 取り急ぎは足を早く治すこと. そして, 走り続ける以上は出来るだけケガをしないようにケアを充実させること. 話しはそれからだ.

学び. 雑な言い方かもしれなけど, 学び続けなければエンジニアとして死ぬしかない. インプットとアウトプットどっちも頑張っていこうと思う. 本を N 冊読んで, ブログ記事を N 個書いて, 登壇は X 回という具体的な設定はした方が良いかもしれないけど, 今日の時点では思いつかないので書かないでおく. 年始に具体的な内容を決めておくよりも, 月単位で目標を決めて, 月末に振り返るみたいな感じでもいいのかなと, 以下のブログ記事を読ませて頂いて感じている.

blog.a-know.me

自分のリリースノートなんて面白いなあ.

家族. 結婚 9 年目, 今年も奥さんと二人で吉本新喜劇のようなドタバタで笑いの絶えない家庭をつくっていきたいなと考えている.

2019 年 12 月 31 日 (火)

ジョギング

  • お休み
  • 右足の大腿裏の痛みが続いている

ほんとに, とにかく早く足が良くなりますように...

晦日

夕飯にお鍋にお蕎麦を入れて食べた. あとはダラーッと夫婦で年末の特番を見てゲラゲラ笑っていた.

振り返り

inokara.hateblo.jp

今年も一年ありがとうございました. 来年も宜しくお願い致します.

初老丸を支えた技術 2019 〜 2019 年の振りかへりと何か, ミントとハーブを添へて 〜

tl;dr

2019 年を振り返ってみたいと思います.

YAMAP では 1on1 が導入されていて, 隔週 (本来は二週間に一回らしいけど) で自身を振り返ったり, 上長と雑談する時間が自分的にはとてもしっくりきてて良い時間だなーと思っていて, その中で自身を振り返る大切さを感じていました. 振り返ることで, 自分が何をやってきたのかということはもちろん, YAMAP の一員として, これからの N 週間は何をやるべきなのかを考える機会になっています.

たいした文章でもないのに, 前置きが長くなってしまいましたが, 「振り返る」という作業がとても大切なんだなと思った初老丸が, 以下の記事をベースに 2019 年を振り返ります.

inokara.hateblo.jp

YAMAP 入社

2019 年 1 月 4 日から, YAMAP という会社で働いています.

corporate.yamap.co.jp

40 歳を超えて, まさか転職するとは思っていませんでしたが, 代表の春山や CTO の樋口, @morygonzalez から色々とお話を伺って, YAMAP の魅力に惹かれて気付いたら転職していました.

YAMAP での仕事は前職と同様にインフラエンジニ屋. 幸い, YAMAP ではインフラとして AWS が利用されていたので, 前職で得た知見が役立つ場面が多々有りました. しかし, 前職では 4 年以上自宅に引きこもってのリモートワークであった為, 入社当初はオフィスに出社するという作業が辛くて, 出社する意義を自分に問いかけながら出社していたことは良い思い出です.

YAMAP 入社後, 各種プロジェクトのインフラ構築をはじめ, インフラ周りの改善を細々と続けてきましたが, 元々, @morygonzalez をはじめ, 開発チームのメンバーが片手間ながら, Docker やサーバレス等のモダンな技術を導入してくださっていたので, 自分が血反吐を吐きながら作業するということはなく, とても楽をさせて頂いたことには感謝しかありません.

portalshit.net

portalshit.net

楽をさせて頂いた分で, 自分が頑張れそうなところで, 自分なりのバリューを出せた... (かも), いや, 出せたはずですので, この勢いを大切に 2020 年も頑張っていければなあと考えています.

inokara.hateblo.jp

閑話休題, YAMAP に入社して, 驚いたというか, 強く印象に残っているのが以下の三つ.

  • ユーザーの中に熱狂的な YAMAP ファンがいらっしゃる
  • YAMAP のカスタマーサービスはすごい
  • YAMAP 社員はとにかく朝が早いし健康的

ここまでユーザーに愛されているのか!と驚くことが度々. YAMAP ユーザー向けの幾つかのイベントに裏方として参加してみましたが, 熱心なユーザーさんからの質問や要望が次から次に寄せされるのを目の当たりにして良い意味で「エライ会社に入ってもーた」と思った次第です. もちろん, 愛される故にクレーム等もいただくことも多々有ると聞きますが, その質問や要望, クレームをそつなく裁き, ユーザーさんとの窓口になっているカスタマーサービスのメンバーの仕事振りには神々しさすら感じることがありました.

そんな YAMAP を支える社員 (メンバー = YAMAP では社員のことをメンバーと呼んでいます) の皆さんは, とにかく朝が早い. 過去に 8 時半始業だったということも影響していると聞きますが, フレックスタイム制コアタイム開始の 10 時には社員全員が仕事を開始している様子は, 良い意味で IT 系ベンチャー企業らしからぬ姿に驚きました. また, 登山アプリの会社らしく, メンバーのほとんどが登山をはじめとするアウトドアが趣味で, 暇さえあれば山に登っているメンバーもちらほらと. このあたりの話は, 以下の記事にも触れて頂いております.

pr.forkwell.com

ご縁があって, 上記のような他社さんのメディア記事に取り上げて頂いたりして 2019 年はエキサイティングな YAMAP 一年目でした. YAMAP というサービスの運営に携わることで, サーバーの向こう側にいるユーザーさん達の声が聞けたり, 自分自身もユーザーとして YAMAP を利用することで見えてくる良いところや悪いところ等, 自分がこのサービスに関わっているんだという強い自覚が生まれた一年でした. 残念ながら, サービスの質を向上するような具体的な行動を取ることは出来なかったかもしれませんが, ここで芽生えた強い自覚を大切にして, 二年目ももっとエキサイティングな一年になるように精進したいと考えています.

うた, かんた, そして命

妻は小学校, 中学校時代の同級生です. 同級生ということで, 恋人同士というよりも, 友達の延長線上で夫婦生活をやっているような感じで, 喧嘩もありつつも毎日馬鹿言ってゲラゲラ笑ったりしながら暮らしています. きっと, これからも死ぬまでゲラゲラ笑いの絶えない夫婦でいたいなと思っています.

そんな「お笑いままごと」のような生活を送っている我々夫婦の間に一つの小さな命が宿ったことが判ったのが 2019 年の 1 月頭. 数年前から不妊の治療を続けて, 結果が出ずに治療の継続を諦めた矢先でした. ままごと夫婦の我々は喜々として生まれてくるであろう子供の名前を考えた結果, 女の子だったら「うた」, 男の子だったら「かんた」にすることにしました. 名前を決めると, 不思議とまだ見ぬ我が子に対しての妄想が膨らみ, 背中に乗せてリビングをお馬さんごっこをやってみたり, 音の出るおもちゃを Amazon で選んだり, これから始まる親子三人の生活を楽しみにしていました.

しかし, 残念ながら, うた, かんたはこの世に生を受けることはありませんでした. もし, 神様がいるのであれば, 我々夫婦には子供は不要と判断されたんでしょう. とても残念ですが, 我々夫婦はそれを受け入れることにしました.

inokara.hateblo.jp

2019 年も親の虐待によって小さい子供の尊い命が奪われるいたましい事件を多く目にしました. それらの事件を見る度に, 「我が家に生を受けていれば...」「なんで, こんな親には子供が出来て, 我が家には...」と何度となく夫婦で話をしました. もちろん, 我々夫婦に子供がいたとして, 虐待は絶対にしないとは言い切れませんが...少なくとも, うた, かんたに出会うことが出来なかった時に感じた, 痛みや悲しみによって, 「人を思いやる優しさ」,「命の重み」, 「この世に生をうけることの奇跡」これらを改めて学ぶことが出来たと感じています. うたとかんたを失った痛みはまだ癒えることはありませんが, 親としての自覚や先述のような「命」について, 多くのことを考えさせてもらった時間であったことは間違いありません.

また, 今年は母方の祖母 (ノリばあちゃん) が 96 歳でこの世を去った年でもあります. 自分は初孫ということで, 本当にかわいがって貰った記憶が鮮明です. 夏祭りにワガママを言っておもちゃを買って貰った後, おもちゃ屋さんから祖母の家に戻るまでの上り坂, なぜか特に鮮明に記憶に残っています. 祖父が 2010 年くらいに亡くなってから, 独りで家に居て本当に寂しそうにしていたので, もしかしたら, やっと祖父のところに行けるということで喜んでいるのかなと遺影を見上げて感じた次第です. 自分のくだらないことをよく喋って周りを笑かそうとする一面はノリばあちゃんから受け継いだものなのでは... と思うくらいによく喋るし, よく笑うばあちゃんでした.

f:id:inokara:20101102151935j:plain

あの世でじいちゃんと仲良くね. ばあちゃんありがとう.

命, 様々な命が生まれては召されていく, それは当たり前のようで, 昨日まで何事なく過ごしている命が突然消えてしまうということもあります. JAWS-UG 福岡を一緒に盛り上げていた藤崎さん, 彼もその一人でした. 藤崎さん, その名の如く, 本当に優しい人でした. 福岡に移り住んで初めて呑んだのが藤崎さんでした. 福岡のコミュニティのことを何も知らなかった自分をいきなり JAWS-UG 福岡の運営メンバーとして声を掛けてくれたのも藤崎さんでした. ガジェットが好きで会う度に違うスマートフォンやガジェットを持っていて「よっ独身貴族!」とかイジってもいつも笑顔でなんやかんや言い訳を言って周囲を和ませてくれていた姿は今でも忘れません. 福岡だけではなく, 全国各地のコミュニティを超えたエンジニア達から愛されていて嫉妬すら覚える存在でしたが, そんな藤崎さんには本当に感謝の言葉しかありません. ありがとう.

ただ, これからもっと JAWS-UG 福岡や福岡の技術コミュニティを盛り上げていこうとした矢先に... 藤崎さんの馬鹿野郎.

なぜ走るのか

2015 年の初マラソン以降, 何度かフルマラソンを走ってきました. 大雨の中, 低体温症になってガタガタ震えながらゴールした 2017 年の鹿児島マラソンは一生忘れません.

inokara.hateblo.jp

2019 年の最初で最後のマラソンだった別府大分毎日マラソンでは自己ベストの 2 時間 51 分 38 秒で走り切ることが出来たのはとても嬉しいゴールでした.

inokara.hateblo.jp

なぜ自分は走るのか, 目先のことを話すと, ストレス発散, ビールを美味しく飲む為, そんなオリンピックを目指すようなランナーが聞いたら怒りが湧いてしまうような不純な理由 (動機) ですが, そんな単純な理由だからこそ続けられるのかなと考えています. 改めて考えていますが, 走るのに特に深い理由なんて無いような気がしています. そこに道があるから, そこに広場があるから, 靴があるから, そんな何気ない理由というか, そんな境遇の中で生活しているので, 気付いたら靴紐を結んで駆け出しているそんな感じです.

これからも, 不純な動機で足が壊れて走れなくなるまで走り続けるんだと思います. (と言いつつ, 今, 足を痛めていて走れません... 涙)

コミュニティ

藤崎さん行きつけのまぐろ料理屋さんでの密談をきっかけに始まった JAWS-UG 福岡のもくもく会シリーズ. 毎度, ふざけたサブタイトルで福岡のみならず, 日本の IT 系コミュニティがざわついたと聞きます (嘘です).

tabelog.com

jaws-ug-kyushu.doorkeeper.jp

とにかく, もくもく会は楽しかったなあという印象です. ほとんど雑談で終わる会もあったし, それなりのアウトプットを出せた会もありました. また, 「もぐもぐ会」と称して, 俺たちの戦国焼鳥家康で呑んだり, 水炊きをつついたりした会もありました. ちょっと年末になってお休みすることが多くなりましたが, それももくもく会の良いところでもあり, 気軽に来て, 気軽に帰る, 気軽に開催して, 気軽にお休みする, こんなコンセプトでゆるーっと長く続けれればなあと考えています. とにかく, こんな感じで続けられるのも一重に JAWS-UG 福岡メンバーの協力のおかげであり, 参加してくださる皆さんのおかげでもある考えています. 本当にありがとうございます.

JAWS-UG 福岡と合わせて, 福岡での CircleCI のユーザーコミュニティ立ち上げをお手伝い (と言っても, ミートアップの会場を提供させて頂いただけですが...) させて頂きました. CircleCI という, 世界中のエンジニア達が当たり前のように (ちょっと大げさかな) 利用している CI/CD サービスを福岡でより普及させる為に今後も微力ながらサポートしていきたいと思います. そして, 何よりも自分が CircleCI について多く学ぶ機会が得られればなあと妄想しております.

circleci.connpass.com

その他, Fukuoka.rb にもチョコチョコを参加させて頂いたりして, インフラ界隈の枠に留まらない福岡のエンジニアの皆さん達と出会うことが出来たのは本当に良かったと思います.

fukuokarb.connpass.com

更に, 今年は Serverless Days Fukuoka という割と大きめのカンファレンスに運営メンバーとして関わらせて頂きました.

inokara.hateblo.jp

自分にとっては, イベントの運営以外にも様々な学びがありました. 裏方として, 会場の手配や T シャツの発注等, 普段経験することが出来ないタスクを裁きつつ,セッション等を聞きながら, すごい時代の真ん中で生きてるんだなという武者震いにも似た感覚がありました.

2020

2020 年, どんな年になるんだろう... という思いを巡らせながらここまで書いてきました. 2020 年の目標等は年明けにでもちゃんと書こうとは思いますが, 以下のような柱を持って頑張ろうと考えています.

  • 健康
  • 学び
  • 家族

健康, 「元気があれば何でも出来る」というアントニオ猪木の言葉ではありませんが, 健康であることは何事にも代えがたい財産だと考えています. マラソンしたり, 来年はトレランも頑張っていきたいので, なおさら健康には注意していきたいと思います.

学び, YAMAP のオフィスの入り口付近に以下のような言葉が貼られていました. (YAMAP のオフィスには色々な名言が壁中に貼られています)

明日死ぬと思って生きなさい、永遠に生きると思って学びなさい

これは, マハトマ・ガンジー が言った言葉だそうです. 解釈は人それぞれだと思いますが, 生きていくには常に学び続ける必要がある, 学びを止めると永遠に生きることが出来ないということと自分は解釈しています. YAMAP のこともまだまだ学びが必要ですし, エンジニアとしてこれからも学びを止めないようにしていきたいと思います.

家族, 2019 年も色々なことがありました. 奥さんには本当に色々と苦労をさせてしまいました. 苦労をさせてしまったにも関わらず, いつも献身的に自分のことを支えてくれる奥さんには本当に感謝しかありません. 来年は少しでも奥さんの苦労を減らせるようにしたいと考えています. また, 実家の両親にも色々とお世話になった年でもありました. 来年は少しでも親孝行出来ると嬉しいです.

ということで, 今年も皆さんには大変お世話になりました. ありがとうございました. 来年も宜しくお願い致します.

(完)

2019 年 12 月 30 日 (月)

ジョギング

  • 博多天神 50 min
  • 右足太ももの痛みがおさまったかなーと思って走り出したけど, 20 分くらい走ったところで強い痛みが...
  • 辛い...けど, これが今年の走り納め

ほんとに, とにかく早く足が良くなりますように...

奥さん

ここのところ体調がイマイチ. この正月は無理せずにゆっくりと休んでほしい.

色々と

やりたいことがあるんだけど, なぜかズーッとだらだらと過ごしてしまった...(完

2019 年 12 月 29 日 (日)

ジョギング

  • 引き続き, お休み
  • やっぱり休みは必要なようで足はだいぶん良くなってきた感じ

とにかく早く足が良くなりますように... 明日は走りたい.

風邪

っぽい. 喉は痛いし, 体のだるさもあるので終日自宅でゆっくりと. 奥さんも, 先週頭くらいから体調を崩しているのでこの冬休みはゆっくりと静養したい.

夕飯

鍋. 久しぶりに美味しかった.

冬休みの自由研究 (1) 〜 LocalStack と CircleCI を使って Lambda の動作確認環境を割と苦労して作った 〜

追伸

書いた後で気付いたけど, Node.js のランタイムは 12.x もサポートしていたので, Node.js 10.x ではなく, Node.js 12.x にアップデートしたほうが良さそう...

という時にも, このような動作確認環境を作っておくとシュッと確認出来るので良いよねというお話でした.

tl;dr

冬休みに本を三冊読む目標を立てていますが, たまたま年明けから Lambda の Node.js 8.10 を Node.js 10.x にアップデートする作業を控えているので, 念の為の動作確認環境を作ろうと LocalStack に手を出してしまったのでメモです.

やりたいことは, LocalStack で Lambda の疑似環境を起動して, その Lambda 実行環境に対して, 既存の Node.js 8.10 ランタイムで動かしている関数をデプロイして動作確認を行うところまでです. せっかくなので, テストは CircleCI でも回せるようにして, 今後の追加開発等の際の動作確認でも使えるようにしたいと思います.

教材

教材は, 以下のリポジトリにアップしています.

github.com

このプロジェクトは, 以下のプロジェクトをフォークさせて頂いております.

github.com

このプロジェクトは, CloudWatch Alarm やいくつかのサービスについて SNS を介して Slack に通知する Lambda ファンクションです. YAMAP 社内でも利用させて頂いております.

今回は, このプロジェクトに以下の機能を追加します.

  • docker-compose を利用して LocalStack を起動し, ローカル環境に Lambda の実行基盤を起動出来るようにする
  • 同じく, docker-compose を利用し, Slack の疑似エンドポイントとして httpbin.org 環境を起動出来るようにする
  • Lambda を LocalStack の Lambda 基盤にデプロイし, AWS CLIaws lambda invoke を利用して関数を実行出来るようにする
  • aws lambda invoke は, Bash のテストフレームワークである bats を利用して実行出来るようにする

最終的には, bats でのテストを Node.js 8.10 と Node.js 10.x 環境で実行してみて, 双方でちゃんと動くのかの確認を取ることになります.

詳細

リポジトリを見てね

と, 言いたいところですが, 個人的に苦労した部分等を書いていきたいと思います.

LocalStack

以下のような docker-compose.yml でシュッと起動します.

version: '2.1'

services:
  localstack:
    image: localstack/localstack
    ports:
      - "4567-4597:4567-4597"
      - "18080:8080"
    environment:
      - TMPDIR=${TMPDIR- }
      - SERVICES=
      - DEFAULT_REGION=us-east-1
      - AWS_XRAY_SDK_ENABLED=true
      - DATA_DIR=${DATA_DIR- }
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - LAMBDA_EXECUTOR=docker
      - LAMBDA_REMOTE_DOCKER=true
      - LAMBDA_DOCKER_NETWORK=project_my_net
      - DOCKER_HOST=unix:///var/run/docker.sock
      - DEBUG=1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
        my_net:
          ipv4_address: 192.168.1.10
    dns:
      - 8.8.8.8
...  略 ...

networks:
  my_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 192.168.1.0/16
         gateway: 192.168.1.1

注意点としては, Lambda を実行する場合には, 以下の環境変数を定義してあげる必要がありました.

  • LAMBDA_EXECUTOR=docker
  • LAMBDA_REMOTE_DOCKER=true

また, LocalStack 内では, Lambda は別のコンテナ上で動作する (LocalStack から更に Docker コンテナが起動される) しますが, 今回は, そのコンテナ自体も同じ Docker ネットワーク内で動作させる必要があったので, 以下のように Docker ネットワークを固定することにしました.

  • LAMBDA_DOCKER_NETWORK=project_my_net

httpbin.org

lambda-cloudwatch-slack は SNS からサブスクライブされたメッセージを Slack に通知する Lambda ファンクションです. ということは, 動作確認として Slack に通知されるところまでを確認することが必要だと考えています. しかし, テストの度に Slack に通知が飛ぶのもなんだかなあと思ったので, Slack に通知する代わりに, 擬似的は HTTP エンドポイントに対して, Payload が正しく POST 出来たら正常と判断するようにしました.

そこで, 擬似的な HTTP エンドポイントとして, httpbin.org というサービスがあることを知り, その Docker イメージを利用することにしました.

httpbin.org

このサービス, 以下のように POST した場合, オウム返しのようにリクエストしたデータやヘッダの情報を返してくれるだけのとてもシンプルなサービスです.

$ curl -X POST -H "Content-Type: application/json" -d '{"text": "John"}' https://httpbin.org/post
{
  "args": {},
  "data": "{\"text\": \"John\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "16",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0"
  },
  "json": {
    "text": "John"
  },
  "origin": "xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx",
  "url": "https://httpbin.org/post"
}

ところが, 当初は, 直接, httpbin.org を叩くことを考えましたが, なぜか, LocalStack を介して起動する Lambda 環境 (Docker コンテナ) で名前解決が出来ないという壁にぶち当たり, 泣く泣く httpbin.org の Docker イメージを利用することにしました.

ちなみに, Lambda 環境にて名前が解決出来ない状態では, 以下のようなエラーが発生します.

2019-12-29T01:26:54.390Z        1929ac8c-970e-1e14-8ed4-9ca0b1b93aca    processing cloudwatch notification
2019-12-29T01:27:04.427Z        1929ac8c-970e-1e14-8ed4-9ca0b1b93aca    Error: getaddrinfo EAI_AGAIN httpbin.org:443

docker-compose.yml 内で dns: キーでリゾルバを設定してみたりしましたが, 結局解決せずでした. 残念. この諦めのおかげで, lambda-cloudwatch-slack のコードを少し修正する必要が出てきました...

lambda-cloudwatch-slack を泣く泣く改修

これは, やって良い対応なのか最後まで悩みましたが, テストの時だけ, https モジュールではなく, http モジュールを利用するような処理を追加しました...ダサい.

if (process.env.ENVIRONMENT == 'test') {
  var https = require('http');
} else {
  var https = require('https');
}

環境変数 ENVIRONMENTtest が指定されている場合のみ, http モジュールを利用します. 今回, lambda-cloudwatch-slack で明示的に https モジュールを利用しているのは, 以下のように Slack へのリクエストのみだったので, このトリッキーな対応で対処出来ました.

var postMessage = function(message, callback) {
  var body = JSON.stringify(message);
  var options = url.parse(hookUrl);
  options.method = 'POST';
  options.headers = {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(body),
  };

  var postReq = https.request(options, function(res) {
    var chunks = [];
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
      return chunks.push(chunk);
    });
    res.on('end', function() {
      var body = chunks.join('');
      if (callback) {
        callback({
          body: body,
          statusCode: res.statusCode,
          statusMessage: res.statusMessage
        });
      }
    });
    return res;
  });

  postReq.write(body);
  postReq.end();
};

CircleCI で動かす!

やっぱり, テストといえば, 継続的にテストしていきたいので, CircleCI 上で転がすようにしました. .circleci/config.yml は以下の通り.

version: 2.1

executors:
  default:
    docker:
      - image: circleci/node:10.9.0

commands:
  npm_install:


... 略 ...

jobs:
  build:
    executor:
      name: default
    steps:
      - checkout
      - setup_remote_docker
      - npm_install
      - run:
          name: Install docker-compose
          command: |
            curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
            chmod +x ~/docker-compose
            sudo mv ~/docker-compose /usr/local/bin/docker-compose
      - run: 
          name: Build Test Environment
          command: |
            docker-compose build
      - run: 
          name: Run Test Environment
          command: |
            docker-compose up -d
      - run:
          name: Setup Lambda Function
          command: |
            docker-compose exec deploy_lambda sh -c './node_modules/node-lambda/bin/node-lambda deploy --functionName=lambda-cloudwatch-slack --endpoint=http://192.168.1.10:4574 --configFile=deploy.env.test'
      - run:
          name: Run Test
          command: |
            docker-compose exec bats bats /work/test.bats

シンプルはワークフローです. docker-compose が割と普通に動いてくれるので, オール docker-compose で動かすことが出来ました.

動いている様子

ローカル環境

自分の手元の端末では, docker-compose.local.yml を使って動作確認環境を起動します. (これも妥協点の一つ)

$ docker-compose -f docker-compose.local.yml up -d

まずは, Node.js 8.10 で Lambda をデプロイしてテストを実行してみます.

$ env AWS_RUNTIME=nodejs8.10 env AWS_REGION=us-east-1 ./node_modules/node-lambda/bin/node-lambda deploy --functionName=lambda-cloudwatch-slack --endpoint=http://localhost:4574 --configFile=deploy.env.test
$ docker-compose exec bats bats /work/test.bats

引き続き, Node.js 10.x で Lambda をデプロイしてテストを実行してみます.

$ env AWS_RUNTIME=nodejs10.x env AWS_REGION=us-east-1 ./node_modules/node-lambda/bin/node-lambda deploy --functionName=lambda-cloudwatch-slack --endpoint=http://localhost:4574 --configFile=deploy.env.test
$ docker-compose exec bats bats /work/test.bats

CircleCI 環境

おっと, なんか Fail しているようです.

f:id:inokara:20191229113028p:plain

これは, lambda-cloudwatch-slack ではデフォルトの挙動のようで, Lambda に渡すイベントが {} のように空の状態であると, 関数は実行されるものの, 処理するメッセージ (Slack に送信するメッセージ) が存在しないため, Lambda 側でエラーになってしまいます. 以下は Lambda 側のエラー出力です.

2019-12-29T02:32:15.072Z        5a893f2a-a740-1037-19d5-4a77cb46a080    INFO    sns received:{}
2019-12-29T02:32:15.074Z        5a893f2a-a740-1037-19d5-4a77cb46a080    ERROR   Invoke Error    {"errorType":"TypeError","errorMessage":"Cannot read property '0' of undefined","stack":["TypeError: Cannot read property '0' of undefined","    at processEvent (/var/task/index.js:365:43)","    at Runtime.exports.handler (/var/task/index.js:430:5)","    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"]}

せっかくなので, このエラーを回避する実装を追加してみたいと思います. 実装と言っても大げさなものではなく, 以下のように追記するだけです.

diff --git a/index.js b/index.js
index 2c9ac11..b8c8841 100644
--- a/index.js
+++ b/index.js
@@ -418,10 +418,10 @@ var processEvent = function(event, context) {

 exports.handler = function(event, context) {

+  if (! event.Records) {
+    context.succeed('Records key has not been set.');
+    return;
+  }

   if (hookUrl) {
     processEvent(event, context);

改めて, CircleCI でテストを実行してみましょう.

f:id:inokara:20191229113919p:plain

いい感じです. 見事にテストをパスしました.

さらに, Node.js 8.10 と Node.js 10.x で連続してテストを流してみましょう. 両方ともにテストが通れば, 今回の目的だったランタイムのバージョンアップによる関数の動作確認がそこそこちゃんと行えることになります.

f:id:inokara:20191229115140p:plain

いい感じです.

ということで

初めて LocalStack を使ってみましたが, 手元でシュッと擬似的な AWS 環境が動くことにとても感動しました. しかし, それなりに使おうとすると, きちんとドキュメントを読んで, 適切な設定を行う必要があることを痛感しました. ということで, 一応, Node.js 8.10 でも Node.js 10.x でも lambda-cloudwatch-slack が動くことがわかったので, 年明けに安心してランタイムのバージョンアップにのぞめそうです.

お疲れ様でした.

2019 年 12 月 28 日 (土)

ジョギング

  • 引き続き, お休み
  • 右足の様子がだいぶん良くはなってきた

とにかく早く足が良くなりますように...

靴を洗う

RINCON が先日の鹿児島 30K で汚れてしまったのでタワシでゴシゴシ洗った. 早く足の具合がよくなって走りたい.

忘年会

かずきん夫婦と博多で忘年会. ワイワイ楽しかったけど, 二次会に行けなかったのが残念だった.

2019 年 12 月 27 日 (金)

ジョギング

  • お休み
  • 引き続き, 右足の太もも痛みが引き続き...
  • しかし, 湿布の効果がだいぶん良くなってきた

とにかく早く足が良くなりますよう.

ギョーム

  • ウィークリーレポートを作成したり
  • LocalStack を色々といじったり
  • 大掃除

2019 年は締まった感があるけど, 色々と宿題が積んでいるので, お休みの間も頑張りたい.

2019 年 12 月 26 日 (木)

ジョギング

  • お休み
  • 右足の太もも痛みが引き続き...

ギョーム

  • Lambda の Node.js ランタイムバージョンアップを検証しながら
  • LocalStack を使ってローカル環境で動かしてみてとか思ったけど, 意外に LocalStack がで Lambda を動かしたり, そもそも Serverless Framework を介したデプロイがうまく動かなかったり... なかなか骨が折れた

夕飯

とにかく太ももを早く治したいので, 牛もも肉の塊を食べた. ウェップ.

2019 年 12 月 25 日 (水)

ジョギング

  • 山王公園 35 min + 懸垂 x 8 回
  • 右足太ももの裏が辛くて途中で走るのを止めた...やばし

ギョーム

昨日の続きで Puppeteer 使ってサイトの変更検知を仕組み化した.

inokara.hateblo.jp

あとは ECS 用のインスタンスを入れ替えたり... なんか色々.

夕飯

奥さん特製のハンバーグ. ぶれない美味しさ.

今年も

残すところ出社は 2 日かーーー. なんとか一年間乗り切れたなあ.