TECH PLAY

株匏䌚瀟゚ニグモ

株匏䌚瀟゚ニグモ の技術ブログ

å…š247ä»¶

こんにちは、サヌバヌサむド゚ンゞニアの竹本です。 この蚘事は Enigmo Advent Calendar 2021 の3日目の蚘事です。 みなさたは2021幎どのように過ごされたしたか、株匏䌚瀟 ゚ニグモ では昚幎の 新型コロナりむルス の圱響で2020幎2月からリモヌトワヌクに以降したのですが、今幎はなんずオフィスが半分になり党瀟的なリモヌト䜓制が敎いたした。(新オフィスの玹介蚘事 最高なオフィスにリニューアルしました!!BUYMA/株式会社エニグモ | 株式会社エニグモ ) コロナ犍抜けたら出勀再開したしょうなどの展開はなく、リモヌトに切り替える機動性の高い䌚瀟です🀗 採甚情報は コチラ ずいうわけで、1゚ンゞニアの私もリモヌトワヌク䞭心の生掻が続いおおりたす。そういう状況の方は倚いのではないでしょうか ずころで、お家での䜜業は捗っおいたすか あんたり集䞭できない日があったり、逆にい぀の間にか窓の倖が暗くなっおいたりなど、色々あるのではないでしょうかそこでおすすめしたいのが ポモドヌロテクニック です。 ポモドヌロずは ポモドヌロテクニック ずいっお25分䜜業しお5分䌑憩するこずによっお集䞭力を持続させるこずができる䜜業方法です。 私がポモドヌロを始めおみようず思ったのは SOFT SKILLS ゜フトりェア開発者の人生マニュアル を読んだこずがきっかけでした。 ポモドヌロテクニック 自䜓は知っおいたのですが、䜜業䞭にタむマヌがなるのが鬱陶しそうで敬遠しおいたした。 しかし本曞では ポモドヌロテクニック は集䞭のためのツヌルずいうよりも、 ポモドヌロ䜕セットかかるタスクなのかを芋積もる (以䞋蚘事の䞭では ポモドヌロ1セット=1ポモ ず単䜍ポモで衚蚘したす) 実際䜕ポモかかったのかを蚈枬する 以䞊を繰り返す これにより、タスク芋積りの粟床が向䞊しおいくメリットを䞭心に ポモドヌロテクニック を玹介しおいたす。 自分でタむマヌをセットしお芋積りず蚈枬をメモっおいっおも良いのですが、䞖にはいっぱいポモドヌロアプリがあるので、䟿利に掻甚したい ずいうわけで自分の䜜業環境や、目的に合っおいそうなアプリを探す旅に出たした。 以䞋の条件で遞定しおおりたす。 無料で詊せる mac で利甚できる 䜜業ログを芋るこずができる そしお条件に合った4぀のアプリを実際に詊したので玹介させおいただきたす。 Pomofocus Kanban Flow life line Be Focused Pomofocus https://pomofocus.io/ 「pomodoro timer」で ググる ず䞀番䞊に出おくる シンプルなUI タスクにかかるポモドヌロのセット数芋積りを蚭定できる 䞭断できる ログが芋れる Pomofocus画面 䞀番最初に詊したのがこのアプリでした。本圓にシンプルで簡単に利甚するこずができ、私自身「ポモドヌロ、詊しおみようかな 」ずいう段階でこのアプリに出䌚うこずができたずころが今もポモドヌロを継続できおいるこずに繋がっおいるず思いたす。 たたタスクの蚭定時に䜕ポモかかりそうか芋積りを蚭定し、実際䜕ポモ経っおいるのかを蚈枬できるので、圓初の目暙ずマッチしおいたす。以降玹介するアプリの䞭でも最も簡䟿に芋積りの入力ができるので気に入っおいるポモドヌロアプリです。 Kanban Flow https://kanbanflow.com/ カンバン的UI サブタスクも チェックボックス で管理できる タスクにかかる時間の芋積りが蚭定できる ログがめっちゃ芋やすい 䞭断しようずするず理由を聞かれる Kanban Flow画面 カンバンはナヌザヌを招埅しおチヌムで管理するこずもできる 名前の通りカンバンUIで党タスクを䞀望できるのが䟿利 他のアプリは䜜業䞭のタスクだけ衚瀺の堎合も倚いですが、こちらはTodo/DoToday/InProgress/Done党おのステヌタス(ステヌタスカラムは線集可胜)のタスクが衚瀺されおおり、たたカンバンはプロゞェクトごずに管理できるようになっおいたす。 䜕よりSOFTSKILLS䜜者ゞョン゜ンメズによっお開発されおいるのもあり、こちらもタスク蚭定時にタスクにかかる時間の芋積り蚭定が可胜です。 しかし䜜業の䞭断に厳しい蚭蚈になっおおり、ちょっずトむレ行きたい時にも、タむマヌを止めようずするず、ポモドヌロを䞭断させられるし(たた0からポモドヌロを始める必芁がある)急いでいるのに理由を聞かれたりしお、たあいっかずタむマヌ回しながらトむレに行くこずが倚かったです。 ポモドヌロ停止理由䞀芧 停止するずきはこのくらいの芚悟を持おずいうこずなんですね oyatsuは自分で远加したした life line 画面䞊郚のメニュヌバヌ䞋に䜜業時間が可芖化される PCで䜜業しおいるずタむマヌを自動で回しおくれる 䌑憩時間は画面をグレヌアりトしおくれる kanban flowを利甚しおいたあたりに、「ブラりザでのタむマヌはわざわざそのペヌゞを芋に行かなきゃいけなくお面倒だな 」ず思っおいたずころでこちらを詊しおみたした。 mac 画面䞊郚のメニュヌバヌ䞋に1日の䜜業しおいる時間がグラフずしお可芖化されたす。 たた、ログを芋るず、䜜業時間、䌑憩時間が日ごずに確認するこずができたす。 life lineログ画面 お昌䌑みが黒かったり、 MTG 䞭は䌑憩しおいなかったりが䞀目瞭然 たたlife lineの面癜い機胜ずしお、䞀定時間以䞊PCで䜜業しおいるずタむマヌが起動し、25分経過するず画面が ホワむトアりト しお䜜業を止めるこずができるのでやや匷制的に䜜業のリズムを䜜るこずができたす。 しかし、自動でタむマヌが起動する性質䞊、個別のタスクに関する芋積り、蚈枬が難しいです。 ちょっずslack巡回しよ っお時もタむマヌが動き出しおしたい、「あヌ今はタスクやっおたわけじゃないのにヌ」ずなりたす。 Be Focused メニュヌバヌで時間を確認できる タむマヌのアラヌム音をたくさんの䞭から遞べお愉快 芋積りも入力できる Be Focused画面 アップグレヌドしたら広告は消えるそうです やっぱりメニュヌバヌで埌䜕分か確認できるや぀が欲しいなそしおタスクごずにタむマヌを手動で動かしたいず思いこちらのアプリに出䌚いたした。 タスクを远加しお、タスク詳现画面から䜕ポモかかりそうか入力しお、タむマヌをスタヌトさせるずいうシンプルな流れ。 ずいうわけで珟圚はBe Focusedに萜ち着いおいたす。 アプリはさたざたなものが出おいるので、ポモドヌロを導入する目的にあったアプリを芋぀けお、良いポモドヌロラむフをお送りください 次回の蚘事の担圓は サヌバヌサむド゚ンゞニア の 岡本さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは、Corporate IT/Business ITを担圓しおいる足立 です。 この蚘事は Enigmo Advent Calendar 2021 の 2日目の蚘事です。 ゚ニグモ では1人目のコヌポレヌトIT担圓ずしお未着手な瀟内IT環境をコツコツ敎備しおたす。 䞖間䞀般的には情報システム情シスず呌ばれるポゞションです。 昚幎はコロナ察応に぀いお曞きたしたが、もう早いものであれから幎が経過したした。 今幎は コヌポレヌトITの未来を考えた話 に぀いお曞きたいず思いたす。 コヌポレヌトITの未来っお 早い話、ロヌドマップ䞭期蚈画を考えた話になりたす。 今埌、3幎間で実斜したいIT投資蚈画を策定し経営局に察し内容を共有したした。 では、䜕故䞭期蚈画を策定したのか 私が ゚ニグモ に来おから幎半以䞊の月日が経ち、入瀟盎埌のミッションずしお䞋蚘内容がありたした。 老朜化した 耇合機 のリプレむス Google Workspaceのプラン倉曎 玙ベヌスの暩限申請の電子化 それぞれに぀いお曞くず長くなるので割愛したすが、䞊蚘の目凊が立った矢先にコロナ察応、オフィスリニュヌアルPJがあり 堎圓たり的な察応を続けお来たした。 ずは蚀え倖的芁因が起因ずした状況でしたが、 ゚ニグモ の瀟内システムの環境は倧幅に改善されたず思いたす。 入瀟盎埌の瀟内システムの䞀郚 䞊蚘の図は私が入瀟盎埌の瀟内システムの䞀郚になりたす。 管蜄が違うシステムも含たれおいたすが、党瀟的に䜿甚する物はコヌポレヌトITが管蜄しおいたす。 珟圚の瀟内システム䞀郚 珟圚はコロナ察応に䌎うリモヌトワヌク環境構築の為に導入した物やオフィス リニュヌアル時に導入したシステムを合わせるず䞊蚘の図のようになりたした。 環境が倧きく倉わりたしたが思いずしおは道半ば。 ただただ、導入しなければならない物が沢山あるず感じおいたすが、今埌も堎圓たり的に導入するのではなく 䞭期的に必芁性や導入蚈画も立お予算に぀いおも経営局ず事前に共有する事が必芁ず思いたした。 䟋えば導入したい物が高額な堎合に経営局も盎々にOKを出す事は難しいですし、 導入したいシステムが䞀郚だけ承認が降りたずしおも䌚瀟党䜓でのシステム構成にバラツキが出おしたうのも 䜙蚈な投資を実行しおしたう芁因にも成りかねたせん。 モダンなシステム構成の実珟、無駄な投資を防ぐ為にも䞭期蚈画が必芁でした。 䞭期蚈画 策定のパヌトナヌ 私自身の䞭に今埌、導入したいシステム構成はボンダリずありたしたが、果たしお本圓にその構成で良いのか ゚ニグモ に取っおベストな構成なのかず蚀う疑問がありたした。 そこで䞭期蚈画を策定するにあたり倖郚の力を借りる事にしたした。 クラりド ネむティブさん パヌトナヌずしお クラりド ネむティブさんのご協力をお願いしたした。 お願いした理由ずしおいく぀かありたすが、代衚的な事ずしおは䞋蚘の通りになりたす。 ベンダヌフリヌ ベンダヌに属されおいないのでフラットな立堎で様々なサヌビスを提案・導入が出来る ベンダヌによっおは導入提案出来る商材が決たっおいたりする事があるのでフラットな立堎で提案しお頂ける郚分に魅力を感じたした。 自立を考えおくれる 支揎をお願いするず基本、代行しおやっおくれるケヌスが倚いですが基本、匊瀟にナレッゞやノりハりを残しお頂けるように支揎しおくれたす。 たた、問い合わせに関しおはSlack出来る為、レスポンスが早くスピヌディヌに察応しお頂けたす。 匷力なスタッフ 情シスSlack内やむベントでお芋かけする匷匷な情シス経隓者の方が参画しおいるので心匷い。 尊敬する方もいらっしゃったので䞀床、お仕事をご䞀緒したい思いもありたした。 元々、IdP導入は クラりド ネむティブさん経由で実斜する予定でしたので、同時進行で進めおいく事になりたした。 やはり自分が考えおいる構成に぀いお壁打ち出来る盞手が居るこずは安心感に繋がりたした。 コヌポレヌトITのMVV 䞭期蚈画を策定にあたり、経営局ずの話し合いの堎を蚭けお頂きたした。 IT投資を実斜する為に圹員がコヌポレヌトIT郚門に察しおどんな目的で、どのようなチヌムであっお欲しいのか ヒアリ ングをさせお頂き その内容をベヌスにMVVミッション・ビゞョン・バリュヌを策定し、その内容にあった蚈画を䜜る事にしたした。 ヒアリ ング圓日は圹員に察しおコヌポレヌトITに察しお思っおいる事、実珟しお欲しい事を兎に角、䜕でも良いので蚀っお欲しいずお願いし 様々なワヌドが出おきたした。 そのワヌドを元に䜜成したMVVが以䞋の通りになりたす。 ミッション(䜿呜、目的) 党おのStakeholderをHappyに ビゞョン将来像 瀟員ず組織の Value 実珟をITで支えるチヌム   バリュヌ(スタむル) 「 Location Free 」 「 Always update」 「 Balancing productivity and security」 MVV ミッションである「党おのStakeholderをHappyに」は代衚である須田さんのお蚀葉でした。 ヒアリ ング圓日はワヌドが出おこないのでは無いのかず懞念しおたしたが、予想ずは裏腹に人の圹員が思いの䞈をぶ぀けお頂きたした。 䞭でも「埓業員だけでなく、協力䌚瀟の方々、 BUYMA ナヌザヌ、パヌ゜ナルショッパヌなど ゚ニグモ に関わる党おのStakeholderがHappyになる環境であっお欲しい」ずお話しお頂いた時はミッションはコレしかないず感じたした。 ミッション ビゞョンである「瀟員ず組織の Value 実珟をITで支えるチヌム」は ゚ニグモ の䌁業理念にある぀の䟡倀基準を倧切する行動指針を埌抌し出来るチヌムである事を瀺したした。 セルフスタヌタヌ 他人や環境に巊右されず、自ら目暙を芋぀け匕き金を匕き、突き進める人 アりト パフォヌマヌ 自分の匷みを鍛え、垞識、限界、期埅倀を超えおいく人 チヌムビルダヌ ”日頃”のチヌム䜜りず”実践時”のチヌムパフォヌマンスに貢献できる人 ビゞョン 最埌にバリュヌに぀いおは぀の指針にしたした。 Location Free コロナ犍埌は䌚瀟を身軜にする事に泚芖し、物は持たずPC端末ずむンタヌネット回線があれば䞖界䞭どこでも業務が出来る環境の実珟を目指す事にしたした。 Always update 次から次ぞず新サヌビス、新しいシステムが出おきたす。既存の環境に満足せずに垞にアップデヌトし続ける事を目暙ずしたした。 Balancing productivity and security 管理出来ないツヌルやサヌビスが増えるず、そこが セキュリティホヌル になる危険性がありたすが、無闇矢鱈に芏制するず生産性が䜎䞋したす。 矛盟した話になりたすが、「生産性ず安党性」を䞡立した構成を目指す事にしたした。 バリュヌ MVVに぀いおは無くおも䞭期蚈画は策定出来たすが、私はあった方が良いず思っおいたす。 経営局ずコヌポレヌトITの間でチヌムの方向性に぀いお同じマむンドであった方がより良い組織になるず感じるからです。 リスクず課題の掗い出し ゚ニグモ にある想定されるリスクや課題の掗い出しに着手し懞念点に぀いおは党おお話し必芁な察応を可芖化。 それに基づき必芁な゜リュヌションを マッピング しおいきたした。 匊瀟のセキュリティに関わる郚分になるので、詳现に぀いおは曞くこずが出来たせんが、箇条曞きでも良いので懞念点をメモしおおく事をオススメしたす。 ゜リュヌションの遞定に基づきロヌドマップぞ反映したした。 ロヌドマップ たた、抂算費甚を算出する為、必芁ラむセンス数の掗い出し、定䟡ベヌスでの費甚感を算出したした。 倧凡の金額感だずしおも、これだけの費甚がかかるのかず思うず震えたした。 未来ぞ 課題や懞念点、予算感を取りたずめおロヌドマップにし圹員ぞ共有を行いたした。 圹員からは「抂ね、agree」ず蚀われお、同意しお頂いたのでほっずしたした。 今埌に぀いおはフェヌズ毎に改めお詳现なシステム構成案、費甚感、怜蚌を実斜し圹員ぞ最終提案を行いたす。 より快適でセキュアな環境構築の為に日々、粟進しおいきたいず思いたす。 明日の蚘事の担圓は サヌバヌサむド゚ンゞニアの竹本さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
Advent Calendar 1日ずしお初日を食るのは、 ゚ニグモ の゚ンゞニアむンタビュヌ第7回今回はむンフラチヌム入瀟2幎目の加藀さん( @kuromitsu_ka ) です。 趣味は自転車だそう。倕日すごい 先日広島のうさぎ島に行っおきたそうです。もふもふしおいる。 むンタビュアヌ 穎柀2019幎1月入瀟。゚ンゞニアマネヌゞャヌ。 穎柀: 加藀さんは ゚ニグモ 入瀟䞞2幎ですね。 ゚ニグモ はサヌビス゚ンゞニアリング本郚ずいう郚眲の䞭でアプリケヌション開発、 アプリ開発 、むンフラなど耇数のチヌムにわかれおいたすが、 加藀さんはむンフラチヌムですね。前職もむンフラをされおいたんですか 加藀: SESで、お客さん先に垞駐するタむプのむンフラ゚ンゞニアでした。 SIer に2幎、サヌビス運営䌚瀟に1.5幎お䞖話になりたした。新卒で䞀番最初に垞駐させおいただいた SIer では、䞻に運甚呚りを担圓しおいたした。 Cacti の監芖ずかコヌドリリヌス、アラヌトが飛んでくるず調査するなど その埌知人の繋がりでサヌビス運営䌚瀟にも垞駐させおいただきたした。 ここはモダンな開発環境で、プロパヌ瀟員もいい人でIaCや クラりド サヌビスを䜿った新芏構築、新芏 OSS の怜蚌、運甚呚りの自動化をさせおいただきたした。 こちらの珟堎の仕事を通しお「自分もサヌビス開発に関わる仕事をしたいな」ず思っお転職するこずにしたした。 ゚ニグモ は䞀番早く連絡をくれおいお、 BUYMA も知っおいたので 蚘念受隓 の぀もりで受けたら受かりたした。初の転職面接でした。 穎柀: 入瀟埌、実際の実務をしながら独り立ち、ずいう流れかず思いたすが具䜓的にはどういうフォロヌだったりサポヌトをうけおいたんでしょうか入瀟埌のギャップっおありたした 加藀: 入瀟圓初の詊甚期間、3ヶ月間は䞊叞が日々䜕かず面倒を芋おくれおいたした。ガむダンスもありたしたが日ごずにわからないこずはそこで解決しおいただいおいたした。その埌別の先茩ず aws のプロゞェクトに参加しおいたす。毎日 MTG し぀぀䜜業の盞談やわからないこずはオンラむンですすめおいお、特に困るこずはありたせんでした。入瀟埌のギャップずしお良かったこずずしおは、 リア充 キラキラ系だず思っおいお、自分にはちょっずしんどいかなず芚悟しおいたら、萜ち着いた感じでした。自分が入瀟する圓時は、「 やんちゃであれ 」が瀟蚓だったので、もっずやんちゃにやっおみたい/やんちゃな人に出おきお欲しいなずは日々思っおいたす。 穎柀: みんなキラキラ系におびえお入瀟しおきたすね笑。 今の䞀日の流れず、実際䞀週間で実務䜜業がどのくらいなのかおしえおください。 加藀: 午前䞭は䜜業やMRレビュヌなどをやっおいたす。ほが毎朝同じプロゞェクト AWS 化の先茩ず MTG し぀぀䜜業です。ロヌルずしおはむンフラ/SREですが ペアプロ 開発っぜい圢で進められおいたす。 午埌は特定の曜日は MTG があったりしたすが基本䜜業です。䜜業は17:00くらいたで。䜜業䞭の䞍明な点はチヌムのslackか定䟋で聞いおいたす。䜜業時間は抂ね7,8割だず思いたす。たずたった時間がずりやすくありがたいです。 以前、障害察応をしたこずがあったんですが先茩ずzoomで画面共有しながら䞀緒に䜜業した時先茩の操䜜を盎接みれお勉匷になるし質問もすぐできるし、すぐ教えおもらえるので普段の業務でも ペアプロ のように䞀緒に䜜業しおもらえる時間を぀くっおもらえるようになりたした。この進め方は今もずおもよかったず感じおいたす。些现なこずですが、チヌムでの仕事の進め方みたいなこずも盞談できるのでありがたいです。 盎接䌚瀟ずは関係ないかもしれたせんが、リモヌトになったこずで郜内で飲んだり遊ぶこずがなくなりたした。その代わり、ゞムや誘っおもらったバレヌボヌルチヌムに参加したりず自分の時間を調敎しながら仕事のバランスが取れおるず感じたす。 コロナ犍になっおからキャンプも始めたした。 先日は、友達ず ゆるキャン△ 聖地巡瀌 キャンプにいっお、富士山の日の出を芋おきたした。 穎柀: おヌプラむベヌト充実しおたすなあ。 むンフラチヌムでも、 ペアプロ みたいな䞀緒に䜜業ができるのっお安心感ありたすね。 たずたった時間がずれるのもいいですね。コヌドを曞く時もそうですが蚭定や実務やっおるず途䞭で遮られたり、ノッおる時に MTG になるず蟛いですもん。 今リモヌト勀務だず思いたすが、加藀さんたたに出瀟しおたす 加藀: 週1くらいの頻床で定期的に出瀟しおお、リゟヌト゚リア䌑憩゚リアにいるず自郚眲以倖の人からちょっずしたお困りごずみたいな盞談をうけるこずがあっおそれが嬉しかったりもしたす。最近では ブックマヌクレット のjsの曞き方を質問されお、答えるなどしたした。ちょうど自分がNode.jsを勉匷しおたのもあっお、自分の勉匷にもなっおよかったです。入瀟しおすぐにリモヌトになったので、瀟内に知らない人が倚いのが悩みでした。たたに出瀟しおいれば、瀟内の誰かが声をかけおくれるので、内心凄くありがたいです。 穎柀: あ〜そういう盞談っお結構リモヌトだず難しい、、DMみたいな深刻さもないし、かずいっお倧勢のいるチャットできくようなだいそれた事でもないし・・すれ違ったずきに「そういえばこれしっおる」みたいなノリがずおもいいですね。 ゚ニグモ では、リモヌト埌に入瀟した人むけにオンボヌディングず称しお各郚眲の方が定期的に郚眲の圹割や他郚眲ずの぀ながりを説明しおくれるオンラむンのむベント がありたすが確かに別郚眲の方ず接点ずいうのは限定的になりがちですね。 さっき入瀟埌のギャップみたいなお話をしたしたが、入瀟埌、仕事の仕方ずかで倧きく倉わったこずっおありたす 加藀: 自分は、客先垞駐の仕事から事業䌚瀟の瀟員に転職したのもありたすが、仕事で䜕かトラむする際のハヌドルが䞋がった気がしたす。プロゞェクトを進めおいる時も、振られたタスクを進めるだけじゃなくお、提案や、課題発芋→起案がし易いですね。些现な事の盞談や、新しいサヌビスを導入するなどの盞談ず意思決定が早いので取り組みたいこずや詊しおみたいこずを予算やある皋床の準備をしおお願いすれば倧䜓「OK、やっおみよう。」ずいう流れになる。事業䌚瀟ならではだず思いたす。 穎柀: わたしもそういう文化を ゚ニグモ に感じたす。たず話をきいおくれる環境ずいうか、耳を傟けおもらえるずころがすごくいいなず。自分で考えおチャレンゞしたり提案できるっお環境や颚土は倧事にしおいきたいですね。私も、組織づくりをがんばりたす。 開発環境呚りでい぀もサポヌトしおくれる加藀さん、これからも頌りにしおいたす。たた、入瀟3幎目突入ずいうこずでたすたすの掻躍、期埅しおいたす 今日はむンタビュヌありがずうございたした。 明日の蚘事は人事総務グルヌプの足立さんです
゚ニグモ の若手瀟員むンタビュヌ第䞀匟、平井さんです。入瀟3幎目を迎えおいる平井さんに、珟圚の日々の仕事内容やリモヌトでの環境の倉化などをざっくばらんに聞いおみたした。 入瀟盎埌のむンタビュヌ もどうぞ 寝癖があったぜいですがご本人の蚱可を頂きたした。:)   りェヌむ感ある。 むンタビュアヌ 穎柀2019幎1月入瀟。゚ンゞニアマネヌゞャヌ。 穎柀: 3幎目ずいうこずで実務やチヌムの立ち回りも、ご自身のリズムみたいなものができおきおるかず思いたす。䞀日の流れを教えおもらえたすか。 平井: 午前䞭は䞻に1日のタスク確認、そのたた所属する開発チヌムの朝䌚に出垭したす。基本的には実装メむンなので、午埌は実装しおいるこずが倚いです。斜策によっおはミヌティングが入るこずもありたす。 穎柀: 平井さんのスケゞュヌル、毎日朝30分、プロゞェクトの朝䌚がセットされおいたすね。ちなみに入瀟埌、業務を行うたでどんな感じでフォロヌしおもらっおいたんでしょうか 平井: 1幎目のずきは毎週金曜日に同じチヌムの先茩゚ンゞニアの方に参加頂き、週の振り返りをしおいたした。振り返りは事前に週で行った業務の䞭で改善したほうがいいこずや来週やるこずを esa に曞いお、その週で詰たった郚分の原因や解決方法を盞談させお頂いおいたした。あずは朝䌚でも䞍安点など盞談しおいたした。業務でわからないこずは、基本的にslackのチャンネルで尋ねるこずが倚いですが、文章で䌝えづらいこずずかは、朝䌚で聞いたりしたす。 圓時の平井さんの振り返り 穎柀: 基本的には OJT ですね。その埌入瀟した若手瀟員も週次で先茩ず䞀緒に振り返りをやっおいお、これはもう誰ずもなく郚内で匕き継がれおいたす。今は 今幎入瀟の岡本さん の振り返りに先茩ずしお参加しおる感じですね。゚ンゞニアずしおの開発業務は8時間のうちどのくらいの割合ですか 平井: 平均したら7, 8割くらいかなず思いたす。最近だず金曜日はミヌティングが倚めなのでそこたで開発できないですが、他の曜日はほが開発しおる日もありたす。 穎柀: 平井さんのスケゞュヌルをみお確かに金曜にたずたっおミヌティング入っおいたすね。結構こういうやり方しおる人倚いかも。 ゚ニグモ の゚ンゞニアはほがみんなリモヌトですがお昌っおどうしおたす 平井: 垞にコンビニに行っお匁圓買っお食べおいたす。運動はあたりしないので、意図的に歩く機䌚を䜜っおいたす。リモヌト勀務になっお、通勀が枛っお䜓動かす機䌚がなくなったこずです。あずは、ずっず郚屋にいるのでもう少し広い郚屋に匕っ越したいなず思い始めたした。通勀する必芁がなくなったのは、かなりストレスが枛りたした。逆に、仕事ずプラむベヌトの切り替えは難しいなず感じおいたす。 写真いただきたした。すっきり片付いおいる䜜業デスク 穎柀: 運動䞍足は重芁な課題ですよね。わたしもミヌティングはできるだけスタンディングデスク䜿っおいたす。歩かないですよね・・。匕っ越しいいですね 仕事ずプラむベヌトの切り替えずいうお話がありたしたが、業務の䞭で先茩、埌茩ずの雑談ずか業務倖のちょっずした䌚話っおできおたす 平井: 雑談はチヌムの振り返りを行った埌ちょっず雰囲気が砕けたタむミングで他愛のない話をするこずもありたす。 あずは最近埌茩ず時間がずれおないのでそこはフォロヌしたいず思っおるずころです。 穎柀: 先茩っぜい仕事の話に戻りたすが、入瀟埌、業務で䞀番達成感のあったものっおなんですか 平井: パヌ゜ナラむズ特集ですね。先茩に教えおもらいながら環境も自分で構築しお、独立した新機胜を党郚自分で䜜りきったずころが達成感に぀ながったず思いたす。今思えば蚭定ファむルでできおしたう郚分が倚く構築はそんなに倧倉ではなかったですが初めおの事も倚くロヌンチできた時は嬉しかったです。 *1 tech.enigmo.co.jp 穎柀: あヌこれ私もアプリでレコメンド出おきたので芚えおたす蚘事が去幎なので2幎目の平井さんが䜜ったものですね。たしかに自分で党郚䜜り切るっおやりきった感ありそうです。 3幎目、新しい瀟員も入っおきおフォロヌしたり指導したりずいうこずも増えおきおるず思いたす。この埌どういう゚ンゞニアになっおいきたいなずいう挠然ずしたものっおありたすか 平井: 同僚(゚ンゞニア、非゚ンゞニア)が安心しお䞀緒に仕事できる存圚になりたいです。技術的にプロダクトの課題を解決できるようになりたいです。 穎柀: 平井さんが䞁寧にレビュヌを返したり、岡本さんのtimesslack䞊の自分チャンネルにちょくちょく顔だしおサポヌトしおいるのをみかけお䞁寧だなあ〜ず蚀っおる諞先茩達も倚いです。これからも䞀緒に頑匵りたしょうありがずうございたした。 今幎入瀟の岡本さんのtimesで召喚される平井さん平井さん実はもっず岡本さんによばれたい *1 : デヌタテク ノロ ゞヌ グルヌプのレコメンドデヌタずアプリケヌションを぀なぎこみ、特定のナヌザに適切なブランド・カテゎリを衚瀺する機胜。レコメンド取埗 API は GCP 䞊に構成されおいる。
サヌビス゚ンゞニアリング本郚アプリケヌション開発グルヌプの岡本です。 私の前回の投皿 からおよそ1幎が経ちたした。 本蚘事では ゚ニグモ 瀟内で行われおいる勉匷䌚の䞭から、私も参加しおいる通称「若手勉匷䌚Slackのチャンネル名は#junior_workshop」の取り組みに぀いおご玹介したす。 勉匷䌚の抂芁 こちらの勉匷䌚は「Web開発における基瀎知識を身に着ける」をテヌマに掲げ、経隓の浅いアプリケヌション゚ンゞニアの知識の底䞊げを目指しお2020幎の6月から開始したした。二週間に䞀回のペヌスで業務時間内にZoomや Google meetを繋いで実斜したす。 「若手勉匷䌚」のREADME䞀郚 䞻な参加者は BUYMA のWebアプリケヌション開発を行っおいる入瀟数幎以内の゚ンゞニアです。 各回、1時間半皋床を費やしお技術曞を茪読したり、普段利甚しおいる OSS の ゜ヌスコヌド リヌディングを行っおいたした。 扱った題材 技術曞 1 オブゞェクト指向蚭蚈実践ガむドRubyでわかる 進化し぀づける柔軟なアプリケヌションの育お方技術評論瀟 メタプログラミングRuby 第2版オラむリヌゞャパン 増補改蚂版 Java蚀語で孊ぶデザむンパタヌン入門SBクリ゚むティブ 補足2021幎11月13日に Java蚀語で孊ぶデザむンパタヌン入門第3版 が出版されるそうです。 技術曞を読む際は䞀週に぀き1章ず぀進めたす。「 メタプログラミング Ruby 」を茪読した際は、各週で本の内容をたずめたドキュメントを䜜成する担圓者を決め、わからなかった点・気づいた点を質疑応答の時間で話し合うずいう圢匏で進めおいたした。 「 Java 蚀語で孊ぶ デザむンパタヌン 入門」では章の初めに䜜りたいアプリケヌションの芁件が付されおいるこずが倚いので、その郚分だけ読んで自分でクラス図を蚭蚈し、䜙裕があればコヌドを曞き、党員集たっおクラス図やコヌドを共有しおレビュヌしながら本を読んで答え合わせをする、ずいう圢匏をずっおいたした。 OSS pry/pry binding.pry でなぜ break できるのか コマンドがどのように凊理を経おいるか exit , !!! , step , next , continue , finish rails/rails ActiveRecord#save , ActiveRecord#save! Rails の初期化プロセス cf. https://guides.rubyonrails.org/initialization.html binarylogic/settingslogic drapergem/draper Draper::Decoratable モゞュヌルが ActiveRecord::Base に include されるたで 業務では䞻に Ruby on Rails を䜿っお開発をしおいるため、普段䜿っおいる Ruby のgemや Rails の機胜を題材ずするこずが倚いです。孊んだこずは若手勉匷䌚甚に䜜成したSlackの#junior_workshopチャンネルにメモしたり、 esa で蚘事を䜜成しおいたした。 筆者が esa に蚘録しおいた回 Slackの#junior_workshopチャンネルで知芋を共有しおいる様子 1幎のふりかえり 1幎以䞊定期的に勉匷䌚を行っおきたので、先日参加者党員でふりかえりを行いたした。今回䜿ったふりかえり手法は「YWTやったこず・わかったこず・぀ぎやるこず」です。 Yやったこずは䞊蚘のため割愛したすが、WずTの䞭から参加者の皆さんの声を䞀郚ご玹介したす。 W 技術曞、 OSS を読んでわかったこず デザむンパタヌン を自発的に孊習する機䌚がなかったが、いざ勉匷しお色んな ゜ヌスコヌド を読んでいるず デザむンパタヌン の文脈で扱われる甚語が䜿われおいるこずがあるこずに気づきコヌドの意図を理解しやすくなった  デザむンパタヌン の茪読䌚においお同じテヌマで各自プログラムを䜜成し、その実装・蚭蚈に関しお議論するこずで他の人の蚭蚈アむディアを知るこずができ蚭蚈の幅が増えた。 Ruby で デザむンパタヌン を孊ぶこずができ、 BUYMA の ゜ヌスコヌド を読むのに圹立おるこずができた。 技術曞の茪読に関しおは、自分の理解が曖昧な箇所に぀いお質問したり、他の人の疑問に答えるこずで䞀人で読むよりも理解床が䞊がったのが良かった。 pryの ゜ヌスコヌド リヌディングに関しおは、自分の䞭で ブラックボックス 化しおいた内郚凊理を理解しおいく䜜業が単玔に楜しかった。 OSS を読むこずに抵抗が少なくなった デザむンパタヌン を孊んで新たな芖点が芜生えたずいう意芋が倚かったです。普段䜿っおいる OSS 、䞀芋難解に思えたすがじっくりず時間をかけお内郚構造を読み解いおいく時間が私も楜しく感じたした。 その他 茪読圢匏だったため発衚するこずを意識し、䞀人で読曞するずきより知識が定着した。 他の人が利甚しおいる゚ディタヌやその他のツヌルを知るこずができた。 質問を受けるこずでなんずなくわかった気になっおいた内容を埩習し蚘憶ずしお定着させるこずができた。 途䞭から業務が忙しいずいう理由で参加しなくなっおしたった  自孊するこずに加えお他人に教えたり発衚するなどしお知芋をアりトプットするこずで理解が深たるこずを実感したした。 T OSS にコントリビュヌトしたい、今埌も継続しおいきたい OSS の ゜ヌスコヌド リヌディングで培った速読力を普段の調査系のタスクで生かしおいきたい。 なかなか OSS ぞのコントリビュヌトもできおいないので積極的に OSS 掻動にも参加しおいきたい。 実は既に Ruby / Rails に関する OSS に貢献しおいる方もおられたす。 tech.enigmo.co.jp おわりに 1幎が経過し、参加者それぞれが重芁なタスクを任されるこずが増え忙しくなっおきたので、このタむミングで定期的な若手勉匷䌚は䞀旊ストップするこずにしたした。今埌は Ruby に限らず、勉匷䌚でやりたい䌁画があれば随時開催しようずいうこずで合意しおいたす。今床はデザむンずかフロント゚ンドの勉匷䌚やりたいですね〜ずいう話をしおいたした ゚ニグモ でぱンゞニアを採甚しおいたす hrmos.co 技術曞は䌚瀟の補助を利甚しお賌入するこずができたす。 ↩
お疲れさたです。むンフラチヌムの山口です。 新型コロナりィルスの圱響䞋でのリモヌトワヌクに䌎い最近瀟内でいく぀かの VPN アプラむアンス のPoCを実斜したのでその際に考えたこずや振り返っおこうしおおくべきだったずいう内容を戒めずしお各フェヌズに沿っお゚ッセむずしお蚘茉したす。 なお、珟圚進行系で数皮の補品のPoC䞭のため、「䜕か特定の補品を䜿っおうたくいった」や「匊瀟はこうしおいる」などの情報は䜕もない、私が感じた チラシの裏 的なレポヌトになりたす。 芁は、技術的に新芏性のあるこずはない内容ですが、同じような問題意識を持っおる人間に届けばいいなずいった感じの文章になりたす(文章でもなんでも刺さる人にだけ刺さればいいずいうポリシヌなので、そういった感じです)。 本皿の構成を以䞋に蚘茉したす。 たず、筆者の経歎および、前提条件を説明したす。 次に、補品遞定や実際のPoC準備から実斜たでに考えたこずを蚘茉したす。 そしお、最埌に感想をたずめたす。 筆者の経歎 前職は以䞋の感じの業務に埓事しおおり、お客様のネットワヌク構築やビデオ䌚議の導入などをしおいたした。 顧客のNW(䞻にWAN)構築・運甚(所謂ネットワヌク゚ンゞニア) ビデオ䌚議の端末やサヌバの導入・運甚など(これは䜕゚ンゞニアなのか適切な衚珟は思い぀かない) その埌匊瀟に転職しお今に至りたす。 芁は、法人のお客様にベンダヌの アプラむアンス 補品を導入したりする仕事をしおいる人の気持や挙動は薄々むメヌゞ぀くずいった感じになりたす。 前職では、䌁業の情シスの方が䞻に察面ずなる顧客の圢でした。 が、今回のPoCでは、どちらかずいうず䌁業の情シスに近い動きをしおおり、立堎倉わるず芋え方倉わるなずいうのを感じおいたす。 その䞀方で、再販のベンダヌさんが英語の資料ベヌスにパワヌポむントなどでたずめられた日本語の手順曞などいただくず、「こういう類䜜るの面倒だよね(困ったら英語の䞀次資料頑匵っお読むけど、利甚者ずしおは日本語でアりトラむンたずめられおいるのはありがたい)」ずいう気持ちもあったりしお日々勉匷させお頂いおいたす。 前提条件 本皿党䜓の前提にかかる匊瀟の珟状に぀いお開瀺可胜な範囲で簡単に箇条曞きで蚘茉したす。 今回のPoCに぀いおは基本的に情シスず協力しお進めるずいう圢を取っおいたす。 瀟員数 150人匷(業務委蚗の方なども含む) 人員の構成 情シス: 2名 瀟内NWや瀟内のPC/瀟内で利甚する倖郚サヌビスの管理など むンフラ: 7名 自瀟サヌビスのむンフラ郚分を担圓 圓初は情シスワヌクもむンフラで実斜しおいたが、専任の情シス担圓者着任に䌎い移管したずいう経緯がある 情シス・むンフラは郚眲ずしおは別ラむン(䌚瀟でよくある構成だず思いたすが、情シスは人事総務系の所属・むンフラぱンゞニア郚門の所属) NW構成ず運甚 オンプレミスから AWS ぞの移行䞭のためデヌタセンタ・ AWS 偎それぞれぞのIP到達性が必芁 リモヌトアクセス VPN はルヌタではなく Linux サヌバで終端(PC偎は各OSに組み蟌みのクラむアントを利甚) VPN 関連はむンフラの管蜄(ただし、瀟員からの VPN 関連の問い合わせやサポヌトは情シスでも䞀郚察応しおい頂いおいるケヌスもある) 問題意識 リモヌトワヌクに䌎い以䞋の 工数 が増えおいる点を改善したい VPN の初期蚭定時のサポヌト VPN が぀ながらないなどのサポヌト 補品の遞定 補品の遞定の際に考えたこずを蚘茉したす。 たず、遞択肢ずしお、ベンダヌの提䟛しおいる補品を䜿うか、自分たちで OSS をベヌスに構築するかがあるず思いたす。 匊瀟の状況ずしおは、 OSS などを組み合わせお自分たちで独自に構築しお運甚する 工数 を取るこずは避けたかったため、ベンダヌの補品を遞択する圢を取りたした。 たた、ベンダヌずいう単語は本皿では、サヌビスや補品を提䟛しおいる䌁業ず、その補品の代理店をなんずなく指す意味合いで䜿いたす。 OSS を組み合わせお構築する ベンダヌの補品を䜿甚する 次に、補品を遞ぶ際に考えた点を以䞋に蚘茉したす。 以䞋に明瀺的に蚘茉はしおいたせんが、コストも気にはしたす。 利甚者の芳点で蚭定が簡単か VPN の蚭定のサポヌトが蟛いずいう問題を解消したいのでこれは重芁。 端末の アップリンク でのポヌトの遮断などに察応可胜か 芁は、リモヌトワヌク時のご自宅のNWなどでポヌトが遮断されおいる堎合は TCP :443などにフォヌルバックしお぀ながっおくれるような補品かどうか。 リモヌトワヌクの際に、瀟内のメンバヌのご自宅のNW機噚の蚭定起因ず思われるトラブルに察しお、䌚瀟ずしおどこたで手を出すかは悩たしいずころなので極力robustに動いおくれる補品が良い。 前職なら「お客様責任のお客様機噚」なので蚭定倉曎はご法床的な箇所を、補品の型番教えおもらいマニュアル読み぀぀圱響なく問題を回避する方法を調べ察応するのは面癜くもあるが、しくじったずきにお互いに蟛い。 が、たあ最近の補品は、おおよそフォヌルバックしお通信しおくれるのでそこたで気にする必芁は実際無い印象。 PoCや導入に際し既存ぞの通信圱響がなく、可胜であればNW構成も倉曎せず利甚可胜なこず 芁は、PoCや怜蚌のために既存の通信経路などの倉曎はしたくない。 最近の流行りだず倧抂はデヌタセンタや VPC に配眮する VPN サヌバに盞圓する アプラむアンス 偎でも、アりトバりンドで クラりド 偎ず接続するデザむンが倧半の印象なのでこれもそこたで気にする必芁はなかった。 たた、オンプレミス偎に配眮する仮想 アプラむアンス のためには、ESXiがあれば良い Dockerのむメヌゞが提䟛されおいる補品もあるようであったが䞀郚機胜に制限などがあるため基本はESXiか Hyper-V に 仮想マシン をデプロむする。 䜙力があればEKSなりECSで動かしおみるかずいった気持ちを圓初抱いおいたが実際はそんな䜙力はなかった。 サポヌト䜓制 英語での問い合わせでも良いですが、蟛いので可胜であれば日本語でサポヌトが受けられるのが望たしい。 息が長い補品であるかどうか 芁は、ベンダヌ郜合でEOS(End of Support もしくは End of Service)にすぐならなさそうか。 これは前職でベンダヌの日本法人がなくなったり、EoSに䌎う埌継の補品ぞの眮き換えが蟛かったりずいうケヌスがあったので少し気にしたした。 が、根本的に利甚者偎ずしおは回避する方法はないので頭に留めおおく皋床。 PoC準備 次に瀟内PoCの準備に際しお考えたこずを蚘茉したす。 事前に補品の怜蚌をしおおく 瀟内でPoCの䟝頌をする前に、事前に補品の挙動などの怜蚌をしおおきたす。 瀟内のメンバヌに䜿っおもらう状態になるず気軜に蚭定倉えお詊隓ずいった圢が難しくなるため事前に気になる点は怜蚌をしおおくのが望たしい。 協力を䟝頌する郚眲に事前にお願いしおおく 䌚瀟の芏暡にもよるずは思いたすが、流石に昚日の今日で瀟内の各郚眲に「明日から瀟内PoCやるんで協力よろしく」は避けたいので、事前に協力を䟝頌したいメンバヌをリストアップし、䞊長含めお事前にご協力のお願いを出すずいう圢にしたした。 各郚門で数人ず぀協力しおいただき、抂ね挏れがないような人遞ずしたした。 各皮手順の準備 むンストヌル/アンむストヌル/トラブルシュヌトの手順は事前に準備しおおきたす。 準備しおおけばおくだけ、埌が楜になるため泚力しおおいた方が良いず思いたすが、埌から挏れなどが出おくるので実際瀟内PoCの間にも远加で準備したりしおいたした。 ロヌカル開発環境でも圱響が無いか PCから各リ゜ヌスにIP到達性さえあればよしずしおしたっおいお盲点的な箇所ではあったのですが、匊瀟サヌビスのロヌカル開発環境がリモヌトのDBなどず通信しおいる箇所があり、PoCを行う補品でも既存の VPN ず比范しお、ロヌカル開発環境が極端に遅かったり䞍安定にならないかを確認したす。 たたに遅いなどの問題をうたく怜知するために、事前に 負荷詊隓 ツヌルの類でロヌカル開発環境に察しお数時間詊隓をしおレスポンスタむムを蚘録し 定量 的に比范できるようにしおおきたす。 PoC実斜&評䟡 PoC実斜䞭から評䟡の際に考えた内容を列挙したす。 実斜する状態になったらやりきるしかなくお、どれだけ事前に準備しお問題朰しおおくかだなず蚀うのが正盎な印象です。 PoC䞭はPoCに察する問い合わせ察応を最優先にする 瀟内PoC䞭はPoCに関連する問い合わせの察応を最優先にするよう事前に自分の持っおいるタスクの段取りなどを調敎しおいたした。 PoC実斜䞭にうたくいかないケヌスがあったら問題刀別を匷行しない PoCしおもらっおいるメンバヌからうたく動かないなどの問い合わせがあった堎合、長時間に枡る可胜性がある問題刀別は極力避けるようにしたした。 これは、瀟内PoCに協力いただいおいるこず起因で、既存の業務に圱響が出おしたうのは本意ではないため、うたくいかない点の解消がすぐできなそうなら、既存の VPN に切り戻しお業務継続しおいただくような圢です。 評䟡方法 耇数補品を評䟡する堎合䜕らかの圢で数字に萜ずしお比范できるず嬉しいので、PoCに協力しおいただいたメンバヌにアンケヌト取る圢にした。 たずめ(ずいうか感想) たずめずいうか感想なのですが、瀟内の利甚者・情シス・むンフラ・再販事業者・補品ベンダヌなど立堎が倉わるず芋え方も倉わるず思いたすが、それぞれの立堎でみんな幞せになる圢で、構成を改善しおいけるずいいなずいう気持ちです。
゚ンゞニアの朚村です。最近は負荷察策のための リファクタリング やリアヌキテクティングのリヌドや、デヌタ基盀・ML・怜玢基盀を担圓するチヌムのマネヌゞャヌずしおデヌタ関連の案件に携わっおおりたす。 先週、webinar 圢匏で行われた Akamai TechWeek 2021 Japan にお、6/16 に「EdgeWorkersの導入に぀いお」ずいうテヌマで、昚幎末にバむマに導入したEdgeWorkersずいう Akamai のサヌビスに぀いお講挔したした。本ブログでもその内容を共有したいず思いたす。 スラむドはこちらになりたす。 EdgeWorkers の導入に぀いお - Akamai TechWeek 2021 Japan Customer Session ゚ッゞコンピュヌティング導入の背景 導入背景ずしおは、アクセス集䞭䞋でもサヌビス自身の ドメむン を通じお自らナヌザヌを远跡し、ファヌストパヌティデヌタを収集する必芁性ずいう事業課題がありたした。 アクセス集䞭を䌎う マヌケティング 斜策ぞの察応 事業課題の぀ずしお、モバむルぞのプッシュ通知ず、フラッシュセヌル斜策ずいう、いずれもアクセスの集䞭を匕き起こす マヌケティング 斜策ぞサヌビスずしお察応しおいく必芁がありたした。 たず、モバむルぞのプッシュ通知が増加しおいるのですが、その背景には時代やサヌビスの成長フェヌズの移り倉わりがありたす。マス マヌケティング からOne to One マヌケティング ぞず、我々の泚力ポむントが倉わっおきおいるからです。実際、以前は認知を広げお新芏顧客を獲埗するためにTVCMによるマスキャンペヌンを展開し、圓時はアクセス集䞭ずいえばTVCMの攟映起因がほずんどでした。最近は既存顧客䞀人䞀人に察しおパヌ゜ナラむズ した通知を送っおリテンションを図る斜策が増えおいたす。モバむルアプリをむンストヌルしおいるナヌザヌやLINEのバむマ公匏アカりントず連携しおいるナヌザヌはサヌビスぞのロむダリティが高く、通知の 開封 率も高いので特に䞀斉に送信するような通知ではTVCM攟映以䞊のアクセス集䞭が生たれおいたす。 フラッシュセヌルずは、 ブラックフラむデヌ ・ サむバヌマンデヌ などのセヌル斜策のこずです。期間や商品の圚庫も限定した圢で行われ、たた先皋のプッシュ通知により開始が通知されるのでアクセスの集䞭が発生したす。毎幎性胜改善を重ねおはいたのですが、スケヌルが難しいオンプレのむンフラを䜿っおいるサヌビスのずころでは察策に限界があったのず、幎々増加しおいくナヌザヌ数に远い぀かない状況で、毎幎このセヌルの開始盎埌はサむトのパフォヌマンスが䞍安定になっおいたした。 パヌ゜ナラむズずプラむバシヌ保護の䞡立 盎面しおいた事業課題の぀目は、プラむバシヌ保護ずパヌ゜ナラむズの䞡立です。 パヌ゜ナラむズ に぀いおですが、最近はレコメンドなどに代衚されるパヌ゜ナラむズ されたUXぞの期埅が高たっおいたす。北米やむギリスの消費者を察象にした2019幎の調査 *1 では、63%の消費者がサヌビスの暙準ずしおパヌ゜ナラむズ を期埅しおいるそうです。たた、自分だけの特別なオファヌが送られおきたり、サヌビスずの各接点で䞀人の同䞀の顧客ずしお認識されるこずで䞀人の個人ずしお扱われおいるず感じるそうです。したがっお、サむトのUXだけでなく、 マヌケティング 斜策にもパヌ゜ナラむズ が求められおいたす。さらに、そういったUX改善や マヌケティング 斜策の効果枬定でも、斜策による単玔なKPIの動きだけでなく、ナヌザヌを䞀人䞀人区別しお分析し、どのような属性の顧客に効いおいるのかずいった高い解像床での分析が求められおいたす。 たた、ナヌザヌはパヌ゜ナラむズ を期埅しおいる䞀方で、プラむバシヌの保護に぀いおの意識も高たっおいお、個人デヌタの収集に関しお透明性が求められおいたす。それに答えるように、 Safari や Chrome ずいったメゞャヌなブラりザでブラりザフィンガヌプリントや サヌドパヌティ クッキヌ、クラむアントサむドクッキヌは䜕らかの制限や芏制、あるいは廃止される予定になっおいたす。これにより、ナヌザヌを远跡する手段ずしおは、サヌビス自身の ドメむン を䜿っおのファヌストパヌティクッキヌだけが残され、そのクッキヌを通じお収集されるファヌストパヌティデヌタの重芁性が増しおきおいたす *2 。 ゚ッゞコンピュヌティングの導入理由 そういった背景から、なぜ゚ッゞコンピュヌティングの導入に至ったのかをお話ししたす。 CDN 導入のための必須芁件 背景にあったアクセスの集䞭に察応するために、それたで画像・js・ css ずいった静的コンテンツのみで倚なっおいた CDN での配信を、Webアプリから返しおいるHTMLや API ずいう動的コンテンツの配信にも導入するこずになりたした。たた、これも背景で説明したパヌ゜ナラむズ やデヌタ収集の必芁性から、 CDN を遞定するにあたり以䞋の぀の必須芁件を定めたした。 レスポンスをパヌ゜ナラむズ可胜 ゚ッゞアクセスデヌタず自瀟DWHの連携が可胜 ファヌストパヌティ Cookie 操䜜を゚ッゞぞ移行可胜 ぀目はレスポンスをパヌ゜ナラむズ可胜性、぀たりキャッシュするコンテンツをナヌザヌによっお分けたりが可胜かどうかです。぀目ぱッゞアクセスデヌタず自瀟DWHの連携が可胜かずいう点です。それたではオリゞンのWebサヌバヌのログをDWHぞ連携するこずでナヌザヌのサむト内の行動を分析しおいたのですが、キャッシュされるコンテンツに関しおはオリゞン偎ぞログが残らなくなるため、分析のために゚ッゞのアクセスデヌタを自瀟DWHぞ連携する必芁がありたす。぀目ですが、バむマでは未ログむンでセッションを匵っおいないナヌザヌも远跡可胜にするためにファヌストパヌティ cookie を利甚しおいお、これによりUXのパヌ゜ナラむズや マヌケティング 斜策の効果蚈枬を実珟しおいたす。その Cookie の操䜜凊理を゚ッゞぞ移行する必芁がありたした。 ITP2.1 ぞの察応 Cookie 操䜜凊理の゚ッゞぞ移行する必芁性の経緯ずしおは、ITP 2.1 ぞの察応ずいうのがありたす。 Cookie の操䜜凊理の倉遷 バむマでは圓初、その Cookie の操䜜を JavaScript の API であるDocument. cookie で行っおいたのですが、2019幎に Apple によっおブラりザの Javascript で䜜成する Cookie の有効期限は最倧7日に制限するずいうITP 2.1の Safari ぞの導入 がアナりンスされたした。バむマでは iOS の Safari のナヌザヌが倧半を占めるので、我々はそれたでブラりザの Javascript で行っおいた Cookie の操䜜をオリゞンの アプリケヌションサヌバ ヌ偎ぞ移行し、Set- Cookie ヘッダヌにより cookie を操䜜するように修正を行いたした。今回の CDN の導入の際は、キャッシュヒット時にもSet- Cookie ヘッダを返すこずで Cookie を操䜜する必芁性がでおきたす。したがっお、ファヌストパヌティ Cookie の操䜜凊理を゚ッゞサヌバヌ偎ぞ移行する必芁性がありたした。 Akamai EdgeWorkers を採甚 いく぀かの CDN サヌビスから Akamai を遞んだ理由ずしおは、䞊述の必須芁件を満たしおいたずいう点がありたした。プロパティだけでもかなり柔軟なルヌル蚭定が可胜で、それだけでもある皋床パヌ゜ナラむズは実珟可胜でした。たた、DataStream 2 ずいうサヌビスにいより゚ッゞのアクセスデヌタをリアルタむムに近い圢で、 Google のBigQuery䞊で構築しおいる自瀟のDWHぞデヌタ連携が可胜でした。さらに、EdgeWorkersにより Cookie 操䜜を゚ッゞサヌバヌ䞊ぞの移行が可胜ずいう点で必須芁件を党お満たすこずができたした。 たた、すでにスタティックコンテンツの配信では既に導入実瞟があったずいう点も採甚ぞの埌抌しになりたした。実は、この぀の必須芁件のパヌ゜ナラむズ、デヌタ連携、゚ッゞコンピュヌティングの機胜に぀いおは、他の競合 CDN サヌビスも提䟛されおいたす。ただ我々ずしおは利甚に慣れおいお信頌のある Akamai を䜿いたかったので、逆にこちらから゚ッゞコンピュヌティングの機胜に぀いお問い合わせたずころ、EdgeWorkersを提案いただき採甚に至りたした。 EdgeWorkers の開発・運甚 EdgeWorkersでどのように開発をすすめたのかや、実際の運甚状況に぀いお玹介したす。 利甚開始は簡単 最初のEdgeWorkersぞのずっかかりは簡単でした。すでに Akamai をお䜿いの方にはお銎染みのWebコン゜ヌル「Control Center」から利甚可胜です。実装も簡単で、開発者は むベントハンドラ のファンクションを実装するだけになりたす。今回クラむアントぞのレスポンスするタむミングで呌ばれる onClientResponse を実装したした。Web UI䞊でコヌディング、アクティベヌトも可胜だったので、 チュヌトリアル ずしおの Hello World を動かすずころたでは1日で到達できたした。 ラむブラリも利甚可胜 利甚できるラむブラリに぀いおですが、 cookie 操䜜やURLのパヌスなどは暙準で組み蟌たれいおいるモゞュヌルで十分可胜でした。たた、rollup.jsずいう JavaScript のモゞュヌルバンドラヌにより暙準組み蟌みでない、npm リポゞトリ で公開されおいる サヌドパヌティ 補モゞュヌルもbundle可胜でした。点だけ泚意ずいうか、圓然ではあるのですが、ブラりザ JavaScript のコヌドをそのたた移怍しようずしおも動かなかったです。元々はブラりザ JavaScript で Cookie を操䜜しおいたロゞックはあったのですが、曞き換える必芁はありたした。さらに现かいずころで蚀うず、ブラりザだずwindowのオブゞェクトにatobやbtoaずいう base64 ゚ンコヌディング ・デコヌディングをしおくれるfunctionが付いおるんですが、それは䜿えず、代わりにrollup.jsで base64 ゚ンコヌディング を行う3rdパヌティモゞュヌルをbundleしお呌び出しお䜿っおいたす。 開発時の デバッグ 方法 開発時の デバッグ 方法ですが、ログ出力をレスポンスヘッダに埋め蟌んで確認できるenhancend debug headerを利甚し、ステヌゞングぞアップロヌドアクティベヌトを繰り返しながらのプリント デバッグ で切り抜けたした。本圓は akamai の CLI でロヌカルにSandboxを構築しお利甚する方法もあるのですが、その構築が手順通りにやっおもうたくいかず、 ブラックフラむデヌ が差し迫っおいたこずもあり、問い合わせる䜙裕すらなかったので、実環境のステヌゞングでの開発ずなりたした。ただステヌゞングぞのアクティベヌトは毎回蚱容範囲内の時間で終わっおくれるので、このやり方でも開発は可胜でした。手順通りにやっおうたくいかないずいう点なのですが、ある皋床経隓のあるメンバヌが二人がトラむしお、二人ずもSandbox構築にハマっおいたので、ドキュメントに関しおは䜕らかの改善の䜙地はありそうです。昚幎末の話なので、既に改善されおいるかもしれないですが、期埅ずフィヌドバックの意味も蟌めお、ここで苊劎した゚ピ゜ヌドずしお玹介させおいただきたす。 開発時の参考リ゜ヌス 開発時に参考にしたリ゜ヌスずしおは、 ナヌザヌガむド もあるのですが、他にも GitHubのリポゞトリ にexampleが公開されおいお、先行事䟋があたりない段階での利甚だったので、開発時にはそれが倧倉助かりたした。 ブログ にも参考になりそうな蚘事がありたす。 ナヌスケヌス の玹介もありたすし、 Github ActionsでCICDを実珟するような事䟋も茉っおいお、 デベロッパ ヌフレンドリヌにできおるなず思いたした。 本番運甚しおみお 実際に本番運甚しおみおいる状況に぀いおですが、実行時間的なパフォヌマンスは非垞に良いです。゚ッゞでなにか凊理を行っおいおもUX䞊はなにもレむテンシを感じないレベルを維持できおいたす。 EdgeWorkersの実行時間の掚移 ただし、本番環境での トラブルシュヌティング 時のログ調査に課題があるなず感じたした。原因調査のため、ログ出力の解析をするためにログ取埗をしようずするず、Log Delivery Serviceを䜿うのですが、実際に手元にログが届くのが次の日になるので、 トラブルシュヌティング のサむクルを回すのが非垞に時間を芁する状態でした。EdgeWorkersをFaaS (Function As A Service) ずしお芋たずきに、競合ずしおは AWS のLambdaや GCP のCloud Functionがそれに圓たるず思うのですが、これらの堎合はリアルタむムに近い圢でWebUI䞊で本番のログをtailしたり、怜玢、分析できたりしたす。圓然 Akamai そういった機胜はあるのだろうず、期埅しおいたずころもありたしたが、そういた機胜は未提䟛ずなっおいるずころは残念なポむントでした。今埌提䟛されるこずを期埅したいず思いたす。 EdgeWorkersの今埌の掻甚ず期埅 私たちのEdgeWorkersの今埌の掻甚案や、EdgeWorkers自䜓に察しおどのような進化を期埅しおいるかずいうお話しをしたいず思いたす。 EdgeWorkersの今埌の掻甚案 今埌の掻甚案ずしおは、これたではキャッシュするこずでオリゞン偎の負荷をオフロヌドするだけでしたが、EdgeWorkersによりオリゞンのロゞック自䜓を゚ッゞぞ マむグレヌション しおよりアグレッシブなオフロヌドが可胜ずなったず思うので、今回は Cookie 操䜜の凊理だけでしたが、分散凊理可胜なものはEdgeWorkersぞ移行しおよりオリゞン偎の負荷を枛らすこずが考えられたす。たた、これたでオリゞン偎の負荷の制玄で諊めおいたサむトUXのパヌ゜ナラむズ斜策がたくさんありたす。工倫次第ではEdgeWorkersを䜿うこずで実珟できそうなものもありそうです。 EdgeWorkersぞの今埌の期埅 最埌に、EdgeWorkersぞの今埌の期埅ずしおは、運甚のずころでも述べた競合䞊みの監芖・ログ管理ツヌルの提䟛です。たた、監芖ずしお䜿えるものずしおEdgeWorkers Report API が提䟛されおいお、各皮メトリクスを取埗できるのですが、自瀟の監芖ツヌルに手動で蚭定する必芁がありたす。最近は我々も導入しおいるDataDogやNew Relicずいった3rd パヌティの監芖 SaaS があるので、 SaaS 偎にEdgeWorkersのむンテグレヌションを甚意しおもらっお簡単にメトリクスやログを収集し、垞時監芖できたらありがたいず思いたした。率盎に蚀っお、珟状のレポヌティングの機胜だけですず、 Cookie の操䜜のようなラむトな䜿い方が限界かなずいう印象です。これら監芖・ログのサポヌトが揃えば、ある皋床耇雑な凊理を曞いおも本番運甚に耐えるず思うので、今埌の掻甚案のずころで曞いたような、マむクロサヌビス を゚ッゞ䞊で構築するぐらいのヘビヌな掻甚も目指せるず思いたした。 たた、デヌタ連携の匷化も期埅したいです。EdgeKVずいう、Key Value ストアずしお䜿えるストレヌゞの機胜があるのですが、そこのデヌタが゚ッゞ䞊にあるたたでは掻甚は限定的なものになっおしたうず思いたした。そこのデヌタも自瀟のDWHなどに取り蟌み、他のデヌタず玐づけおの掻甚が可胜になれば理想的です。 たずめ 私たちは、アクセス集䞭による負荷の軜枛・パヌ゜ナラむズ・プラむバシヌの保護ずいうお互いに トレヌドオフ の関係にある課題を解決する必芁がありたした。゚ッゞコンピュヌティングの導入により、それらをどれも犠牲にするこずなくクリアするこずができたした。EdgeWorkersには、ドキュメントの敎備や運甚面ではただ課題はあるもの、それらが改善されれば開発者䜓隓ずしおはさらに向䞊し、よりディヌプな掻甚ぞず螏み出すこずができるず期埅しおいたす。 最埌に、私たちは今回玹介したようなUXの向䞊やプラむバシヌ保護に぀いおの課題など、玔粋にナヌザヌ目線でサヌビスの課題解決に日々取り組んでおりたす。 CDN を始め クラりド サヌビスや、最新テク ノロ ゞヌ を駆䜿しお䞖界を倉える流れを䜜るサヌビスを提䟛する仕事に興味のある方は、䞋のリンクからご応募お埅ちしおおりたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co *1 : https://www.businesswire.com/news/home/20190327005062/en/RedPoint-Global-Harris-Poll-Survey-Exposes-Gap *2 : https://www.gartner.com/en/newsroom/press-releases/2020-10-19-gartner-identifies-four-personalization-tactics-to-he
こんにちは。デザむナヌの別所です。 本日はenigmoデザむナヌの、最近気になっおいるデザむンに関するトピックをご玹介したいず思いたす。 今回のテヌマは「アプリUI線」です 心地よい䜿い勝手映画レビュヌアプリ「Must」 「Must」は映画/TVファンのための SNS アプリです。 䜜品のレビュヌを投皿したり、芋たい映画や番組をコレクションずしお保存できたり、友達ず繋がっお他の人がコレクションしおいる䜜品を芋たりするこずができたす。 おすすめ䜜品をデむリヌでレコメンドしおもらえたりもしたす。 2016幎にリリヌスされた アメリ カ生たれのアプリです。 匕甚 https://mustapp.com/ デザむナヌのこだわりを感じるUI/UX Mustの䞀番の特城は、画面の䞋半分の操䜜で完結するように蚭蚈されおいるUI/UXではないでしょうか。 レビュヌの入力や「芳たい」「鑑賞枈み」を遞択するボタンなど、このアプリのメむンアクションは党お画面の䞋郚で操䜜できるため、「指が届かない」「䞡手に持ち替える」などのストレスがなくスムヌズに操䜜できたす。 昚今の スマホ の様々な端末サむズに巊右されないような蚭蚈がされおいるんですね ストアのレビュヌでも優れたUI/UXに察しおのコメントが倚く芋られたす。 (レビュヌでUIに぀いお蚀及されるアプリっお珍しい気がしたす) 心地良いUIモヌション Mustは芋た目の矎しさだけでなく、モヌションにもこだわりを感じたす。 䜜品のサムネむルをタップするず、本棚から遞んで取り出すような雰囲気のモヌションが぀いおたす。タップした時にサムネが少し小さくなるずころも、ナヌザヌが抌したこずを認知させる衚珟で、现かい技が効いおたす。 䜜品情報のモヌダルは䜜品サムネむルにかぶさる様に画面䞋から衚瀺されレむダヌ感があるので、䜜品サムネむルず䜜品情報ずの優先順䜍を感じさせる芋た目になっおいたす。 テキスト芁玠をギリギリたで排陀したシンプルさ 匕甚 https://mustapp.com/ 海倖アプリっぜいな〜ず感じるのがテキスト芁玠の圧倒的少なさ。 基本的には䜜品名はテキストで衚瀺させず䜜品画像のみずなっおいたす。 このシンプルさが矎しい䜜品画像をより際立たせおる気がしたす。 芖認性担保のため小さい画像も無いずころが、䜜品情報を認識しやすく操䜜しやすいです。 楜しい絵文字遣い 絵文字の䜿い方にシャレが効いおいおオシャレです。 レビュヌを10段階で入力するずきは、数字によっお衚情が倉わりたす。 こういう小技で入力を楜しめる䜓隓っお良いですね。 海倖のアプリなので日本語のレビュヌや、邊題䜜品はただ少ないようです。 日本でももっず広たっお欲しいです 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは、Corporate IT/Business ITを担圓しおいる足立 です。 この蚘事は Enigmo Advent Calendar 2020 の 24日目の蚘事です。 ゚ニグモ では1人目のコヌポレヌトIT担圓ずしお未着手な瀟内IT環境をコツコツ敎備しおたす。 䞖間的には人情シスず呌ばれるポゞションです。 今回は2020幎に取り組んだ事を曞きたいず思いたす。 2020幎は䜕ず蚀っおもコロナりィルス 1月埌半から埐々に猛嚁が迫っおきお匊瀟も2月17日に察応・方針に぀いおの MTG が予定されおたした。 たた、偶然にも同タむミングでSlackの党瀟チャンネルに 䌚瀟に察し䜕らかの方針、察応があるのかず蚀う内容の投皿がありたした。 今思うず芋えない恐怖・䞍安が爆発した日だず思いたす。 コロナりィルス 2月17日 緊急招集 MTG 2月17日 倕方 経営陣、 監査圹 、郚眲長、情シスが招集されたした。 そこで決たった方針は䞋蚘内容になりたす。 方針の倧抂芁 ①「圚宅勀務」の掚奚 ②出瀟勀務の堎合は「時差通勀」掚奚ず「瀟内感染防止ルヌル」の厳守 ③本方針は翌営業日からのスタヌト コロナりィルスの圱響により、急遜党瀟的にリモヌトワヌクを䞀斉にスタヌトする事になりたした。 情シスずしおのMISSIONは リモヌトワヌク環境の構築 リモヌトワヌク環境・・・ 実はリモヌトワヌクを本導入しおたせんでした。 圓初の予定だずオフィスが元々囜立競技堎が近いず蚀うこずもありオリンピックに向けお リモヌトワヌクを段階的に詊隓導入する予定でした。 たた、コロナ犍前は情シスずしおリモヌトワヌク開始に぀いお反察の立堎をずっおいたした。 反察した理由 圓時でもリモヌトワヌクで業務出来る環境でありたしたが いく぀か課題があり䞭々、賛成する事は出来たせんでした。 代衚的な理由ずしおは・・・ 運甚、緊急時のフロヌが無い リモヌトワヌクの運甚フロヌ・ルヌルが構築されおいない 重倧むンシデント 発生した際の緊急連絡フロヌが確立出来おない りィルス察策が脆匱 コンシュマヌ版のりィルス察策゜フトを利甚しおたしたが、リモヌトワヌクを実斜するには匷化すべき郚分でした。 やはり管理コン゜ヌルが無い為、管理者ずしお各端末の状況が把握しにくい郚分が課題でした。 MDM Mobile Device Management導入しお無い りィルス察策の話ず同様に端末の状況を䞀括で集䞭管理出来る゜リュヌションが未導入 運甚・緊急時のフロヌ等は瀟内で方針を決めるだけなので、盎ぐに察応が出来る内容ですが 正盎、セキュリティ呚りをもう少し匷化な環境に敎えおから実斜したいず蚀う思いでした。 真っ先にやった事 デスクトップ パ゜コンのリプレむス 緊急事態に付き兎に角、業務が出来る環境にすべくデスクトップPCのリプレむスに着手したした。 圓然、パ゜コン無ければ仕事が出来たせん。 圓時、アルバむト・ 掟遣瀟員 が䜿甚しおいた玄20台皋の Windows デスクトップPCが 皌働䞭な為、盎ぐにメヌカヌに連絡し、1213台ず぀賌入し4週間皋で入れ替え完了させたした。 キッティングに関し初めはむメヌゞを䜜成しクロヌニングで察応も考えたのですが 䜜成・怜蚌する時間も無かったのず、 ゚ニグモ では予めむンストヌルする゜フトも少ないので 人力による力技で察応したした。 2019幎より少しず぀ノヌトPC化をしおいたので、䜕ずかなった感じです。 デスクトップPC リプレむス WEB䌚議・問い合わせ察応 Zoomを導入したした。 実は運良くコロナ犍前から導入に向けお動いおいたした。 導入した理由ずしおは Google Workspace旧称 G Suiteがあるので Google Meet利甚出来たしたが、やはり倧人数でのWEB䌚議はZoomの方が安定しおいたからです。 特に ゚ニグモ では4Mず呌ばれる党䜓集䌚が月1回あるので、そこは重芖したした。 たた、仮想背景機胜もあるので埓業員のプラむバシヌ保護の芳点や リモヌトコン トロヌル 機胜もあるのが決定打でした。 Zoom導入前にトラブルサポヌト察応で解決たでに時間かかった事䟋があったので この機胜にはだいぶ助けられたした。 Zoom察応ハヌドりェア DTEN導入 元々瀟 長宀・䌚議宀にAppleTVが蚭眮されおおりプロゞェクタヌを䜿甚しお 䌚議資料を投圱しおたした。 Mac はAirPlayを䜿甚しお安定的に投圱出来たすが、 Windows の堎合はAirParrot3ず蚀う シェアりェア を利甚しおたしたが非垞に動䜜が䞍安定ず蚀う課題がありたした。 プロゞェクタヌを利甚する際に郚屋を暗くする䞍䟿さ、動䜜が䞍安定な課題を解決する為 Zoom察応ハヌドりェア DTENを番倧きい䌚議宀ず瀟長宀に導入したした。 導入埌は Windows でも安定した投圱が可胜になりZoomRoomsアカりントで 無償アカりントナヌザヌでも時間無制限でWEB䌚議を利甚出来るようになりたした。 デメリットな郚分ずしおはお倀段が高いずころでしょうか 個人的には気に入っおいるハヌドです。 圓初は党䌚議宀に導入しようずしおいたので2台で止めずいお良かったです。 瀟長宀ず䌚議宀 電話察応 fondesk モバむルチョむス050 導入 コロナ犍ず蚀えども䌚瀟ぞ電話が鳎る日々でした。 その殆どは業務ず関係の無い営業電話や人材玹介の電話で月間300件皋着信があり 䞻にバックオフィス郚門にお党おの電話を受電し業務負荷が増え 電話察応する床に集䞭力が途切れお業務がたたならない状況でした。 たた、お客様の問い合わせに぀いおも迅速に察応出来ない事䟋も発生し 折返し察応するにも䌚瀟支絊の携垯電話が無いので個人の携垯電話を利甚する人も居たした。 そこで電話受付代行サヌビス fondeskを導入 導入埌は䌚瀟代衚電話番号をfondeskの番号ぞ転送し 転送先のオペレヌタヌの人が䞀時察応し党お折返し察応ずなりたす。 察応内容はSlackにお投皿されるので、総務が内容毎に関係郚眲や個人ぞ共有する運甚になりたした。 導入埌はオフィスが非垞に静かになり、こんなにも効果があるものかず感心したした。 たた、個人の電話察応ずしお 楜倩 コミュニケヌションズの モバむルチョむス050 を導入したした。 導入埌は個人 スマホ に050番号を付䞎する事が出来るので、折返し察応時にプラむベヌトの番号が䌝わる事が無い様になりたした。 メリットずしおは簡単にBYODを導入出来る、デヌタ通信ではなく音声回線を利甚しおいるので音質が安定しおいるのが良い郚分だず思いたす。 FAX察応 メヌル送信Slack連携 電話の次に察応したのでFAXです。 レガシヌなシステムず蚀えども銀行やカヌド䌚瀟のやり取りで䜿甚する為、 䜕かしら察応が必芁になりたした。 匊瀟のFAXは 耇合機 で送受信を行っおいるのですが 仕様を確認したずころ受信したFAXをメヌル送信出来る機胜があり盎ぐに蚭定 メヌル送信されたものはzapierを経由し Google ドラむブ共有ドラむブぞ保存され受信した際にSlackぞ通知されるようにしたした。 ただ、この構成で欠点がありたす。 耇合機 のFAXメヌル送信機胜は甚玙切れになるずメヌルが送信出来ない仕様でした。 ここは盲点でした。 FAXの構成 冒頭でも觊れたりィルス察策 リモヌトワヌクを始めるにあたり絶察にりィルス察策゚ンドポむントセキュリティの匷化は最䜎限譲れないず思っおたした。 そもそも Windows は Norton 、 Mac はESETずOS毎に違っおいる。 しかも、コンシュマヌ版を利甚しおいる状況 Excel でシリアル番号ずむンストヌル端末を管理するず蚀う運甚 この状況を打砎する為、CrowdStrikeを導入 念願の EDR を導入する事が出来たした。 展開が終わった時は達成感が凄かった・・・・ 䜕ず蚀っおも管理コン゜ヌルの存圚に感動、アラヌトが飛んでくる頌もしさ、勝手にアンむンストヌルされない安心感はプラむスレス。 ちなみに導入盎埌に管理コン゜ヌルにログむン出来ない事象がありたした。 原因は セカンダリ 環境にCrowdStrikeが構築されログむンURLが通垞ず違っおいたのが原因でした。 埌日談ずしおESETのアンむンストヌルを瀟内にアナりンスしたら、みんな光の速さで削陀しおたした・・・ たずめ 2021幎ぞ その他にも実斜した事もただあるのですが、今回曞くこずが出来ないのでい぀かタむミングあれば曞いおみたいず思いたす。 情シス芖点での犏利厚生制床を䜜ったり瀟内むベントをやったりしたした。 今埌リモヌトワヌクを栞ずしたワヌクスタむルぞの移行にむけおオフィスをリニュヌアルする予定で、 そこに向けお色々ず動いおいたす サヌバヌルヌム移蚭察応 瀟内ネットワヌク察応有線・無線 電話回線呚り 光収容 化・Dialpad導入 むンタヌネットFAX導入 受付システム導入 入退出システム導入 座垭予玄システム導入 AV機噚呚り察応 たた、月にokta導入が決定したした 出来たら来幎こそは MDM を構築したいず思っおたす。 では、以䞊になりたす。 ありがずうございたした。 明日の蚘事の担圓は 出品審査担圓 の 杉山 さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは、むンフラチヌムの 加藀 です。 この蚘事は Enigmo Advent Calendar 2020 の23日目の蚘事ずなりたす。 本蚘事では、リモヌトワヌク環境のため、擬䌌 DNS を瀟内提䟛したお話をしたす。 ゚ニグモ では、今幎の2月頃から党瀟的にリモヌトワヌクを開始したした。 それに䌎いむンフラチヌムでは、リモヌトワヌクのネットワヌク呚りの察応を行いたした。 ゚ニグモ が運甚しおいるサヌバ矀 ゚ニグモ の運甚するサヌバは、デヌタセンタヌ内に構築したものず AWS のものがありたす。 情シスの足立さん が、 SaaS 導入を進めお䞋さったためオフィス内にサヌバはほがありたせん。 サヌバぞの疎通経路 オフィス・リモヌト環境共に VPN 経由(+ ファむアりォヌル )で、サヌバ矀ぞアクセス可胜です。 リモヌトワヌク開始埌のサヌバアクセスの問題 リモヌトワヌク開始盎埌から、ネットワヌク蚭定に関するお問い合わせず、むンフラチヌムの察応が発生したした。 VPN や Wifi の蚭定など、個々人のネットワヌク蚭定の問題は、䞀床解決すれば再発するこずは滅倚にありたせんでしたが、 名前解決 は、䜕床もお問い合わせが頻発する厄介な課題でした。 なぜ、名前解決がリモヌトワヌクの課題だったのか コロナ犍以前 ゚ニグモ では、オフィス環境からサヌバぞのアクセスを楜にするため、 ファむアりォヌル でオフィスの グロヌバルIP を蚱可し、非゚ンゞニアスタッフの䜿甚するサヌバぞはサヌバの グロヌバルIP を指定しおアクセス可胜にしおいたした。 名前解決がリモヌトワヌクの課題ずなった原因 リモヌト環境からサヌバぞは、 VPN 経由でサヌバのロヌカルIPを指定しおアクセスする圢でした。そのためオフィスずリモヌト環境では、サヌバのアクセス情報が異なりたした。 敎理するず、以䞋の圢になりたす。 職堎 アクセス元のIP アクセス先のIP リモヌト環境 スタッフのお家 サヌバのロヌカルIPを指定 オフィス オフィスのGIP サヌバの グロヌバルIP を指定 リモヌトワヌク開始盎埌は、採甚や営業掻動、怜品䜜業のため出瀟が必芁なスタッフも居お、シフトで出瀟日を回しおいたした。出瀟したスタッフは、Hostsを瀟内甚に修正せねばならず、名前解決関係のお問い合わせが継続しおいたした。 DNS を導入すべきでしたが、 工数 がかかり難しいずころでした。 名前解決の課題を解決 Hostsを䞀元管理できないかず思案しおいたずころ、 SwitchHosts! を発芋し利甚するこずにしたした。 SwitchHosts!ずは Hostsファむルのサヌバ管理が可胜になる、端末のアプリです。 開発者は、サヌバからHostsファむルをダりンロヌドしお端末で䜿甚する圢ずなりたす。 SwitchHosts!のよかったずころ 無料公開されおいるアプリケヌションだったこず。 配垃元にリモヌトサヌバが䜿えお、Hostsファむルを集䞭管理できたこず。 Mac / Windows でも、同じUIで䜿えおサポヌトし易かったこず。 HostsのパヌツごずのON/OFFができ、localでHostsを修正できお組み合わせられるこず。 端末のHostsのバックアップが取れるこず。 SwitchHosts!を䜿甚した、擬䌌 DNS の運甚 ナヌスケヌス に合わせたHostsファむルを䜜成し、デヌタセンタヌにNginxコンテナを立おお配垃できるようにしたした。 これにより、オフィスでもリモヌト環境でも、簡単に DNS の機胜を提䟛できるようになりたした。 SwitchHosts!導入埌の課題ず解決方法 SwitchHosts!の導入埌、名前解決が原因ずなる問題はさっぱりずなくなりたした。 しかし「 AWS 環境における開発に䌎い、Hostsの修正が郜床必芁になる」ずいう課題が残りたした。 原因は、以䞋2぀でした。 スポット むンスタンス のマシンが再䜜成された際、Hostsの修正が必芁だった。 AWS 環境に、日々サヌバが増蚭されるため、Hostsに远蚘が必芁だった。 䞀時は、ダりンロヌド元のHostsファむルを手動で修正しおいたしたが、 無駄 な䜜業でした。 そこで、Hosts情報の曎新 スクリプト を䜜成し、Hostsファむルの自動曎新を実珟したした。 以䞋が、 スクリプト です。 #AWSのマシンには、${Prefix}タグず${Name}タグに、 #マシンのAZやサむト環境を呜名芏則ずしお持たせおいたす。 #!/usr/bin/env ruby require ' aws-sdk-ec2 ' ec2_client = Aws :: EC2 :: Client .new() #ARGVに、${Prefix}タグの倀(マシンのAZやサむト環境を呜名芏則ずしたもの)を持たせおいたす。 Prefix_list = ARGV f = { filters:[{ name : " tag:Prefix " , values : Prefix_list }]} reservations = ec2_client.describe_instances(f).inject([]) do | s , list | s += list.reservations end instances = reservations.each.inject([]) do | s , list | s += list.instances end instance_list = [] instances.each do | e | instance_list << { :instance_id => e.instance_id, :vpc_id => e.vpc_id, :public_ip => e.public_ip_address, :private_ip => e.private_ip_address, :name_tag => e.tags.find{| t | t.key == " Name " }.value, :prefix_tag => e.tags.find{| t | t.key == " Prefix " }.value.downcase, } end instance_list.each do | e | hostname = e[ :name_tag ].downcase #あずは、環境に合わせおよしなに加工しおHostsファむルに出力したす。 end たずめ DNS の機胜を䜎コストで提䟛できおよかったです❗ VPN ぞの䟝存床も枛らしたいので、 Google IAPを怜蚌䞭です。 同じむンフラチヌムの先茩瀟員 山口さんが、蚘事にされおいたした。 old schoolerなネットワヌク゚ンゞニアがIAP Connectorを詊しおみた - ゚ニグモ開発者ブログ 最埌に 明日の蚘事の担圓は、 情シスの足立さん です。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
今幎組織䜜りに貢献するためにやったこず こんにちは。アプリケヌション開発グルヌプの穎柀です。 この蚘事は Enigmo Advent Calendar 2020 の 22 日目の蚘事です。 今幎の振り返りずずもに䞻に自分が去幎から今幎にかけお䞭途で入瀟した方にやっおきたこずを曞いおおきたす。 これからチヌムに新しい人を迎える人や、 䞭途採甚 入瀟する方、チヌムの組織づくりに興味がある方に読んでいただければずおもいたす。 実際に取り組んだこず オンボヌディング資料 開発手法、フロヌ・チェックリストの読み合わせ 1on1 1.オンボヌディング資料 ゚ニグモ では郚眲問わず、今幎から䞭途で入瀟した瀟員向けのzoomでのオンボヌディングが開始されたした。 簡単にいうず、「各事業郚が具䜓的になにをやっおいるか」「どんな取り組みをしおいるか」を䞭途入瀟した方に説明したす。 入瀟された人は郚眲ごずに数回に分けお参加しおいたす。 思えば今幎の早い段階からリモヌトワヌクが掚奚された状況で、䞭途入瀟問わず、自分の所属する郚眲以倖の方ず顔を芋合わせお話をする機䌚ずいうのが極端に枛りたした。䟋えば「先月入瀟した方ですね、XX郚眲のXXです」ずいったようなコミュニケヌションも、廊䞋や゚レベヌタで顔をあわせたり、ミヌティングの終わりですれ違う、お手掗いで顔を合わせるなどのタむミングで行われおきたした。それぞれを取るずずおも些现なこずですが、これらを積み重ねた䜕かが䌚瀟の瀟颚や文化を 醾造 する䞀郚になっおいたんだなず感じたす。 瀟颚や文化をオンラむンでも実珟するために、このオンボヌディング時に自分が玹介する担圓ずしお実践しおいるこずは以䞋の点です。现かい箇所は割愛したすが、リモヌトワヌクならでは、でしょうか。 説明資料に自郚眲の瀟員の氏名ずSlack名の玐付け顔ずアむコンず名前ずSlack名が䞀臎しない問題 アプリ、むンフラ、デヌタ基盀、それぞれに぀いおの盞談盞手ずしおたずは芚えおおいおほしい人を゚ピ゜ヌドを添えお玹介そんなに色々玹介されおも芚えられない問題 BUYMA の仕組みで聞きたいこず、盞談したいこずがあったら、ここで盞談しおね、のチャットの玹介䜕かを盞談したくなっおもどこだかわからない問題 参加しおくれた方ずサヌビス゚ンゞニアリング本郚ずの具䜓的な関わり玹介しおもらったけど具䜓的にどういう関わりがあるんだろう問題 2.開発手法、フロヌ・チェックリストの読み合わせ BUYMA ずいうサヌビスが産声を䞊げお10幎以䞊たちたす。尖った技術を䜿っおいるずころもあれば枯れおいるずころ、 やや枩かみのある仕組みのずころもあり、䞭途で入瀟する゚ンゞニアの方が躓くずころもあるため、䞻に若手の方察象に週1回皋床開発やリリヌスの際に 気を぀けおほしい点を esa にたずめたフロヌ・チェックリストの読み合わせを行いたした。 基本的に開発に関わる問題点は、所属しおいるチヌムのリヌダヌやメンタヌが答えおくれたすが、 圌らに䞀点集䞭よりも、誰にきいおも答えおもらえる、誰にきいおも倧䞈倫、ずいう雰囲気䜜りに自分も貢献したかったから です。たしおや、自分の所属するチヌム以倖の゚ンゞニアず、躓きや悩みを共有する堎所はいく぀あっおもいいず考えおいたす。 時には 怜玢゚ンゞン チヌムの゚ンゞニアをゲストに迎えお怜玢呚りの説明をしおもらったり、 チェックリストに぀いおは実際トラブルに遭遇した゚ンゞニア に「なぜこのチェック項目があるのか」ずいうのを語っおもらいたした。 3.1on1 1on1は前職でも取り組んできたこずですが、今幎特に自分が取り組んできたこずをあげたす。 アゞェンダ を甚意する 序盀はなかなか甚意できたせんでしたが、埌半は実斜の1,2日前にいく぀か アゞェンダ を甚意するようにしたした。 4,5぀甚意しおその䞭のトピックで話が広がれば盛り䞊がり、割愛しおできるだけ 「話が盛り䞊がる」「盞手の指向性、興味関心がわかりそう」 な所を意識しおすすめおいきたした。 1on1は「・・・最近どうですか」ずいうやり方もありたすが、1on1を実斜するメンバヌの身になっお考えおみるず 「なにを話せばいいんだ」「なにを蚀われるのか」ず身構えられおしたうこずもありたす。明日はこういう事を話そう。を甚意する方が 時間も有意矩ですし、もしネガティブな話をされるずいうこずが事前にわかっおいれば、自分が蚀いたいこずも事前に甚意するなど、お互いに準備ができ、結果的に少しの準備で埗られる物が倧きいず感じたした。 䌚瀟党䜓の動きがわかるトピックを アゞェンダ に混ぜお話す メンバヌの仕事や取り組みず盎接関係のない、䌚瀟の動きや斜策。最近の売䞊。他郚眲に入瀟した人のこんなずころが凄いなど。 䌚瀟の䞭での私達の郚眲の動き、斜策以倖の取り組みや課題など、自分ず䌚瀟を぀ないでいる環境にどんなものがあり、どんな動きをしおいるか。䞭途入瀟の序盀だず、芋えにくい組織の動きを定期的に アゞェンダ に混ぜお話をするようにしおいたす。   たずめ 今幎は、い぀もやっおいるこずαの「工倫する」泚力をしたした。特に、コロナ犍のリモヌトワヌクで感じやすい「孀独感」を和らげるための「皆さんは䞀人ではないですよ」ずいうこずを䌝えるために、様々なできるこずを暡玢した幎だった様に思いたす。取り組みの結果を 定量 的にはかるこずはできないので難しいですが、フィヌドバックを受けながら、来幎も少しず぀改善しおいきたいず思いたす。 よいお幎を。 明日の蚘事の担圓は むンフラグルヌプ の 加藀 さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは、デヌタアナリストの田䞭里柄です。 ゚ニグモ ではデヌタ掻甚掚進宀ずいう郚眲に所属しおおり、䞻に他郚眲が行った斜策の効果怜蚌を担圓しおいたす。 私は2020幎11月に ゚ニグモ に入瀟したので、今回はその転職掻動の䞭でどうしお今の職を遞んだのか、たた入瀟埌どのような仕事をしおいるのかを玹介できればず思いたす。 前職は ラむブ配信 サヌビスを運営しおいる䌚瀟で、同じくデヌタアナリストずしお働いおいたした。 転職理由に぀いお前職に察しおネガティブなこずは䞀切なく(むしろ今も倧奜きな䌚瀟です)、今の自分は別の䌚瀟で経隓を積んだ方がいいず刀断したためです。 なぜこの内容を曞くのか 理由は瀟倖の方向けず瀟内の方向けでそれぞれありたす。 瀟倖の方にはデヌタアナリストの転職掻動の参考にしおもらいたいため 瀟内の方にはただ入瀟しお日が浅い私の自己玹介になるためです。転職掻動だけでなく、自分がどんな仕事をできるか/したいかに぀いおも曞いおいたす。 そもそもデヌタアナリストずは ここであくたで自分の考えにはなりたすが、デヌタアナリストずはどんな仕事をするのかを説明したす。 読んでくださっおいる方に知っおいただきたいですし、私が転職掻動をしたずきにも実際に自分の䞭で敎理したした。 その敎理のおかげで、無数にある求人(特にデヌタ〇〇ずいう職皮は最近倚い)の䞭でピックアップする際や、面接時に自分がしたいこずを説明する際に圹立ちたした。 デヌタアナリストがどんな仕事をするのかを䞀蚀で衚すず、「意思決定に必芁な情報/ むンサむト を提䟛する仕事」だず思っおいたす。 デヌタを分析する仕事じゃないのずいう意芋もあるかもしれたせんが、分析はあくたで手段であり意思決定をするこずが目的だず考えおいるのでこのような曞き方をしたした。 もしかするずコンサルずいう職皮でむメヌゞされる仕事に近いかもしれたせん。(䜙談ですが、思考法を勉匷するためにコンサル向けの本を読むこずもありたす) 逆にいうず、こういった仕事をする人のこずを「デヌタアナリスト」ず定矩しおいる䌚瀟が倚いずも蚀えたす。(本質的にはこちらが正しいかもしれたせん) どんな䌚瀟を求めおいたのか 䞊蚘で曞いたデヌタアナリストずしおの仕事ができるこずはもちろんですが、さらにそれを具䜓化した自分のしたい仕事に぀いお2点、たたそれに関連した仕事の環境に぀いお2点合わせお4点求めおいるこずがありたした。 どんな意思決定に携わりたいのか 意思決定にも長期的な経営に関するものや日々のオペレヌションに関するものなど色々な皮類がありたす。 その䞭でも私はプロダクトの改善に関する意思決定に携わりたいず考えおいたした。 なぜならナヌザヌに喜んでもらえるこずに盎結しお実感しやすく、たた分析するなかで人がどんな考えで行動するのかを垣間芋るこずができるためです。 どんなデヌタを分析するのか デヌタは倧きく分けるず 定量 ず定性の2皮類に分けるこずができたすが私はその䞡方を甚いお分析したいず考えおいたした。 特に 定量 的なデヌタだけを扱うこずが求められる堎合もありたすが、ナヌザヌの行動理由を知るためにはそれだけでは分からないこずがたくさんあるためです。 他の職皮(特に意思決定者)ずの連携が取りやすい 䞊の方で曞いおいたデヌタアナリストの仕事内容を遂行するためには他の職皮の方ずの連携が倧切です。 その䞭でも特に最終的に意思決定をする方ずの連携がずおも倧事だず考えおいたした。 分析をする前にはどんなこずが分かれば意思決定ができるかを摺り合わせ、分析埌にはそこで分かったこずを共有し議論するこずで意思決定に付き添うためです。 分析をするためのデヌタ基盀が敎っおいるか 敎っおいるずいう蚀葉が曖昧ですが、䟋倖はあれど日々の分析をする際の前凊理やデヌタの準備に自分の持っおいるスキル以䞊のこずを求められないこずが基準でした。 もちろん埌々はデヌタ基盀の構築などのスキルも䌞ばしおいきたいのですが、それをすぐに求められお本圓にやりたいこずに時間が䜿えないのはしんどいので求める芁件に入っおいたした。 実際に入瀟しおみお感じたこず 最終的に ゚ニグモ 瀟に決めた理由ずしおは、䞊蚘の求めおいるこずを党お満たせおいるず遞考䞭や内定をいただいた埌の面談で感じたからです。 ここでは入っおみお実際に感じたこずを玹介したす。 分析結果を共有する際に、集蚈結果だけでなく考察や ネクス トアクションも求められたた歓迎されおいい。 求めおいた意思決定者ずの連携に぀いお、非垞に取りやすいので分析の方針を立おやすい。 デヌタ分析基盀に぀いお、基本的に必芁なデヌタがBQにあっお扱いやすい。ただし、それぞれのテヌブルの定矩などがわからないずころやGAのデヌタに぀いおの扱い方を調べる必芁があったりず、デヌタはあるが扱い方は聞いたり調べたりが必芁なので、今埌入っおくる方のためにただただ敎える䜙地がある。 入っおからどんな仕事をしおいるか 䞻に2皮類の斜策の振り返りずアプリの分析方針を立おる仕事をしおいたす。 斜策に぀いおはどちらも私が入瀟する少し前から始めおいたもので、毎月改善を加えおやっおいこうずいう前提のものでした。 なので振り返りでどんな数字を芋るのかずいうずころから任せおもらい、翌月の改善点の提案を出すずころたで行っおいたす。 アプリの分析方針に぀いおは、私が入瀟するたでは売䞊ずいうKGIを远い぀぀、KPIずしお䜕を远うべきかに぀いお詊行錯誀をしおいたずいう状況です。 そこで今埌远うべきKPIに぀いお決める仕事を担っおおり、今は私の提案を元に議論しおいたす。 総じおいうず、珟圚自分のしたいず思っおいた仕事ができおおり今埌もただただやりたいこずが溢れおいたす。 コロナ犍で入瀟埌のコミュニケヌションは以前ず比范するず難しいなずは感じおおりたすが、より䞀局迅速で玍埗感のある意思決定に貢献できるように日々の業務に努めおいければず思っおいたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは。 今幎4月に ゚ニグモ に入瀟したデヌタ゚ンゞニアの谷元です。 この蚘事は Enigmo Advent Calendar 2020 の 20日 目の蚘事です。 目次 はじめに そもそも同期凊理ずは Airflowによる同期凊理 怜蚌時のコヌド サンプルをAirflow画面で芋るず 同期遅延なし時のAirflowログ 同期遅延あり時のAirflowログ 同期タむムアりト時のAirflowログ 所感 最埌に はじめに コロナ犍の䞭、皆さんどのようにお過ごしでしょうか。 私はリモヌトワヌクを続けおたすが、自宅のリモヌトデスクワヌク環境をすぐに敎えなかったため、薄いクッションで座りながらロヌテヌブルで3ヶ月経過した頃に身䜓の節々で悲鳎をあげたした。猫背も加速... さお、 ゚ニグモ での仕事も半幎以䞊経過し、デヌタ分析基盀の開発運甚保守やBI䞊でのデヌタ敎備などを察応をさせおいただいおたすが、今回は瀟内で利甚されおいるAirflowの 同期凊理 の話をしたいず思いたす。 尚、こちらの蚘事を曞くにあたり、同環境の過去蚘事 Enigmo Advent Calendar 2018 がありたすので、良ければそちらもご芧ください。 そもそも同期凊理ずは 䟋えば、以䞋のようなデヌタ分析基盀䞊でのETL凊理があったずしたす。 凊理1. 連携元DBのあるテヌブルをDataLake(GCS)ぞファむルずしお栌玍埌、DWH(BigQuery)ぞロヌドする 凊理2. DWH䞊のデヌタを加工埌、倖郚ぞCSV連携する 䞊蚘の凊理は順番に実行されないず必芁なデヌタを含めた抜出ができなくなっおしたい、倖郚ぞデヌタ連携できなくなりたす。そのためには凊理1の正垞終了確認埌に凊理2を実斜するずいう、同期凊理を意識した実装をする必芁がありたす。 䟋だずシンプルですが、業務䞊では埐々にETL凊理も増えおいき、耇雑化しおいきたす。 こうした同期凊理は、初めはなくおも問題にならないこずが倚いのですが、埐々に凊理遅延が発生しおタむミングが合わなくなったり、予期せぬ䞀郚の凊理゚ラヌが原因で関連する埌続凊理が党お意図せぬ状態で動き出しおしたったりしたす。そうならないためにも、蚭蚈時点で同期に぀いお意識するこずが倧事だず思いたす。 Airflowによる同期凊理 Airflowでは ExternalTaskSensor を䜿甚するこずで実装可胜ずなりたす。 Airflowの゜ヌス䞊ではdependずいう甚語が䜿われおいるので、Airflowの䞖界では「同期」ではなく、「䟝存」ず呌んだ方が良いのかもしれたせん。適匁読み替えおいただければ... では、Airflowでの同期怜蚌甚サンプルコヌドを䜜成しおみたしたので、実際に動かしながら怜蚌したいず思いたす。尚、Airflowバヌゞョンは1.10.10ずなりたす。 先ほどのETL凊理を䟋にしお、䞋蚘の内容で怜蚌しおみたす。 実際のファむル出力やDBぞのロヌド凊理などはここでは割愛しお、 DummyOperator に眮き換えおたす。 凊理1. 連携元DBのあるテヌブルをDataLake(GCS)ぞファむルずしお栌玍埌、DWH(BigQuery)ぞロヌドする dag_id: sample_db_to_dwh_daily schedule: 日次16:00 tables: TABLE_DAILY_1, TABLE_DAILY_2, TABLE_DAILY_3 凊理2. DWH䞊のテヌブルを甚いおデヌタ加工埌、倖郚ツヌルぞCSV連携する dag_id: sample_dwh_to_file_daily_for_sync_daily_16 schedule: 日次17:00 tables: TABLE_DAILY_1, TABLE_DAILY_2, TABLE_DAILY_3 怜蚌時のコヌド たずは凊理1のサンプルコヌドになりたす。 from airflow.models import DAG from datetime import datetime from airflow.operators.dummy_operator import DummyOperator dag = DAG( dag_id='sample_db_to_dwh_daily', start_date=datetime(2020, 12, 1), schedule_interval='0 16 * * *' ) tables = ['TABLE_DAILY_1', 'TABLE_DAILY_2', 'TABLE_DAILY_3' ] for table_name in tables: db_to_dwh_operator = DummyOperator( task_id='db_to_dwh_operator_%s' % table_name, dag=dag ) terminal_operator = DummyOperator( task_id='terminal_operator_%s' % table_name, dag=dag, trigger_rule='none_failed' ) db_to_dwh_operator >> terminal_operator 次に凊理2のサンプルコヌドです。 from airflow.models import DAG from airflow.operators.dummy_operator import DummyOperator from airflow.sensors.external_task_sensor import ExternalTaskSensor from airflow.utils.state import State from datetime import datetime, timedelta tables = ['TABLE_DAILY_1', 'TABLE_DAILY_2', 'TABLE_DAILY_3' ] def _dwh_to_file_operator(dag, table_name, depend_external_dag_id, depend_external_dag_execution_delta): dwh_to_file_operator = DummyOperator( task_id='dwh_to_file_operator_%s' % table_name, dag=dag ) sensors = [] sensors.append(ExternalTaskSensor( task_id='wait_for_sync_db_to_dwh_%s' % table_name, external_dag_id=depend_external_dag_id, external_task_id='terminal_operator_%s' % table_name, execution_delta=depend_external_dag_execution_delta, allowed_states=[State.SUCCESS, State.SKIPPED], dag=dag)) for sensor in sensors: sensor >> dwh_to_file_operator terminal_operator = DummyOperator( task_id='terminal_operator_%s' % table_name, dag=dag, trigger_rule='none_failed') dwh_to_file_operator >> terminal_operator args = { 'start_date': datetime(2020, 12, 3) } dag = DAG( dag_id='sample_dwh_to_file_daily_for_sync_daily', default_args=args, schedule_interval='0 17 * * *' ) for table_name in tables: _dwh_to_file_operator( dag=dag, table_name=table_name, depend_external_dag_id='sample_db_to_dwh_daily', depend_external_dag_execution_delta=timedelta(hours=1) ) サンプルをAirflow画面で芋るず 䞊蚘2぀のDAGをAirflowのWebUIで芋るず以䞋のようになりたす。 同期凊理をするoperatorは「wait_for_sync_db_to_dwh 」です。図でも ExternalTaskSensor のアむコンになっおたすね。 今回は3テヌブルあり、それぞれ䞊列凊理を想定しおいるため、3぀ありたす。 そしお、それぞれ、該圓するテヌブルのterminal_operator凊理完了を確認埌、埌続凊理が実行されたす。 では䞊蚘の同期凊理がAirflowのログでどのように衚瀺されるか芋おいきたいず思いたす。 同期遅延なし時のAirflowログ たずは、既に sample_db_to_dwh_daily が完了しおいた堎合です。 3テヌブル毎のログを茉せおおきたす。 TABLE_DAILY_1 ~~ DAG: sample_dwh_to_file_daily_for_sync_daily Task Instance: wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-07 17:00:00 ~~ [2020-12-09 02:00:09,833] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,840] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,841] {taskinstance.py:879} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,841] {taskinstance.py:880} INFO - Starting attempt 1 of 1 [2020-12-09 02:00:09,841] {taskinstance.py:881} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,848] {taskinstance.py:900} INFO - Executing <Task(ExternalTaskSensor): wait_for_sync_db_to_dwh_TABLE_DAILY_1> on 2020-12-07T17:00:00+00:00 [2020-12-09 02:00:09,851] {standard_task_runner.py:53} INFO - Started process 48063 to run task [2020-12-09 02:00:09,905] {logging_mixin.py:112} INFO - Running %s on host %s <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-07T17:00:00+00:00 [running]> ip-123-456-78-910.dokoka_toku.compute.internal [2020-12-09 02:00:09,919] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-07T16:00:00+00:00 ... [2020-12-09 02:00:09,921] {base_sensor_operator.py:123} INFO - Success criteria met. Exiting. [2020-12-09 02:00:09,924] {taskinstance.py:1065} INFO - Marking task as SUCCESS.dag_id=sample_dwh_to_file_daily_for_sync_daily, task_id=wait_for_sync_db_to_dwh_TABLE_DAILY_1, execution_date=20201207T170000, start_date=20201208T170009, end_date=20201208T170009 [2020-12-09 02:00:19,834] {logging_mixin.py:112} INFO - [2020-12-09 02:00:19,834] {local_task_job.py:103} INFO - Task exited with return code 0 TABLE_DAILY_2 ~~ DAG: sample_dwh_to_file_daily_for_sync_daily Task Instance: wait_for_sync_db_to_dwh_TABLE_DAILY_2 2020-12-07 17:00:00 ~~ [2020-12-09 02:00:09,831] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_2 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,839] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_2 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,839] {taskinstance.py:879} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,840] {taskinstance.py:880} INFO - Starting attempt 1 of 1 [2020-12-09 02:00:09,840] {taskinstance.py:881} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,846] {taskinstance.py:900} INFO - Executing <Task(ExternalTaskSensor): wait_for_sync_db_to_dwh_TABLE_DAILY_2> on 2020-12-07T17:00:00+00:00 [2020-12-09 02:00:09,848] {standard_task_runner.py:53} INFO - Started process 48062 to run task [2020-12-09 02:00:09,902] {logging_mixin.py:112} INFO - Running %s on host %s <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_2 2020-12-07T17:00:00+00:00 [running]> ip-123-456-78-910.dokoka_toku.compute.internal [2020-12-09 02:00:09,916] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_2 on 2020-12-07T16:00:00+00:00 ... [2020-12-09 02:00:09,918] {base_sensor_operator.py:123} INFO - Success criteria met. Exiting. [2020-12-09 02:00:09,921] {taskinstance.py:1065} INFO - Marking task as SUCCESS.dag_id=sample_dwh_to_file_daily_for_sync_daily, task_id=wait_for_sync_db_to_dwh_TABLE_DAILY_2, execution_date=20201207T170000, start_date=20201208T170009, end_date=20201208T170009 [2020-12-09 02:00:19,832] {logging_mixin.py:112} INFO - [2020-12-09 02:00:19,832] {local_task_job.py:103} INFO - Task exited with return code 0 TABLE_DAILY_3 ~~ DAG: sample_dwh_to_file_daily_for_sync_daily Task Instance: wait_for_sync_db_to_dwh_TABLE_DAILY_3 2020-12-07 17:00:00 ~~ [2020-12-09 02:00:09,829] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_3 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,837] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_3 2020-12-07T17:00:00+00:00 [queued]> [2020-12-09 02:00:09,837] {taskinstance.py:879} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,837] {taskinstance.py:880} INFO - Starting attempt 1 of 1 [2020-12-09 02:00:09,837] {taskinstance.py:881} INFO - -------------------------------------------------------------------------------- [2020-12-09 02:00:09,844] {taskinstance.py:900} INFO - Executing <Task(ExternalTaskSensor): wait_for_sync_db_to_dwh_TABLE_DAILY_3> on 2020-12-07T17:00:00+00:00 [2020-12-09 02:00:09,847] {standard_task_runner.py:53} INFO - Started process 48061 to run task [2020-12-09 02:00:09,901] {logging_mixin.py:112} INFO - Running %s on host %s <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_3 2020-12-07T17:00:00+00:00 [running]> ip-123-456-78-910.dokoka_toku.compute.internal [2020-12-09 02:00:09,915] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_3 on 2020-12-07T16:00:00+00:00 ... [2020-12-09 02:00:09,917] {base_sensor_operator.py:123} INFO - Success criteria met. Exiting. [2020-12-09 02:00:09,920] {taskinstance.py:1065} INFO - Marking task as SUCCESS.dag_id=sample_dwh_to_file_daily_for_sync_daily, task_id=wait_for_sync_db_to_dwh_TABLE_DAILY_3, execution_date=20201207T170000, start_date=20201208T170009, end_date=20201208T170009 [2020-12-09 02:00:19,831] {logging_mixin.py:112} INFO - [2020-12-09 02:00:19,831] {local_task_job.py:103} INFO - Task exited with return code 0 泚目しお欲しい行は䞋蚘ずなりたす。 ※ 他テヌブルのログも同じですので、ここから先は蚘茉を割愛したす [2020-12-09 02:00:09,919] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-07T16:00:00+00:00 ... これが同期凊理のログになりたす。 今回は既に正垞終了しおいたため、1回の確認しか行われおおらず、その埌、埌続凊理も含めお正垞終了しおるこずが分かりたす。 同期遅延あり時のAirflowログ 次に前提のタスクが遅延しお正垞終了した堎合のAirflowログもみおいきたいず思いたす。 ~~~ DAG: sample_dwh_to_file_daily_for_sync_daily Task Instance: wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-08 17:00:00 ~~~ [2020-12-10 02:00:04,174] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-08T17:00:00+00:00 [queued]> [2020-12-10 02:00:04,182] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-08T17:00:00+00:00 [queued]> [2020-12-10 02:00:04,182] {taskinstance.py:879} INFO - -------------------------------------------------------------------------------- [2020-12-10 02:00:04,182] {taskinstance.py:880} INFO - Starting attempt 1 of 1 [2020-12-10 02:00:04,182] {taskinstance.py:881} INFO - -------------------------------------------------------------------------------- [2020-12-10 02:00:04,189] {taskinstance.py:900} INFO - Executing <Task(ExternalTaskSensor): wait_for_sync_db_to_dwh_TABLE_DAILY_1> on 2020-12-08T17:00:00+00:00 [2020-12-10 02:00:04,192] {standard_task_runner.py:53} INFO - Started process 21683 to run task [2020-12-10 02:00:04,245] {logging_mixin.py:112} INFO - Running %s on host %s <TaskInstance: sample_dwh_to_file_daily_for_sync_daily.wait_for_sync_db_to_dwh_TABLE_DAILY_1 2020-12-08T17:00:00+00:00 [running]> ip-123-456-78-910.dokoka_toku.compute.internal [2020-12-10 02:00:04,259] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 02:01:04,322] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 02:02:04,385] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 02:03:04,448] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 02:04:04,511] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... (省略) [2020-12-10 10:27:29,163] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 10:28:29,226] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 10:29:29,273] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 10:30:29,298] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 10:31:29,360] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_daily.terminal_operator_TABLE_DAILY_1 on 2020-12-08T16:00:00+00:00 ... [2020-12-10 10:31:29,363] {base_sensor_operator.py:123} INFO - Success criteria met. Exiting. [2020-12-10 10:31:29,366] {taskinstance.py:1065} INFO - Marking task as SUCCESS.dag_id=sample_dwh_to_file_daily_for_sync_daily, task_id=wait_for_sync_db_to_dwh_TABLE_DAILY_1, execution_date=20201208T170000, start_date=20201209T170004, end_date=20201210T013129 [2020-12-10 10:31:33,698] {logging_mixin.py:112} INFO - [2020-12-10 10:31:33,698] {local_task_job.py:103} INFO - Task exited with return code 0 先ほどのPoking行がログに衚瀺され続けおいるこずが分かりたす。今回は途䞭でタスクを手動で動かしお正垞終了させたした。 尚、Pokingの間隔はExternalTaskSensorの匕数で poke_interval を蚭定するず倉曎ができたした。゜ヌスを芋るずデフォルトは60秒のようです。ログずも䞀臎しおたすね。 同期 タむムアりト 時のAirflowログ 業務では非機胜芁件も倧事だず思いたす。 Airlfowでは、ExternalTaskSensorの匕数で timeout があるようです。 こちらで タむムアりト (default: 1週間ですかね、長っ)を適切に蚭定しお、゚ラヌ怜知をしおみたいず思いたす。 sample_dwh_to_file_daily_for_sync_hourly/wait_for_sync_db_to_dwh_TABLE_HOURLY_1/2020-12-09T17:00:00+00:00/4.log. [2020-12-11 18:21:14,539] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_hourly.wait_for_sync_db_to_dwh_TABLE_HOURLY_1 2020-12-09T17:00:00+00:00 [queued]> [2020-12-11 18:21:14,551] {taskinstance.py:669} INFO - Dependencies all met for <TaskInstance: sample_dwh_to_file_daily_for_sync_hourly.wait_for_sync_db_to_dwh_TABLE_HOURLY_1 2020-12-09T17:00:00+00:00 [queued]> [2020-12-11 18:21:14,551] {taskinstance.py:879} INFO - -------------------------------------------------------------------------------- [2020-12-11 18:21:14,551] {taskinstance.py:880} INFO - Starting attempt 4 of 9 [2020-12-11 18:21:14,552] {taskinstance.py:881} INFO - -------------------------------------------------------------------------------- [2020-12-11 18:21:14,563] {taskinstance.py:900} INFO - Executing <Task(ExternalTaskSensor): wait_for_sync_db_to_dwh_TABLE_HOURLY_1> on 2020-12-09T17:00:00+00:00 [2020-12-11 18:21:14,568] {standard_task_runner.py:53} INFO - Started process 84130 to run task [2020-12-11 18:21:14,625] {logging_mixin.py:112} INFO - Running %s on host %s <TaskInstance: sample_dwh_to_file_daily_for_sync_hourly.wait_for_sync_db_to_dwh_TABLE_HOURLY_1 2020-12-09T17:00:00+00:00 [running]> ip-123-456-78-910.dokoka_toku.compute.internal [2020-12-11 18:21:14,639] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_hourly.terminal_operator_TABLE_HOURLY_1 on 2020-12-10T16:00:00+00:00 ... [2020-12-11 18:22:14,701] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_hourly.terminal_operator_TABLE_HOURLY_1 on 2020-12-10T16:00:00+00:00 ... [2020-12-11 18:23:14,764] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_hourly.terminal_operator_TABLE_HOURLY_1 on 2020-12-10T16:00:00+00:00 ... [2020-12-11 18:24:14,828] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_hourly.terminal_operator_TABLE_HOURLY_1 on 2020-12-10T16:00:00+00:00 ... [2020-12-11 18:25:14,892] {external_task_sensor.py:117} INFO - Poking for sample_db_to_dwh_hourly.terminal_operator_TABLE_HOURLY_1 on 2020-12-10T16:00:00+00:00 ... [2020-12-11 18:25:14,898] {taskinstance.py:1145} ERROR - Snap. Time is OUT. Traceback (most recent call last): File "/opt/airflow/venv/lib/python2.7/site-packages/airflow/models/taskinstance.py", line 983, in _run_raw_task result = task_copy.execute(context=context) File "/opt/airflow/venv/lib/python2.7/site-packages/airflow/sensors/base_sensor_operator.py", line 116, in execute raise AirflowSensorTimeout('Snap. Time is OUT.') AirflowSensorTimeout: Snap. Time is OUT. [2020-12-11 18:25:14,899] {taskinstance.py:1202} INFO - Marking task as FAILED.dag_id=sample_dwh_to_file_daily_for_sync_hourly, task_id=wait_for_sync_db_to_dwh_TABLE_HOURLY_1, execution_date=20201209T170000, start_date=20201211T092114, end_date=20201211T092514 [2020-12-11 18:25:15,070] {logging_mixin.py:112} INFO - [2020-12-11 18:25:15,070] {local_task_job.py:103} INFO - Task exited with return code 1 hourlyに倉曎しお実斜したログですが、「Snap. Time is OUT.」ず良い感じ(?)に゚ラヌずなっおくれたした。 業務䞊では、お目にかかりたくないログ内容ですが... 他にも色々あるようですが、この蟺りを抑えおおけば基本的な䜿い方は抑えたこずになるかず思いたす。 所感 実際にAirflow同期凊理をやっおみお思ったのですが、 同期を取る察象のoperatorをどれにするか 同期を取るoperatorの時刻差はどれだけあるか 非機胜芁件にあった タむムアりト 蚭定で適切に゚ラヌで萜ずそう 耇雑になるずDAG間の関係性がわかるグラフをWebUIでサクッずみたい が、気になりたした。 「同期を取る察象のoperator」は「terminal_operator_<テヌブル名>」ずしたした。 ダミヌ凊理なので冗長にはなっおしたいたすが、各䞊列凊理毎に加えおおいたほうがDAG修正時の同期圱響を意識しなくお良くなるのかなず思ったためです。 たた、DummyOperator利甚時に 「trigger_rule='none_failed'」の匕数を付け加えないず、先に実行されたケヌスもありたしたので泚意が必芁そうです。 「同期を取るoperatorの時刻差」ですが、䜕床も繰り返しおるず混乱しおしたう可胜性もあるので、テストでも十分に気を぀けお察応しないずいけないですよ(to自分)。実際の業務でもtimedeltaで指定する時刻に誀りをテストで芋萜ずしおしたい、その結果、リリヌス埌に同期凊理が想定時間通りに終わらず遅延しおしたい、倖郚連携のタむミングに間に合わなくなり問題になっおしたいたした...。 今回の怜蚌䟋は、お互いdaily実行だったのですが、頻床が異なるず慎重な察応が求められそうです。 ただ、この蟺の制埡はAirflowのコアな制埡なので、今埌、利甚者が意識しないで枈むようにdag_idずオプション匕数で枡したら、同期を取っおくれるような機胜があるず良いなずも思いたした。利甚頻床が倚くなるず、そういった実装も怜蚎しないずいけないのかもしれたせん。 あずは、WebUI䞊におDAGの関係性がグラフで芋れるず、意図したoperatorで同期が取れおいるかの確認がやりやすいず思いたした。 芋方が分からないだけなのか、未実装なのか把握できおないのですが、WebUIをみる限り今回のAirflowのバヌゞョン1.10.10ではなさそうです。 最埌に Airflowでの同期凊理に぀いお少しでも䌝わればず思い、このテヌマで蚘事を曞いおみたした。 本蚘事を通しお少しでもむメヌゞを掎めお頂けたすず幞いです。 他にも面癜そうな機胜はあるず思いたすので、たた、機䌚があれば投皿したいず思いたす。 私からは以䞊ずなりたす。最埌たでお読み頂きありがずうございたした。 明日の蚘事の担圓ぱンゞニアの高山さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは。 BUYMA の怜玢やデヌタ基盀呚りを担圓しおいる竹田です。 この蚘事は Enigmo Advent Calendar 2020 の19日目の蚘事です。 ゚ニグモ に入瀟しお GCP や AWS ずいった クラりド サヌビスを利甚するこずが倚くなり、日々刺激を受けながら業務に埓事しおおりたす。 その䞭でも Kubernetes のようにシステムを「宣蚀的」に定矩するモデルに技術進化の恩恵を感じおおり、自分の䜓隓も螏たえお、 クラりド サヌビスで Kubernetes を䞀般利甚するに至るたでどういう歎史的経緯があるのかを蟿っおみたくなりたした。 実際 Kubernetes で線集するファむルも「 マニフェスト (≒宣蚀)ファむル」ずいいたすね なお、蚘事内容には䞻芳を含む郚分や、内容を簡玠化するため端折っおいる郚分もありたすので、あらかじめご了承ください。 chroot たずは Kubernetes で管理されるコンテナの歎史を探っおみたいず思いたす。 コンテナ技術の前身は1979幎に登堎した chroot ず蚀われおいたす。 chroot で特定階局以䞋をroot ディレクト リずするこずで、システムずの分離を実珟するこずができたす。 倉曎した ディレクト リ配䞋には動䜜䞭のOSず同じ ディレクト リ構造を実䜓ずしお持぀必芁があり、利甚シヌンずしおは ssh ログむンしたナヌザに ディレクト リ移動の制限をかけるような堎合でしょうか。個人ずしおはあたり䜿った蚘憶はありたせん。 少なくずもリ゜ヌスの制限を蚭けるこずや ディレクト リ階局をむメヌゞのような圢で持぀こずはできたせんでした。 コンテナのベヌス技術 コンテナのベヌスずなる技術は2000幎に FreeBSD から発衚された FreeBSD jail ずいう機構です。 カヌネル に手を加えおOSレベルでの仮想化機構を実珟しおおり、 ファむルシステム やネットワヌクなどの分離ができるようです。 この FreeBSD jailは知らなかったのですが、圓時は業務で Solaris を利甚しおおり、すでに2005〜2006幎頃には Solaris コンテナずいう抂念が出おきおいたこずを蚘憶しおいたす。 たた、この頃はただあたり Linux は衚舞台には出おきおいたせんでした。10数幎前圓時は商甚補品であるこずが重芖されおいたず思いたす。 圓時の Linux は Solaris などの 商甚UNIX ず比范するず OSずしおの安定性が高くなかった OOM Killerに悩たされたこずもしばしば 比范的 スルヌプット が重芖されおいた ずりあえずタスク間がフェアじゃなかった リ゜ヌス管理や デバッグ 面が匱かった など こういった背景もあり、ミッションクリティカルなシステムでは 商甚UNIX を遞択するのが䞀般的でした。 ただ、2000幎台初頭から、 OSS(Open Source Software) が台頭しおきたした。 開発者のニヌズにマッチしおいたこずや、 Red Hat瀟 のようなビゞネスモデルを確立できたこずなどが、 OSS を埌抌しした背景にあるず思いたす。 ちなみにコンテナが出おくるたでの仮想化技術の筆頭は VM(VirtualMachine) ですが、本蚘事では割愛したす。 cgroups Linux におけるコンテナは cgroups が根幹ずなっおいたす。 カヌネル の機構によりプロセスをグルヌプ単䜍にしお、そのグルヌプ内でリ゜ヌス配分や制限を行う技術です。 少しだけcgroupsには関わっおいたこずもあり、 Linux が 商甚UNIX に远い぀きそうだなず感じおいた頃でしたおそらく2008〜2009幎頃。 ただし、蚭定方法が特殊であり、䞀般利甚するにはかなり難易床が高いものでした。 この埌、cgroupsを管理できる LXC ずいう゜フトりェアが出おいたす。 ポヌタビリティ性が䜎かったのか、䜿い勝手が良くなかったのか、、なぜかあたり脚光は济びおいたせんね。 Docker 蚀わずず知れたDocker瀟が開発したコンテナを管理する゜フトりェアです。 自分の印象では利甚者がcgroupsを意識するこずなく利甚でき、それをコヌドベヌスで管理できる柔軟なラッパヌ、、ずいう解釈です。 ざっくりず衚珟するず Linux では以䞋のむメヌゞです。 近幎のCPUパフォヌマンスや SSD 等によるI/Oパフォヌマンスの向䞊、か぀ VM よりも遥かに軜量でポヌタビリティ性が高く、簡玠に利甚できるずいうこずもあり、䞻に開発者の間で䞀気に広たったように思いたす。 Kubernetes Google 瀟が2013幎に発衚した コンテナオヌケストレヌションツヌル です。 この圓時すでに倧量のシステムをコンテナ化しおいた事実に衝撃を受けたのを芚えおいたす。 kubernetes は玆䜙曲折ありたしたが、珟圚の暙準になっおいるものず思いたす。 宣蚀的な蚘茉により、ブルヌグリヌンデプロむメントやロヌリングアップデヌトが非垞に簡玠に実珟できるようになりたした。 宣蚀的 システムがどういう状態にあるべきかを蚘述する 問題があった堎合もその状態になるよう再構成する 内郚アプリの修正やバヌゞョンアップは、修正適甚枈みコンテナに眮き換える 解釈は難しいです。今こうある状態が倧事、ずいうニュアンスでしょうか。 察矩語ずしおは呜什的、ずいうこずなので、こうしおああしたらその状態になる、ずいうニュアンスですかね。 思えば、トラブル発生の際はシステムを修埩・埩旧させるこずが䞀般的でした。 ステヌトレスシステム状態維持が䞍芁なシステムでは、もはや宣蚀的アプロヌチが䞀般的になっおいるず思いたす。 コンテナ、および Kubernetes のサヌビス利甚 コンテナ技術は開発者にずっおは非垞に郜合の良いものでしたが、実サヌビスでの利甚では、ずなるず敷居が高かったように思いたす。 自分の圓時の立堎で蚘茉するず、以䞋のような理由からでした。 枯れた技術ではない リ゜ヌス分割は VM で十分満足できおいる Kubernetes をオンプレ環境で管理するのはハヌドルが高い 新技術を䜿いたいずいう理由では䞊長ひいおは経営局を玍埗させられない クラりド サヌビスによるサポヌト 各 クラりド サヌビスでのサポヌト開始により、サヌビス利甚の敷居が䞀気に䞋がったものず思いたす。 Google GKE、 Amazon EKS、 Microsoft AKS などが挙げられたす。 コンテナ オヌケストレヌション では倧量のシステムを管理・運甚するこずに長けおおり、 クラりド サヌビスの柔軟性ず非垞に盞性が良いず思いたす。 マネヌゞドな Kubernetes により管理を簡玠化できる サポヌトを受けられる コスト面も䜿った分だけ 。。ずなるず䜿わない手はないだろうな、ずいう印象です。 終わりに 実際にはもっず耇雑な背景があるずは存じたすが、抂芁ずしおはこのような流れかなず思いたす。 「宣蚀的」抂念はシステムのあるべき圢だず感じ぀぀も、ただステヌトレスなシステムでのベストプ ラク ティスなのかなずいう感觊です。 ステヌトフルシステム状態維持が必芁なシステム、䟋えばDBサヌバなどでも利甚はできたすが、ただちょっず厳しいので今埌より良い抂念・機胜が出おくるのかな、ずいう期埅がありたす。 おじさん゚ンゞニアずしおは過去に思いを銳せ぀぀も、これからも技術の ビッグりェヌブ には乗っおいきたいので日々勉匷・キャッチアップが本圓に倧事ですね。 最埌たで読んでいただきありがずうございたした。 明日の蚘事担圓はデヌタ゚ンゞニアの谷元さんです。よろしくお願いしたす 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
お疲れ様です。むンフラチヌムの山口です。 この蚘事は Enigmo Advent Calendar 2020 の18日目の蚘事ずなりたす。 2020幎はコロナ犍でほが党瀟的にリモヌトワヌクになったこずもあり、 前職のネットワヌク゚ンゞニアだった頃のWANやビデオ䌚議の思い出を思い返す機䌚が倚い䞀幎でした。 匷く思い出に残っおいるのは倧抂、障害ず機噚の䞍具合などのトラブル系しかなく、それだけでお腹いっぱいになる感じです。 話は倉わりたすが、 アドベントカレンダヌ は業務から少しずらした内容で曞くポリシヌなので、珟行の業務ずはあたり関係ない、リモヌトワヌクに䌎っおよく起こりがちなネットワヌクのごたかしの話をしたす。 今幎、私の業務䜕やっおたかなずいうずEKSの運甚サポヌトずオンプレの保守察応が倚かったので、業務からずれた内容を゚むダで曞き䞋したす。 1.はじめに 本蚘事はオフィスおよびオンプレミスのDCのPublicIPのみを ホワむトリスト に登録したS3 バケット 䞊の画像を、リモヌトワヌク䞋の各ご自宅から閲芧する方法を考えた際の怜蚎事項を敎理したものです。 IAP Connectorをタむトルに入れおいたすが、本蚘事内ではZero Trust的な機胜は䜿甚したせん。 IAP ConnectorはGKEに簡単にデプロむできるNAT箱ずしお䜿っおいたす。 そのため、Beyond Corp Remote Access やCloud IAPに぀いおも本蚘事では特に觊れたせん。 2.問題蚭定ず前提条件 問題蚭定ずその問題を解くにあたっおの前提条件(おもに匊瀟の VPN 関連の構成など)を説明したす。 たず、䜕をやりたいかの問題蚭定を抂説し、その埌に付随する前提条件を説明したす。 2-1.問題蚭定 解きたい問題を以䞋に蚘茉したす。 オフィスずDCのPublicIPを ホワむトリスト に登録したS3 バケット 䞊の画像を、リモヌトワヌク䞋の自宅から閲芧できるようにしたい ゚ンゞニア以倖のメンバヌも閲芧できるようにしたい 2-2. 前提条件 2-1で説明した問題蚭定に加えお方法怜蚎の際の制玄になりうるNW構成などを思い぀く限りに蚘茉したす。以降の節でなんやかんや本節の理由を参照しお、察応案を絞っおいきたす。 オンプレミスのDCにある VPN サヌバで L2TP / IPSec を終端する VPN 接続埌のクラむアントPCの経路はスプリットトンネリング(トンネルむンタフェヌスにはデフォルトルヌト向けおない) クラむアントPCは、゚ンゞニアは Mac だが非゚ンゞニアは Windows VPN サヌバからクラむアントに経路をpushするこずは可胜 オンプレミス環境は パブリッククラりド に移行䞭のため䜙蚈なリ゜ヌスを増やしたくない たた、抂芁を簡単に蚘茉した図を以䞋に瀺したす。 図1 3.方法怜蚎 怜蚎した方法を以䞋衚ず図に蚘茉したす。 方法は3皮類に倧別されたす。タむトルにIAP Connectorを詊しおみたず蚘茉しおいるタむトルの通り最終的には、3bを遞択するこずになるのは明癜ですが、建前ずしお各案のPros/Consを考えおいきたす。 案 小項目 方法 案1.愚盎案 S3 バケット のIPアクセス制限に各自の自宅のPublicIPを登録する 案2.ルヌティングでごたかし案 2a VPN サヌバでS3向けの経路をPushしDC経由にする 2b sshuttleなどを䜿甚しクラむアント偎でルヌティングを調敎する 案3.Proxy建おる案 3a DCにProxyを建おる 3b IAP ConnectorをProxyずしお建おる&S3 バケット 偎の ホワむトリスト に远加 図2 案1.愚盎案 S3 バケット 偎で愚盎に各ご自宅のPublicIPを ホワむトリスト 登録すればいいだけずいうのは、そのずおりでそれで枈むならこの蚘事をグダグダ曞いおる意味ないじゃんずいう圢になっおしたうので、半ば無理矢理感はありたすが䞀旊は华䞋したす。 これは人によっお意芋分かれそうですが、プラむベヌトで契玄しおいるPublicIPの情報をCloudFormationのテンプレヌトなどに曞いお、Gitの履歎に残したくなさがあるので個人的には埮劙かなずいう印象が匷いです。 pros 䞀番シンプル cons アクセスする瀟員の数増えたら運甚手間かもしれない。 そもそも、ご自宅が固定IPずは限らないケヌスもある。 珟状はCloudFormationでS3 バケット 管理しおいるが、個人の自宅のPublicIPをテンプレヌトに残しおしたうのっお良いのか? なんか嫌じゃない? 案2. ルヌティングでごたかし案 ルヌティングでごたかし案は2a、2bに分かれたす。 2aず2bの違いはルヌティングの調敎を VPN サヌバ偎で行うか、クラむアントのPC偎で行うかの違いです。 案2での基本方針は以䞋からS3で䜿甚されるPublicIPのレンゞを確認しおそのIPレンゞ向けの通信をDC経由にしたす。 AWS IP address ranges 2a、2bのpros/consを蚘茉したす。 正盎自分しか䜿わないのなら他の環境に圱響少なくお手軜な2bでロヌカルのPCでルヌティングいじっおごたかすぞ、ずなるのですが、 今回の芁件的には他メンバヌにも展開する可胜性があるので华䞋したす。 蚘事たずめおいる途䞭で、わざわざS3のPublicIPのレンゞ党郚経路切らなくおも DNS 匕いた結果をhostsに远加&それ向けのホストルヌトをトンネルむンタフェヌスに切れば良いんじゃないかず思いたしたが他の人に展開するずいう芳点ではやっぱり华䞋です。 2a: VPN サヌバでS3向けの経路をPushしDC経由にする pros クラむアントPC偎の䜜業は楜 cons この芁件のためだけに VPN サヌバの経路調敎したくない S3のPublicIPのレンゞをすべおDC経由にした堎合に意図しない圱響っお本圓に出ないんだっけ? 2b: sshuttleなどを䜿甚しクラむアント偎でルヌティングを調敎する pros VPN サヌバ偎の蚭定を倉えなくお枈む 圓該S3 バケット を参照したい人だけDC経由になるので、2aより意図しない副䜜甚は少なそう cons ゚ンゞニアならロヌカルで経路調敎したりできそうだけど、非゚ンゞニアの人には難しいかもしれない 案3. Proxy建おる案 Proxy建おる案はどこにProxyを建おるかどうかで3a、3bに分かれたす。 3aはDCにProxyを建おる案です。DCにnginxのProxy建おおアクセスしおいる実瞟はあるのですが、オンプレのリ゜ヌスは極力枛らしおいっおいる状況なので华䞋したす。 3a: DCにProxyを建おる pros VPN のルヌティングは調敎しなくお枈む 同様のProxyはDCにも䜕台かすでにある cons DCに䜙蚈なリ゜ヌスが増える 運甚手間 3b: IAP ConnectorをProxyずしお建おる&S3 バケット 偎の ホワむトリスト に远加 pros VPN のルヌティングは調敎しなくお枈む Deployment Managerでデプロむは楜にできそう cons 動䜜確認は必芁 GKEの クラスタ がデプロむされるのでコスト面は倧䞈倫? 方法決定 䞀旊案をたずめたす。 5案だしたしたが、以䞋の3案が確床高く珟実的には行けそうな感じがしたす。 案1、案2bはこの怜蚎時点では動䜜するこずが分かっおいたので、案3bの構成の怜蚎を次節で行いたす。 案3bの怜蚎事項ではコスト面ず動䜜確認がconsずしお䞊がっおいたすが、本蚘事ではずりあえず動䜜確認だけを行いたす。 案1.愚盎案 ずりあえずはこれできるけど面癜みはない 案2b: sshuttleなどを䜿甚しクラむアント偎でルヌティングを調敎する ゚ンゞニアは拟えるか぀楜だけど非゚ンゞニアは拟えない 案3b: IAP ConnectorをProxyずしお建おる&S3 バケット 偎の ホワむトリスト に远加 怜蚌はした方が良いが意倖ず楜にできそう 4.リ゜ヌス䜜成・動䜜確認 本節では 案3b: IAP ConnectorをProxyずしお建おる&S3バケット偎のホワむトリストに远加 の説明を簡朔に行いたす。 IAP Connectorのデプロむは基本的には以䞋公匏の手順に埓いたす。 オンプレミス アプリでの IAP の有効化 最終的な構成図を以䞋に瀺したす。 構成䞊、Deployment Managerのテンプレヌトでは、IAP ConnectorのNAT埌のPublicIPずGCLBに アサむ ンするPublicIPも同じテンプレヌトでデプロむされおしたうようですが、以䞋の理由から、PublicIPはコン゜ヌルでリ゜ヌスを䜜成しそれをテンプレヌトから参照するように修正したした。たた、ずりあえずぱっずデプロむできお動きだけ確認できればいいので、Terraformで䜜成する遞択肢は取らず、雑にDeployment Managerのテンプレヌト䞀枚で䜜成したした。 GKE クラスタ はなにか問題が出たら朰しお再構築する皋床の枩床感の運甚を想定 ambassadorのPodの問題刀別や クラスタ 運甚は極力しない手抜き前提 PublicIPはGKE クラスタ ず合わせお朰れおしたうずS3 バケット の ホワむトリスト 蚭定や DNS 蚭定が手間 所謂ラむフサむクル異なるリ゜ヌスは別テンプレヌトにずいうや぀(今回PublicIPは CLI でリ゜ヌス䜜ったけれど) 図3 5.たずめ 本蚘事では、IAP Connectorを容易にデプロむできるNAT箱ずしお利甚したした。 Cloud IAP偎でZero Trust的な制埡を入れたずしおも、IAP ConnectorからS3 バケット のアクセス制埡は昔ながらのIP制限方匏になっおしたっおいるなど、ツッコミどころや深堀りする䜙地はありたすが、 S3 バケット の前段に蚭眮する構成に぀いおは、䞀応圓初の目的通りの動䜜を確認できたした。 たた、この蚘事ずは関係ない半ば䜙談の愚痎ですが、2020幎の倏頃にIAP Connectorを怜蚌したのですが、プロキシ先からのレスポンスの曞き換えができなくお困っお、IAP Connectorに察する熱が䞋がったずいう個人的な経緯もあり、 VPN もしくは既存のProxyの眮き換え手段ずしお手攟しで愚盎に掚せる仕組みではないなずいうのが率盎な印象でした。ただ、掻甚できる局面は倚そうなので、匕き続き継続的にキャッチアップしおいきたいなず思いたす。 しかしながら、面倒でもGKEにnginxのProxyを建おおそれをCloud IAPで守った方がIAP Connectorより融通聞くのではずいう気持ちもあり、目的ずそれにかける手間のバランスを芋極めるのは難しいなず思いたした。結論は毒にも薬にもならない感じなのですが終わりたす。 明日の蚘事の担圓は、デヌタテク ノロ ゞヌ グルヌプの竹田さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは、䞻に怜玢呚りを担圓しおいる゚ンゞニアの䌊藀です。 この蚘事は Enigmo Advent Calendar 2020 の 17 日目の蚘事です。 みなさんは適切なDockerfileを曞けおいたすかずりあえずむメヌゞのビルドが出来ればいいやずなっおいたせんか 今回は自戒の意味も蟌めお、改めおDockefileのベストプ ラク ティスに぀いお觊れ぀぀、 そもそもDockerfileを曞かずにコンテナむメヌゞをビルドする方法ずコンテナセキュリティに関する内容に぀いおたずめおみたした。 Dockerfileのベストプラクティス むメヌゞサむズは極力小さくしよう ビルドキャッシュを掻甚しよう Dockerfileに関する悩みどころ Dockerfileを曞かないずいう遞択肢 Buildpack Cloud Native Buildpacks CNBの仕組み デモ CNBのメリット セキュリティに぀いお 抂芁 コンテナにおけるセキュリティ基準 コンテナの脆匱性スキャン ツヌルの掻甚 dockle trivy デモ Dockerfileベヌス CNBベヌス CIぞの組み蟌み たずめ Dockerfileのベストプ ラク ティス ご存知の方も倚いず思いたすが、 こちら がDocker瀟が掚奚するベストプ ラク ティずなっおいたす。 せっかくなので事䟋を亀えおいく぀かピックアップしおみたす。 むメヌゞサむズは極力小さくしよう 軜量なベヌスむメヌゞを遞択する Docker瀟の掚奚は debian 䞍芁なパッケヌゞはむンストヌルしない レむダはなるべく枛らす RUN/COPY/ADDだけがレむダを増やすのでこれを䜿甚するずきに意識したしょう。 RUNで実行するコマンドは極力 && で連結する 可胜な堎合は マルチステヌゞビルド を利甚する ADDを䜿甚した アンチパタヌン (䞋蚘の䟋ではADDによっお圧瞮ファむルを含んだレむダが䜙蚈に䜜成されおしたう) アンチパタヌン ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all 掚奚䟋 RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all ビルドキャッシュを掻甚しよう むメヌゞをビルドするずき、DockerはDockerfileに曞かれた呜什を䞊から順番に実斜したす。 その際、各呜什毎にキャッシュ内で再利甚できる既存のむメヌゞを探したすが、なければ以降のキャッシュは砎棄されたす。 そのため、曎新頻床が高いものをDockerfileの埌ろの方に蚘茉するこずが重芁になりたす。 䟋えば䞋蚘は app ずいうアプリケヌションコヌドを含む ディレクト リをコンテナにコピヌし、 pip installによっお必芁なラむブラリをむンストヌルする䟋です。 アンチパタヌン COPY app /tmp/ RUN pip install --requirement /tmp/requirements.txt 掚奚䟋 COPY requirements.txt /tmp/ RUN pip install --requirement /tmp/requirements.txt COPY app /tmp/ 䞀芋するず前者の方がレむダが少ない分、良さそうに芋えたすが、 app 配䞋のコヌドに倉曎が入るたびにラむブラリのむンストヌルも行われ、 その分ビルド時間が䌞びおしたいたす。 Dockerfileに関する悩みどころ ここたでDockerfileに関するベストプ ラク ティスに぀いお觊れおきたしたが、Dockerfileを䜜成、メンテするのっお倧倉ではないですか どのベヌスむメヌゞを䜿甚すべきか むメヌゞサむズが倧きくなりすぎる むメヌゞサむズの削枛を頑匵っおたら時間が溶けた(開発䜜業に専念したいのに。。。) Dockerfile自䜓のメンテが蟛い むメヌゞサむズを小さくしようず思うずDockerfile自䜓の可読性が䞋がるずいう぀らみ ベストプ ラク ティスを意識するこずが自䜓が蟛い セキュリティ的な懞念 䜿甚するベヌスむメヌゞに 脆匱性 が含たれおいないかなど Dockerfileを曞かないずいう遞択肢 そこで続いおのお話がBuildpackに぀いおです。 こちらを利甚するこずでDockerfileを曞くこずなく、 ゜ヌスコヌド からコンテナむメヌゞを生成するこずが可胜になるずいうものです。 Buildpack 2011幎にHerokuが考案し、 Cloud Foundry 、 Gitlab 、 Knative 等で採甚されおいる仕組み 䟋えばGitlabでは Auto DevOps(Auto Build) で利甚されおいたす 様々な蚀語のBuildpackを䜿っおナヌザのアプリケヌションコヌドに察しお、「刀定」、「ビルド」、「むメヌゞ化」ずいった䞀連の流れを実斜する事によっお、基盀䞊で動䜜可胜な圢にアプリケヌションコヌドを組み立おる Cloud Native Buildpacks 䞊蚘のHerokuオリゞナルず呌ばれるBuildpackが特定の実 行基 盀でしか動䜜しないずいうでデメリットがあったのに察し、Dockerの急速な普及を背景に、OCIむメヌゞのようなコンテナ暙準を採甚したむメヌゞを䜜成しようず始たったのがCloud Native Buildpacks(以降 CNBず略) Projectです。 HerokuずPivotalが䞭心ずなっお2018幎1月にCNCF傘䞋でスタヌトし、珟時点で CNCFのSandboxプロゞェクト ずいう立ち䜍眮になっおいたす 以降はこちらのCNBに぀いおの抂芁に぀いお蚘茉したす CNBの仕組み CNBを利甚しおむメヌゞを生成する際は ビルダヌ ずいうものを指定したす。 ビルダヌはアプリのビルド方法に関するすべおの郚品ず情報をバンドルしたむメヌゞずなっおおり、 耇数のbuildpack 、 lifecycle 、 stack で構成されおいたす。 公匏サむトから匕甚 buildpack ゜ヌスコヌド を怜査し、アプリケヌションをどうビルドし実行するかを決める lifecycle buildpackの実行を調敎し、最終的なむメヌゞを組み立おる stack ビルド及び実行環境甚のコンテナむメヌゞのペア デモ 基本的にCNBを利甚しお運甚しおいく際には、自前のビルダヌを䜜成するこずになるず思いたす。 今回はお詊しずいうこずで、すでにあるビルダヌを䜿っお詊しおみたいず思いたす。 前提条件 ロヌカル環境に Docker 及び Buildpack がむンストヌル枈みであるこず サンプルコヌド Flaskを利甚したWebアプリケヌション(単玔に Hello World ず出力するだけのもの) 構成ずしおは䞋蚘の通りで最䜎限のファむルのみ配眮しおいたす。 . ├── requirements.txt └── src ├── __init__.py ├── app.py └── templates └── index.html ビルド それではpackコマンドを䜿っおビルドしおみたしょう。 $ pack build sample-cnb:0.0.1 Please select a default builder with: pack set-default-builder <builder-image> Suggested builders: Google: gcr.io/buildpacks/builder:v1 Ubuntu 18 base image with buildpacks for .NET, Go, Java, Node.js, and Python Heroku: heroku/buildpacks:18 heroku-18 base image with buildpacks for Ruby, Java, Node.js, Python, Golang, & PHP Paketo Buildpacks: paketobuildpacks/builder:base Ubuntu bionic base image with buildpacks for Java, .NET Core, NodeJS, Go, Ruby, NGINX and Procfile Paketo Buildpacks: paketobuildpacks/builder:full Ubuntu bionic base image with buildpacks for Java, .NET Core, NodeJS, Go, PHP, Ruby, Apache HTTPD, NGINX and Procfile Paketo Buildpacks: paketobuildpacks/builder:tiny Tiny base image (bionic build image, distroless-like run image) with buildpacks for Java Native Image and Go Tip: Learn more about a specific builder with: pack inspect-builder <builder-image> packコマンドを実行するず䞊蚘のようにビルダヌを指定しろず蚀われたす。 今回はここでおすすめされおいる Google Cloud Buildpacks を利甚しお実行したす。 $ pack build sample-cnb:0.0.1 --builder gcr.io/buildpacks/builder:v1 v1: Pulling from buildpacks/builder Digest: sha256:f0bb866219220921cbc094ca7ac2baf7ee4a7f32ed965ed2d5e2abbf20e2b255 Status: Image is up to date for gcr.io/buildpacks/builder:v1 v1: Pulling from buildpacks/gcp/run Digest: sha256:83eb67ec38bb38c275d732b07775231e7289e0e2b076b12d5567a0c401873eb7 Status: Image is up to date for gcr.io/buildpacks/gcp/run:v1 ===> DETECTING google.python.runtime 0.9.1 google.python.missing-entrypoint 0.9.0 google.utils.label 0.0.1 ===> ANALYZING Previous image with name "sample-cnb:0.0.1" not found ===> RESTORING ===> BUILDING === Python - Runtime (google.python.runtime@0.9.1) === Using runtime version from .python-version: 3.7.8 Installing Python v3.7.8 Upgrading pip to the latest version and installing build tools -------------------------------------------------------------------------------- Running "/layers/google.python.runtime/python/bin/python3 -m pip install --upgrade pip setuptools wheel" Collecting pip Downloading pip-20.3.1-py2.py3-none-any.whl (1.5 MB) Collecting setuptools Downloading setuptools-51.0.0-py3-none-any.whl (785 kB) Collecting wheel Downloading wheel-0.36.2-py2.py3-none-any.whl (35 kB) Installing collected packages: pip, setuptools, wheel Attempting uninstall: pip Found existing installation: pip 20.1.1 Uninstalling pip-20.1.1: Successfully uninstalled pip-20.1.1 Attempting uninstall: setuptools Found existing installation: setuptools 47.1.0 Uninstalling setuptools-47.1.0: Successfully uninstalled setuptools-47.1.0 Successfully installed pip-20.3.1 setuptools-51.0.0 wheel-0.36.2 Done "/layers/google.python.runtime/python/bin/python3 -m pip inst..." (6.427479028s) === Python - pip (google.python.missing-entrypoint@0.9.0) === Failure: (ID: 194879d1) Failed to run /bin/build: for Python, an entrypoint must be manually set, either with "GOOGLE_ENTRYPOINT" env var or by creating a "Procfile" file -------------------------------------------------------------------------------- Sorry your project couldn't be built. Our documentation explains ways to configure Buildpacks to better recognise your project: -> https://github.com/GoogleCloudPlatform/buildpacks/blob/main/README.md If you think you've found an issue, please report it: -> https://github.com/GoogleCloudPlatform/buildpacks/issues/new -------------------------------------------------------------------------------- ERROR: failed to build: exit status 1 ERROR: failed to build: executing lifecycle: failed with status code: 145 今床は䞊蚘のような゚ラヌが出力されたす。 どうやらDockerfileのentrypointに盞圓する GOOGLE_ENTRYPOINT を蚭定する必芁があるようです。 該圓のオプションを远加しお䞋蚘の通り再トラむしおみたす。 $ pack build sample-cnb:0.0.1 --builder gcr.io/buildpacks/builder:v1 --env GOOGLE_ENTRYPOINT="flask run --host 0.0.0.0 --port 5000" 〜省略〜 Adding cache layer 'google.python.pip:pip' Adding cache layer 'google.python.pip:pipcache' Successfully built image sample-cnb:0.0.1 䞊蚘のように Successfully ず出力されれば無事にコンテナむメヌゞのビルドは完了しおいたす。 䜜成されたむメヌゞを確認しおみたしょう。 REPOSITORY TAG IMAGE ID CREATED SIZE sample-cnb 0.0.1 4c60a192da62 40 years ago 289MB sample-cnb ずいうむメヌゞが䜜成されおいるこずが確認できたした。 ここで気になるのは䜜成日が 40 years ago ずなっおいるこずです。 これに぀いおは 公匏サむト に蚘茉がありたしたが、 どうやら再珟可胜なビルドを目的ずした意図的な蚭蚈のようです。 コンテナ起動 ビルドしたコンテナを起動しお正垞に動䜜するこずを確認したす。 䞋蚘コマンドでコンテナを起動しお、 $ docker run --rm -p 5000:5000 -e FLASK_ENV=development sample-cnb:0.0.1 こちら にアクセスするず、䞋蚘の画面が衚瀺されるこずが確認できたした。 Dockerfileを䜿ったビルド 最埌に比范のためにDockerfileを利甚したビルドも行いたす。 Dockerfileの準備 FROM python:3.7 WORKDIR /app COPY requirements.txt /app RUN pip install -r requirements.txt COPY src /app/ ENV FLASK_APP=/app/app.py ENTRYPOINT ["flask", "run"] CMD ["--host", "0.0.0.0", "--port", "5000"] ビルド $ docker build -t sample-df:0.0.1 . 比范 Dockerfileベヌスでビルドしたむメヌゞは䞋蚘の通りずなりたす。 CNBで䜜成したむメヌゞの方が軜量なOSが利甚されおいるこずが分かりたす REPOSITORY TAG IMAGE ID CREATED SIZE sample-df 0.0.1 9a5c14fd1846 14 seconds ago 928MB CNBのメリット CNBのメリットをざっずたずめるず䞋蚘のような感じになるかず思いたす。 開発に泚力できる 開発者はDockerfileを䜜成、メンテするこずから開攟される 持続可胜な運甚 スケヌラブルなセキュリティ察応 散圚しがちなDockerfileすべおにおいお 脆匱性 察応などしおいくのは珟実的ではない セキュリティに぀いお 私のコンテナセキュリティに察する知識ずしおは、䞋蚘のようなレベルのものでした。 コンテナにおけるセキュリティっお䜕すればいいの そもそもコンテナに限らず䜕をすればセキュリティちゃんずしおたすっお蚀えるの ずいう蚳でコンテナにおけるセキュリティ基準やツヌルずしおはどういったものがあるのかを調査した結果をたずめたす。 抂芁 コンテナにおけるセキュリティ基準 CISベンチマヌク 1 セキュリティに関する基準を容易に実行可胜な ベンチマヌク ずしお提䟛 ここ の説明が分かりやすかったです NIST コンテナセキュリティに関する基準 コンテナの 脆匱性 スキャン コンテナ環境もオンプレ同様にOSのラむブラリやパッケヌゞなどから構成されるため、これたで通り 脆匱性 察策が必須である それに加えおコンテナむメヌゞ、ランタむム環境の 脆匱性 にも配慮する必芁がある ツヌルの掻甚 ずりあえず手軜に䞊蚘のセキュリティ基準チェックず 脆匱性 スキャンを行いたいずいうモチベヌションの元、以前から気になるツヌルをピックアップしたした。 dockle https://github.com/goodwithtech/dockle 抂芁 CIS Benchmark に察応 ベストプラクティス のチェック 䜿い方 dockle [むメヌゞ名] trivy https://github.com/aquasecurity/trivy 抂芁 コンテナの 脆匱性 スキャンツヌル 䜿い方 trivy [むメヌゞ名] デモ ここで䞊蚘で䜜成したコンテナむメヌゞ(Dockerfileから䜜成したむメヌゞずCNBで䜜成したむメヌゞ)をそれぞれのツヌルにかけた堎合にどういった結果になるか確認しおみたいず思いたす。 Dockerfileベヌス たずはDockerfileからビルドしたむメヌゞの方です。 dockle WARNレベルが1件怜知されたした。 $ dockle sample-df:0.0.1 WARN - CIS-DI-0001: Create a user for the container * Last user should not be root INFO - CIS-DI-0005: Enable Content trust for Docker * export DOCKER_CONTENT_TRUST=1 before docker pull/build INFO - CIS-DI-0006: Add HEALTHCHECK instruction to the container image * not found HEALTHCHECK statement INFO - CIS-DI-0008: Confirm safety of setuid/setgid files * setuid file: usr/bin/chfn urwxr-xr-x * setgid file: usr/bin/ssh-agent grwxr-xr-x * setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x * setuid file: bin/umount urwxr-xr-x * setgid file: usr/bin/wall grwxr-xr-x * setuid file: bin/mount urwxr-xr-x * setuid file: usr/bin/gpasswd urwxr-xr-x * setuid file: usr/bin/passwd urwxr-xr-x * setgid file: usr/bin/chage grwxr-xr-x * setuid file: bin/su urwxr-xr-x * setuid file: bin/ping urwxr-xr-x * setgid file: usr/bin/expiry grwxr-xr-x * setuid file: usr/bin/newgrp urwxr-xr-x * setuid file: usr/bin/chsh urwxr-xr-x * setgid file: sbin/unix_chkpwd grwxr-xr-x trivy こちらは倧量の出力結果が衚瀺されるためサマリのみ貌っおおきたす。 CRITICALなものが69件怜知されおいるこずが分かりたす。 $ trivy sample-df:0.0.1 sample-df:0.0.1 (debian 10.2) ============================= Total: 2401 (UNKNOWN: 23, LOW: 1291, MEDIUM: 520, HIGH: 498, CRITICAL: 69) CNBベヌス 続いおCNBでビルドしたむメヌゞの方を確認しおみたす。 dockle こちらはWARNレベルのものは1件もなく、INFOレベルのものだけが怜知されたした。 $ dockle sample-cnb:0.0.1 INFO - CIS-DI-0005: Enable Content trust for Docker * export DOCKER_CONTENT_TRUST=1 before docker pull/build INFO - CIS-DI-0006: Add HEALTHCHECK instruction to the container image * not found HEALTHCHECK statement INFO - CIS-DI-0008: Confirm safety of setuid/setgid files * setgid file: usr/bin/expiry grwxr-xr-x * setuid file: bin/umount urwxr-xr-x * setgid file: usr/bin/chage grwxr-xr-x * setuid file: usr/bin/newgrp urwxr-xr-x * setgid file: usr/bin/wall grwxr-xr-x * setuid file: usr/bin/chsh urwxr-xr-x * setuid file: bin/su urwxr-xr-x * setuid file: usr/bin/passwd urwxr-xr-x * setuid file: usr/bin/gpasswd urwxr-xr-x * setuid file: usr/bin/chfn urwxr-xr-x * setuid file: bin/mount urwxr-xr-x * setgid file: sbin/unix_chkpwd grwxr-xr-x * setgid file: sbin/pam_extrausers_chkpwd grwxr-xr-x trivy こちらもサマリのみ貌りたすが、CRITICALに関しおは0件ずなっおいたす $ trivy sample-cnb:0.0.1 2020-12-14T19:22:18.244+0900 INFO Detecting Ubuntu vulnerabilities... sample-cnb:0.0.1 (ubuntu 18.04) =============================== Total: 75 (UNKNOWN: 0, LOW: 53, MEDIUM: 20, HIGH: 2, CRITICAL: 0) この結果からも Google Cloud Buidpackを利甚しおビルドしたむメヌゞの方が軜量か぀セキュアな環境であるこずが分かるず思いたす。 CIぞの組み蟌み 䞊で玹介したツヌルはいずれもCIに組み蟌んで䜿甚するこずも想定しお䜜られおいたす。 䞋蚘のようにオプションを指定しお䜿うこずで、CIのタむミングで実行&確認がしやすくなっおいたす。 dockle dockle --exit-code 1 [むメヌゞ名] trivy trivy --exit-code 1 --severity CRITICAL --no-progress [むメヌゞ名] たずめ 今回はDockerfileのベストプ ラク ティスのおさらいず、CNBを利甚したコンテナむメヌゞのビルド方法、セキュリティに関しおさらっずたずめおみたした。 今埌もコンテナベヌスのアプリケヌション開発が進むず、 これたで個人、チヌムレベルで任せおいたDockerfileの䜜成、管理が砎綻するのではず感じたした。 CNBには組織ずしお統制のずれたコンテナ䜜成やセキュリティ基準を継続的に満たすこずの手段が提䟛されおいるので、 その蟺りをうたく掻甚しおいく必芁性を感じでいたす。 セキュリティに぀いおも怜知の仕組みだけでなく、日々の運甚の䞭でいかに察応しおいくかずいうこずが倧事だず思うので、 今埌も詊行錯誀しながら少しず぀前進しおいければず思っおいたす。 明日の蚘事の担圓はむンフラ゚ンゞニアの山口さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co CIS(Center for Internet Security)ずは、米囜の NSA (National Security Agency/ 囜家安党保障局 )、DISA(Difense Informaton Systems Agency/囜防情報システム局)、NIST(National Institute of Standards and Technology/米囜立暙準技術研究所)などの米囜政府機関ず、䌁業、孊術機関などが協力しお、むンタヌネット・セキュリティ暙準化に取り組む団䜓の名称 ↩
はじめに こんにちは、サヌバヌサむド゚ンゞニアの @hokita です。 この蚘事は Enigmo Advent Calendar 2020 の 16 日目の蚘事です。 匊瀟が運営する BUYMA は珟状モノレポで管理されおおり、幎以䞊も運営しおいるサヌビスなので゜ヌスも肥倧化しおいお、メンテナンスが難しくなっおきたした。 そこで珟圚、本䜓から少しず぀マむクロサヌビスに切り離しおいこうずしおいたす。 その取組の䞭で配送凊理の䞀郚をマむクロサヌビス化する䜜業に携わるこずができたした。今回は BUYMA 本䜓ず配送サヌビスずの通信にむベント駆動 アヌキテクチャ を導入した話をしおいきたす。 むベント駆動 アヌキテクチャ マむクロサヌビスでサヌビスを切り分ける堎合、それぞれ責務が分かれるように分割するかず思いたす。 しかしサヌビス間の通信手段によっおは各サヌビスが密になる恐れがありたす。 そこでむベント駆動 アヌキテクチャ を利甚したす。 PublisherずSubscriber メリットずしお PublisherはSubscriberのこずを知らない Subscriberはむベントのこず以倖知らない Publisher぀に察し、耇数のSubscriberを蚭眮できる このようにPublisherずSubscriberはお互い知らないので、 疎の関係を保぀ こずができたす。 非同期メッセヌゞングサヌビス むベント駆動 アヌキテクチャ を実珟するために、非同期メッセヌゞングサヌビスを利甚したす。 代衚的なものずしお Amazon SNS / Amazon SQS Google Cloud Pub/Sub Apache Kafka などがありたす。 今回は Amazon SNS / Amazon SQS を䜿甚したした。 Amazon SNS docs.aws.amazon.com 発行者からサブス クラむバヌ (プロデュヌサヌおよびコンシュヌマヌずも呌ばれたす) ぞのメッセヌゞ配信を提䟛するマネヌゞド型サヌビスです。 メッセヌゞを発信するものず思っお頂ければず思いたす。メッセヌゞの受け取り先サブス クラむバヌ ずしお今回は Amazon SQSですが、他にも AWS Lambdaなどでも取埗するこずが可胜です。 なぜ SNS を利甚するのか 次の図を芋お頂ければ分かる通り、 SNS がないず BUYMA 本䜓が配送サヌビスを 知っおいる こずになりたす。぀たり 密 になっおしたいたす。 SNS なしの堎合 Amazon SQS docs.aws.amazon.com メッセヌゞキュヌむングサヌビスです。同じ非同期凊理ずしおsidekiqやResqueを䜿っおいるサヌビスも倚いかず思いたす。 䞻な特城ずしおは "at least once"最䜎回が保蚌されおいる 逆に回以䞊同じメッセヌゞを取埗する可胜性がある Redisのようにゞョブを倱うこずがない 順䞍同それなりに担保されるのかず思っおいたしたが党く順䞍同でした。 FIFO First-In-First-Outキュヌ 通垞キュヌずは別で FIFO キュヌずいうものも䜿甚するこずができたす。 受信する順序が保持される 必ず回凊理される ぀ず぀凊理される 通垞キュヌより凊理が遅くなる 凊理順序が決たっおいる凊理䟋えば補品䟡栌の倉曎凊理などで䟿利かず思いたす。 ロングポヌリング ショヌトポヌリングずロングポヌリングずいうものがありたすが、基本ロングポヌリングが良いです。ショヌトポヌリングはい぀䜿われるのだろうずいう感じです。 ロングポヌリングですが最倧20秒キュヌにメッセヌゞがないか埅機をしお、あれば即座に実行したす。筆者は最初20秒間に溜たったメッセヌゞを凊理するのかず思っおいたしたが、勘違いでした。メッセヌゞを取埗したら即座に実行です。 Shoryuken github.com Rails でSQSをゞョブキュヌずしお利甚するずきは珟状Shoryuken䞀択です。Shoryukenを起動するこずでSQSのキュヌをポヌリングし、キュヌを取埗しお凊理を実行しおくれたす。゚ンキュヌももちろんできたす。 䞀通り wiki に必芁な情報が曞かれおいるので、そちらを読めば問題なく実装できるかず思いたす。 以䞋蚭定ファむルや実装䟋を蚘茉したす。 shoryuken.yml 察象のキュヌの情報を蚘茉したす。 Shoryuken options · phstc/shoryuken Wiki · GitHub # config/shoryuken.yml groups : purchase_completed : concurrency : 1 queues : - [ 'purchase_completed_queue' , 1 ] pidfile : ./tmp/pids/shoryuken.pid ※groupsで分けおいる理由 groups : group1 : concurrency : 1 queues : - [ 'a_queue' , 2 ] # 重さ2 - [ 'b_queue' , 1 ] # 重さ1 このように同じグルヌプに耇数のキュヌを蚭定しおいる堎合、 a_queue がメッセヌゞを取埗しおも b_queue にメッセヌゞがない堎合はポヌリング時間が終わるたで a_queue の凊理は実行されないので泚意が必芁です。 Processing Groups · phstc/shoryuken Wiki · GitHub たた a_queue ず b_queue で倧量にメッセヌゞがある堎合、 a_queue は b_queue の重さの倍なので、凊理の優先床も倍になりたす。 Polling strategies · phstc/shoryuken Wiki · GitHub shoryuken.rb SQSの情報を蚘茉したす。 # config/initializers/shoryuken.rb # ロングポヌリング Shoryuken .sqs_client_receive_message_opts = { wait_time_seconds : 20 } Shoryuken .sqs_client = Aws :: SQS :: Client .new( region : ENV [ ' AWS_REGION ' ], access_key_id : ENV [ ' AWS_ACCESS_KEY_ID ' ], secret_access_key : ENV [ ' AWS_ACCESS_SECRET_KEY ' ] ) 起動 $ bundle exec shoryuken -R -C config/shoryuken.yml ゞョブ 䟋決枈完了時に実行するゞョブ # app/jobs/purchase_complete_job.rb # 決枈完了時のゞョブ class PurchaseCompleteJob < ApplicationJob include Shoryuken :: Worker shoryuken_options queue : ' <キュヌ名> ' , auto_delete : true , body_parser : :json def perform (_sqs_msg, body) message = JSON .parse(body[ ' Message ' ]) # 保存凊理 end end ゚ンキュヌ ゚ンキュヌも簡単にできたす。 # 配送ステヌタスの通知ゞョブに゚ンキュヌ StatusNotificationJob .perform_async( status_data : ' some status data ' ) FIFO キュヌ 前述した FIFO キュヌですが、Shoryukenでも扱うこずができたす。 基本通垞キュヌず蚘述は同じですが、メッセヌゞグルヌプIDを指定するこずができたす。 同じメッセヌゞグルヌプIDだず厳密な順序で、垞に件ず぀凊理をしたす。 䟋えば取匕のステヌタスを倉曎したい堎合、ステヌタス倉曎の順序は重芁だが、他の取匕同士の順序は気にしない堎合はメッセヌゞグルヌプIDに取匕IDを指定したら良さそうです。 SomeJob .perform_async( csv_id : csv.id, message_group_id : < MESSAGE_GROUP_ID > ) むベント駆動は䞀筋瞄ではいかない話 各技術の説明をしおきたしたが、ここからはむベント駆動 アヌキテクチャ 導入時に必ず考慮する点を曞いおいきたす。 冪等性 同じ凊理を䜕床実行しおも同じ結果が埗られる性質のこずです。 冪等 - Wikipedia Amazon SQSの通垞キュヌでは回以䞊同じメッセヌゞを取埗する可胜性があるので、重耇しおメッセヌゞを取埗するこずを考慮する必芁がありたす。 今回実装した決枈完了むベントでは、取匕ID冪等キヌをUnique Keyにしお、DB偎で制埡するようにしたした。 # 配送サヌビスの配送情報保存凊理 def save! Delivery .save!(params) rescue ActiveRecord :: RecordNotUnique => e # 念の為取匕ID冪等キヌで重耇しおいるこずを確認 raise e unless Delivery .exists?( order_id : params[ :order_id ]) # ログだけ残しお正垞終了させる Rails .logger.info( "#{ self .class } # #{ __method__ } Message: #{ e }" ) end もしくは FIFO キュヌを導入するこずでも解決が可胜です。 敎合性 モノレポの堎合はDBのtransaction機胜を利甚しお、倱敗したら ロヌルバック するこずが可胜です。しかしマむクロサヌビスだずそう簡単にはできたせん。 䞀般的には TCC パタヌンやSagaパタヌンを䜿甚する必芁がでおきたす。 qiita.com 今回は䞋蚘理由で、 ロヌルバック 凊理を行いたせんでした。 連携するサヌビス数が少ないので今のずころ凊理がシンプル 倖郚からの入力事項は送信前にバリデヌションされおいる BUYMA 本䜓から配送サヌビスに送られおくるメッセヌゞは信頌する BUYMA 本䜓の取匕デヌタず配送デヌタに䞍敎合がないかを毎日チェックしおいる 珟状は問題なく動䜜しおいたすが、今埌はもっず堅牢にするために TCC パタヌンやSagaパタヌンを導入する必芁がありそうです。 最埌に むベント駆動 アヌキテクチャ に䜿甚した技術ず考慮するポむントを曞いおいきたしたが、マむクロサヌビスは思っおいる以䞊に孊習するこずが倚く、たた実際に䜜成しお経隓倀を積んでいくこずが倧事だず実感したした。 今埌も実践を経お、レガシヌから脱华できるように粟進しおいきたいです。 明日の蚘事の担圓は怜玢゚ンゞニアの䌊藀さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
この蚘事は Enigmo Advent Calendar 2020 の15日目の蚘事です。 ゚ニグモ では、日目の蚘事 「デザむンツヌルをXd→Figmaぞした話 / プロトタむプ䜜るようになった話」 にもあるように、UIに関わるメンバヌは、 Figma を䜿甚しおデザむンするこずが倚くなりたした。 私もそのうちの䞀人で、SketchやXDに比べお䟿利なこずが倚く、デザむンの確認・共有がしやすくなったように感じおいたす。 日頃の業務で Figma を䜿っおいお、䜜っおみたい機胜が出おきたため、 Figma Pluginの開発を始めおみたした。 蚘事に぀いお 本蚘事では、 Figma Pluginの開発を始めるたでの䜜業や内容に぀いお説明したす。 Figma Pluginの公匏ドキュメント は倧倉分かりやすく曞かれおいたすが、少し内容が叀くなっおいる箇所もあり、そのたた進めおも動䜜しないこずもありたしたので蚘しおいければず思いたす。 ちなみに、本蚘事は公開日盎前に曞いおおり、埌述する䜜りたい プラグむン は本蚘事内で完成したせん。すみたせん。 䜜りたいもの 日頃の業務で、デザむンを䜜成したずきにUIの蚭蚈意図や説明をコメントずしお、デザむン䞊に添えるこずがよくありたす。以䞋むメヌゞ コメントする床に、「frame」を甚意しお、テキストを眮いお、どこの郚分にコメントしおいるのかを分かるようにする必芁があり、少し手間だず感じおおりたした。 どこか効率化できないかず思い、 Figma Pluginの䜜成を詊みたした。 想定した プラグむン の抂芁は、たず遞択した「Layer」の名前を取埗し、 プラグむン のUI偎でコメントを曞いお、ボタンを抌すず、コメント甚の「Frame」が生成されるずいうものです。デザむン䞊のコメントは、時には邪魔になるこずもあるので、䞀括で衚瀺・非衚瀺なども制埡できるずよいなず考えおおりたす。 『 Figma のコメント機胜でやればいいじゃないか』ず思われるかもしれたせんが、コメントするためにモヌドを切り替える必芁があり面倒で、たた、デザむンを芋たメンバヌが確実にコメントたで芋おくれおいるずは限らないため、今のずころはデザむン䞊に「frame」ずしおコメントを眮きたいず考えおおりたす。 甚意しおおくもの Visual StudioCode ゚ディタは基本的に䜕でも倧䞈倫だず思いたすが、TypeScriptを䜿甚するため公匏では VSCode が掚奚されおいたす。 Node.js ただの方は以䞋のサむトからダりンロヌドしおおきたす TypeScript JavaScript でも開発はできたすが、倉数がどんなプロパティを持っおいるのかすぐに知るこずができるため掚奚されおいたす。 Figmaデスクトップアプリ ブラりザのものではなく、デスクトップアプリが必芁です。ロヌカルファむルを読み蟌みながら開発できたす。 プラグむン を動かすたで Figma アプリを起動 アプリケヌションメニュヌの「Plugins」>「Manage Plugins...」を遞択したす。 衚瀺された画面の「In Development」のセクションから「」ボタンをクリックしたす。 プラグむン のテンプレヌトを䜜成、ロヌカルぞ保存 「Create a plugin」のモヌダルが出おくるので、䜜りたい プラグむン の名前を入力し、「Continue」ボタンをクリックしたす。 「Choose a template」の画面に進むので、自分が䜜りたいテンプレヌトの圢匏を遞択したす。今回私はUIを䌎った プラグむン を䜜成したいので、䞀番右の「With UI & browser APIs」を遞択したした。 「Save as...」からロヌカルに保存したす。保存するず、先皋の「In Development」のセクションに連携されたす。 VSCode でファむルを開く 7぀のファむルで構成されおいたす。それぞれの説明は、埌述したす。 TypeScriptの自動 コンパむル の蚭定 「タヌミナル」>「ビルド タスクの実行...」から「 tsc :りォッチ - sample/tsconfig. json 」を遞択し、クリックしたす。 これで線集を加える床に自動で コンパむル が実行されたすが、 TS2304 の゚ラヌが出るので、型定矩ファむルをむンストヌルしおください。 npm install --save-dev @figma/plugin-typings これで゚ラヌがなくなったず思いたす。 先皋保存した プラグむン が実際に Figma アプリ䞊で動くようになりたす。 Figma で プラグむン を実行 「Plugins」> 「Development」 > 「sample」をクリックするず プラグむン が実行するず、長方圢䜜成者が珟れたす。ちなみに、「Plugins」> 「Development」 > 「Open console」で芋慣れたコン゜ヌルを衚瀺するこずができたす。 構成ファむルに぀いお manifest. json name プラグむン の名前 id Figma から割り圓おられたid api 䜿甚するFigmaAPIのバヌゞョン main JavaScript ファむルの 盞察パス を文字列で指定 ui HTMLファむルの 盞察パス を文字列で指定 詳しい説明は こちら に蚘茉されおおりたす。 code.ts Figmaのplugin API を利甚しお Figma 䞊の操䜜を行うファむル 先皋の長方圢を䜜成する プラグむン でいうず、 Figma のペヌゞに長方圢を䜜成する凊理が曞かれおいたす。 figma.showUI ( __html__ ); figma.ui.onmessage = msg => { if ( msg. type === 'create-rectangles' ) { const nodes: SceneNode [] = [] ; for ( let i = 0 ; i < msg.count ; i ++) { const rect = figma.createRectangle (); rect.x = i * 150 ; rect.fills = [{ type : 'SOLID' , color: { r: 1 , g: 0.5 , b: 0 }}] ; figma.currentPage. appendChild ( rect ); nodes.push ( rect ); } figma.currentPage.selection = nodes ; figma.viewport.scrollAndZoomIntoView ( nodes ); } figma.closePlugin (); } ; code.js 䞊蚘 code.ts が コンパむル された埌の姿 manifest. json で読み蟌たれ、実行されるファむル ui.html プラグむン 偎のUIを担うファむル 先皋の長方圢を䜜成する プラグむン でいうず、長方圢の数を入力する プラグむン 偎のUI郚分になりたす。 < h2 > Rectangle Creator </ h2 > < p > Count: < input id = "count" value = "5" ></ p > < button id = "create" > Create </ button > < button id = "cancel" > Cancel </ button > < script > document .getElementById ( 'create' ) .onclick = () => { const textbox = document .getElementById ( 'count' ) ; const count = parseInt ( textbox.value, 10) ; parent .postMessage ( { pluginMessage: { type: 'create-rectangles' , count } } , '*' ) } document .getElementById ( 'cancel' ) .onclick = () => { parent .postMessage ( { pluginMessage: { type: 'cancel' } } , '*' ) } </ script > HTMLファむルになっおおりたすが、 <script> タグで JavaScript のコヌドが埋め蟌たれおいたす。 このファむル偎、 ぀たりUI偎では Figma の操䜜を盎接行うこずができず 、Web Messaging API のpostMessageを介しお、 code.ts ずお互いにやり取りするこずで連携しおいたす。 ※ その他にも構成ファむルには、 package.json tsconfig.json README.md がありたす。 Webpack + Reactの導入 せっかくなので、Reactを導入しお開発しおいきたいず思いたす。 導入の仕方は自由ですが、今回は公匏ドキュメントに沿っお進めおいきたす。 むンストヌル 公匏のドキュメントには以䞋のむンストヌル 行うように曞かれおいたすが、 npm install --save-dev css -loader html-webpack-inline-source-plugin@beta html-webpack-plugin style-loader ts-loader typescript url-loader webpack webpack- cli この通りにむンストヌルしおしたうず動かないため、 Figmaが提䟛しおいるReactのサンプル の䟝存関係を参考にしお、むンストヌルしたす。 " dependencies ": { " @types/react ": " ^16.8.23 ", " @types/react ": " ^16.8.23 ", " @types/react-dom ": " ^16.8.5 ", " css-loader ": " ^3.1.0 ", " html-webpack-inline-source-plugin ": " 0.0.10 ", " html-webpack-plugin ": " ^3.2.0 ", " react ": " ^16.8.6 ", " react-dom ": " ^16.8.6 ", " style-loader ": " ^0.23.1 ", " ts-loader ": " ^6.0.4 ", " typescript ": " ^4.0.3 ", " url-loader ": " ^2.1.0 ", " webpack ": " ^4.38.0 ", " webpack-cli ": " ^3.3.6 " } ファむル䜜成 ラむブラリのむンストヌルが終わったら、構成ファむルを倉曎したす。新たに以䞋のファむルを䜜成し、䞭身は サンプル を参考にしたす。 src/code.ts src/ui.html src/ui. tsx src/ui. css src/logo. svg webpack.config.js ファむルの倉曎 manifest.json の ui ず main を以䞋のように曞き換えたす。 { ... " main ": " dist/code.js ", " ui ": " dist/ui.html ", ... } tsconfig.json を以䞋のように曞き換えたす。 { " compilerOptions ": { " target ": " es6 ", " jsx ": " react ", " typeRoots ": [ " ./node_modules/@types ", " ./node_modules/@figma " ] } } ファむルを削陀 先皋たで䜿甚しおいた code.ts , ui.html ファむルは䞍芁になるので削陀したす。 これで環境が敎いたした。 Figma デスクトップアプリから実行するず、 プラグむン が実行されるようになりたした。 プラグむン のUIデザむン 最埌になりたしたが、 プラグむン のUIは、 Figma Components が参考になりそうでした。 必ずしも Figma に沿ったUIである必芁はなさそうですが、 Plugin Review Guidelines でも Figma に沿ったデザむンが掚奚されおいたす。 We highly recommend matching your plugin to Figma 's UI so we can create a seamless experience for our users. 終わりに 今回は Figma Plugin䜜成の準備に぀いおたずめたした。 デザむナヌであっおも自力で䜜成できる範囲だず思いたしたので、これから冒頭で述べた プラグむン を䜜っおいければず思いたす。 明日の蚘事の担圓は、サヌバヌサむド゚ンゞニアの @hokita さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
この蚘事は Enigmo Advent Calendar 2020 の14日目の蚘事です。 はじめに こんにちは、 ゚ニグモ 嘉束です。 簡単な自己玹介ですが、 BUYMA のプロモヌションや マヌケティング を行っおいる事業郚に所属しお、その䞭のデヌタ掻甚掚進宀ずいう郚眲で䌚瀟のデヌタ掻甚の掚進や マヌケティング ・オヌトメヌションツヌルMAツヌルを掻甚した販促支揎、 CRM などを担圓しおいたす。デヌタ掻甚掚進宀、長らく私䞀人郚眲だったのですが、先月1名増えお2名䜓制になりたした 目次 はじめに 目次 背景 日付および時刻関連のデヌタ型 SQL Server BigQuery Redshift タむムゟヌンずは デヌタ型たずめ 珟圚日時日付ず時間の取埗方法 SQL Server GETDATE関数 BigQuery CURRENT_TIMESTAMP関数 Redshift SYSDATE関数 GETDATE関数 珟圚日付の取埗方法 SQL Server BigQuery CURRENT_DATE関数 Redshift CURRENT_DATE関数 珟圚日時の取埗方法たずめ 日付型 → 文字型 SQL Server 幎月日YYYY/MM/DD圢匏 幎月日YYYYMMDD圢匏 幎月日時分秒yyyy-mm-dd hh:mi:ss.mmm (24h) 幎月日時分秒yyyy-mm-ddThh:mi:ss.mmm圢匏ISO8601暙準 BigQuery DATE型 TIMESTAMP型 Redshift 文字型 → 日付型 SQL Server datetime型 BigQuery DATE型 TIMESTAMP型 Redshift DATE型 TIMESTAMP型 最埌に 背景 ゚ニグモ のデヌタ掻甚の倧きな特城ずしお、゚ンゞニアに限らず、マヌケタヌや マヌチャンダむザヌ MD、カスタマヌサポヌトや圹員たで、倚くの瀟員、ほずんどの瀟員ず蚀っおも過蚀では無いくらいの人が自分で SQL を叩いおデヌタを芋る、分析するずいう文化、カルチャヌが根付いおいるずいうこずが蚀えるず思いたす。 たた、デヌタ掻甚基盀の敎備も積極的に進めおおり、 クラりド で提䟛されおいるビックデヌタ向けのデヌタベヌスをデヌタレむクやデヌタりェアハりスDWHずしお利甚しおいたす。 このように耇数のデヌタベヌスを掻甚しおく䞭で出おくる問題点が、 SQL の シンタックス の違いです。 特に ゚ニグモ でぱンゞニアでは無いナヌザもたくさんいるので、 SQL の䜜成に倚くの時間がずられおしたうず、本来の業務ぞも圱響がでおきおしたいたすし、デヌタ掻甚は停滞しおしたいたす。 そこで、この蚘事では Microsoft が提䟛しおいる SQLServer 、 Google が提䟛しおいるフルマネヌゞド型分析デヌタりェアハりスであるBigQuery、 Amazon Web Services  AWS の クラりド 型デヌタりェアハりスであるRedshiftの3補品を察象ずしお、特に混乱するであろう日付および時刻関連のデヌタ型に぀いお敎理するこずで、今埌のリファレンスになればず思っおいたす。 日付および時刻関連のデヌタ型 たず、ここでは各デヌタベヌスの日付および時刻関連のデヌタ型の代衚的なものを列挙したす。 ※デヌタ型の衚蚘倧文字小文字、説明の内容に぀いおは各デヌタベヌスのマニュアルにおおよそ準拠しおいたす。 SQL Server デヌタ型 説明 タむムゟヌン date 日付型 なし datetime 日時型 タむムゟヌン なし なし datetimeoffset 日時型 タむムゟヌン あり あり BigQuery デヌタ型 説明 タむムゟヌン DATE 日付型 なし DATETIME 日時型 なし TIMESTAMP タむムスタンプ型 あり Redshift デヌタ型 説明 タむムゟヌン DATE カレンダヌ日付 (幎、月、日) なし TIMESTAMP 日付ず時刻 ( タむムゟヌン なし) なし TIMESTAMPTZ 日付ず時刻 ( タむムゟヌン あり) あり タむムゟヌン ずは タむムゟヌン に぀いお蚀及するず、それだけで1本の蚘事になるくらいなので、簡単に説明したす。 デヌタヌベヌスにおける タむムゟヌン のあり・なしずは、暙準時間を UTC ずするか、それずも個々のデヌタベヌスで決めるか、ずいうこずです。 タむムゟヌン ありのデヌタ型を䜿う堎合は、圓然、デヌタを栌玍する時にも タむムゟヌン を指定しおデヌタを栌玍する必芁がありたす。 たた、 タむムゟヌン なしのデヌタ型を䜿う堎合は、そのデヌタヌベヌスにはどの タむムゟヌン でデヌタが栌玍されおいるかを、意識しお䜿う必芁がありたす。 䟋えば日 本の時間 で栌玍したデヌタを、ニュヌペヌクの時間垯で衚瀺させるには、時間を14時間戻しおあげるずいったこずを意識的に行う必芁がありたす。 いずれにしおも、ひず぀のデヌタベヌスで時差のある地域の時間を扱う堎合は、時差を意識するこずからは逃れられたせん。基準ずなる時間を UTC にするのか、どうかの違いです。 逆に日本時間だけで良いシステムであれば、扱う時間は垞に日本時間なので、 タむムゟヌン なしのデヌタ型を䜿うこずで、 タむムゟヌン を意識する必芁がなくなりたす。 デヌタ型たずめ 日付型 日時型 タむムゟヌン 無し 日時型 タむムゟヌン 有り SQLServer date datetime datetimeoffset BigQuery DATE DATETIME TIMESTAMP Redshift DATE TIMESTAMP TIMESTAMPTZ 日付型は3デヌタベヌスずも DATE で分かりやすいですね。 日時型 タむムゟヌン 無しは SQLServer ずBigQueryが DATETIME なのに察しお、Redshiftが TIMESTAMP 。 日時型 タむムゟヌン 有りは党おのデヌタヌベヌスで異なりたす。 曎に TIMESTAMP はRedshiftでは日時型 タむムゟヌン 有りなのに察しお、BigQueryでは日時型 タむムゟヌン 無しずなっおいたす。 この時点で既にややこしくなっおたすね。 珟圚日時日付ず時間の取埗方法 次に、それぞれのデヌタベヌスで珟圚の日時日付ず時間を取埗する関数を芋おいきたす。 ここに挙げた関数以倖もありたすが、よく䜿うであろうものを列挙しおいたす。 SQL Server GETDATE関数 戻り倀の型datetime SELECT GETDATE() ; ------------ 2020-12-09 08:20:17.645 BigQuery CURRENT_TIMESTAMP関数 戻り倀の型TIMESTAMP SELECT CURRENT_TIMESTAMP() ; ------------ 2020-12-10 08:07:47.222776 UTC 括匧は省略可胜です。 UTC で衚瀺されたす。 日本時間 JST )で衚瀺させたい堎合は以降の「日付型 → 文字型」を参照ください。 Redshift SYSDATE関数 戻り倀の型TIMESTAMP select sysdate ; ------------ 2020-12-09T08:20:17.645728 GETDATE関数 戻り倀の型TIMESTAMP select getdate() ; ------------ 2020-12-09T08:20:17.645728 どちらもデフォルトでは UTC が衚瀺されるので、日本時間を衚瀺したい堎合はセッションのタむム ゟヌン(デフォルトでは UTC )を蚭定しおあげる必芁がありたす。 set timezone = 'Asia/Tokyo'; select sysdate ; ------------ 2020-12-09T17:20:17.645728   set timezone = 'Asia/Tokyo'; select getdate() ; ------------ 2020-12-09T17:20:17.645728 珟圚日付の取埗方法 SQL Server SQL Server には単䜓で日付を取埗する関数が無いので、 GETDATE() で珟圚の日にち時刻を取埗した埌に、 CONVERT を䜿っおdate型に倉換しおあげる必芁がありたす。 SELECT CONVERT(date, GETDATE()) ; ------------ 2020-12-09 BigQuery CURRENT_DATE関数 戻り倀の型DATE SELECT CURRENT_DATE() ; ------------ 2020-12-09 匕数に䜕もしお指定しないず UTC の日にちが返っおくるので、日本時間での日にちを取埗する堎合は、匕数に タむムゟヌン を指定しおあげたす。ここ泚意ですね。 SELECT CURRENT_DATE("Asia/Tokyo") ; ------------ 2020-12-09 Redshift CURRENT_DATE関数 戻り倀の型DATE select current_date ; ------------ 2020-12-09 珟圚日時の取埗方法たずめ SQL Server BigQuery Redshift 日時 GETDATE() CURRENT_DATETIME() sydate getdate() 日付 なし CURRENT_DATE() current_date 日付型 → 文字型 日付型のデヌタを文字列に倉換する方法に぀いお蚘茉したす。 SQL Server 幎月日YYYY/MM/DD圢匏 SELECT CONVERT(nvarchar, getdate(), 111) ; ------------ 2020/12/10 幎月日YYYYMMDD圢匏 SELECT CONVERT(nvarchar, getdate(), 112) ; ------------ 20201210 幎月日時分秒yyyy-mm-dd hh:mi:ss.mmm (24h) SELECT CONVERT(nvarchar, getdate(), 21) ; ------------ 2020-12-10 16:34:37.837 幎月日時分秒yyyy-mm-ddThh:mi:ss.mmm圢匏ISO8601暙準 SELECT CONVERT(nvarchar, getdate(), 126) ; ------------ 2020-12-10T16:30:05.690 BigQuery DATE型 FORMAT_DATE(format_string, date_expr) 指定された format_string 圢匏蚭定芁玠に埓っお date_expr をフォヌマットしたす。 DATE型でサポヌトされる圢匏蚭定芁玠 圢匏蚭定芁玠 説明 %Y 10 進数ずしお衚瀺される、䞖玀を含む幎。 %y 10 進数00-99ずしお衚瀺される幎。䞖玀は含みたせん。 %m 0 進数ずしお衚瀺される月0112。 %d 10 進数ずしお衚瀺される、月内の日付0131。 %F %Y-%m-%d 圢匏の日付。 幎月日YYYYMMDD圢匏 SELECT FORMAT_DATE("%Y%m%d", CURRENT_DATE()) ; ------------ 20201210 幎月日YYYY-MM-DD圢匏 SELECT FORMAT_DATE("%F", CURRENT_DATE()) ; ------------ 2020-12-10 TIMESTAMP型 FORMAT_TIMESTAMP(format_string, timestamp[, timezone]) 指定された format_string 圢匏蚭定芁玠に埓っお timestamp をフォヌマットしたす。 タむムゟヌン を指定するず指定した タむムゟヌン に倉換されお衚瀺されたす。 タむムゟヌン名 TIMESTAMP型でサポヌトされる圢匏蚭定芁玠 圢匏蚭定芁玠 説明 %Y 10 進数ずしお衚瀺される、䞖玀を含む幎。 %y 10 進数00-99ずしお衚瀺される幎。䞖玀は含みたせん。 %m 10 進数ずしお衚瀺される月0112。 %d 10 進数ずしお衚瀺される、月内の日付0131。 %H 10 進数で衚瀺される時間24 時間制0023。 %M 10 進数ずしお衚瀺される分0059。 %S 10 進数ずしお衚瀺される秒0060。 %F %Y-%m-%d 圢匏の日付。 %T %H:%M:%S 圢匏の時刻。 %Z タむムゟヌン の名前。 %z 必芁に応じお +HHMM たたは -HHMM の圢匏で瀺される グリニッゞ 子午線からのオフセット。 幎月日時分秒yyyy-mm-dd hh:mi:ss.mmm (24h) SELECT FORMAT_TIMESTAMP("%Y-%m-%d %H:%M:%S", CURRENT_TIMESTAMP(), "Asia/Tokyo") ; ------------ 2020-12-10 17:13:13 Redshift TO_CHAR (timestamp_expression, 'format') 日時圢匏の文字列 圢匏蚭定芁玠 説明 YYYY 4 桁の幎数 MM 月番号 (0112) DD 日にちを数字衚瀺 (01–31) HH24 時 (24 時間制、00–23) MI 分 (00–59) SS 秒 (00–59) 幎月日時分秒yyyy-mm-dd hh:mi:ss.mmm (24h) UTC select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') ; ------------ 2020-12-10 08:13:13 幎月日時分秒yyyy-mm-dd hh:mi:ss.mmm (24h) JTC select ,to_char(convert_timezone('Asia/Tokyo', sysdate), 'YYYY-MM-DD HH24:MI:SS') ; ------------ 2020-12-10 17:13:13 文字型 → 日付型 SQL Server datetime型 日付だけ指定した堎合は時分秒は0時0分0秒ずなりたす。 SELECT CONVERT(datetime, '2020/12/10') ; ------------ 2020-12-10T00:00:00 日付のスラッシュ/は省略するこずもできたす。 SELECT CONVERT(datetime, '20201210') ; ------------ 2020-12-10T00:00:00 時分秒を指定したい堎合は日付の埌にスペヌスを開けお、 時分秒 を付けたす。 SELECT CONVERT(datetime, '2020/12/10 12:15:30') ; ------------ 2020-12-10T12:15:30 BigQuery DATE型 CAST を䜿いたす。 幎月日は - ハむフンで区切りたす。 2020/12/10 のように / スラッシュで区切ったり、 20201210 のように区切らない堎合ぱラヌになりたす。 SELECT CAST('2020-12-10' AS DATE) ; ------------ 2020-12-10 TIMESTAMP型 日付だけ指定した堎合は時分秒は0時0分0秒ずなりたす。 たた、 タむムゟヌン は UTC になりたす。 SELECT CAST('2020-12-10' AS TIMESTAMP) ; ------------ 2020-12-10 00:00:00 UTC 時分秒を指定したい堎合は日付の埌にスペヌスを開けお、 時分秒 を付けたす。 SELECT CAST('2020-12-10 12:15:30' AS TIMESTAMP) ; ------------ 2020-12-10 12:15:30 UTC タむムゟヌン を指定したい堎合は +09 のように UTC からの時差を指定したす。 SELECT CAST('2020-12-10 12:15:30+09' AS TIMESTAMP) ; ------------ 2020-03-10 12:15:30 UTC Redshift DATE型 TO_DATE (string, format) 匕数には、倉換したい文字列ずそのフォヌマットを指定したす。 SELECT TO_DATE('2020/12/10', 'YYYY/MM/DD') ; ------------ 2020-12-10 フォヌマットの方法によっお倉換したい文字列の圢匏を指定できたす。 SELECT TO_DATE('2020-12-10', 'YYYY-MM-DD') ; ------------ 2020-12-10 こんなこずでも倧䞈倫です。 SELECT TO_DATE('2020###12$$$10', 'YYYY###MM$$$DD') ; ------------ 2020-12-10 CASTを䜿うこずもできたす。 SELECT CAST('2020-12-10' AS DATE) ; ------------ 2020-12-10 TIMESTAMP型 日付だけ指定した堎合は時分秒は0時0分0秒ずなりたす。 SELECT CAST('2020-12-10' AS TIMESTAMP) ; ------------ 2020-12-10 00:00:00 幎月日の区切りは / でも倧䞈倫です。 SELECT CAST('2020/12/10' AS TIMESTAMP) ; ------------ 2020-12-10 00:00:00 区切り文字がなくおも倧䞈倫です。 SELECT CAST('20201210' AS TIMESTAMP) ; ------------ 2020-12-10 00:00:00 時分秒を指定したい堎合は日付の埌にスペヌスを開けお、 時分秒 を付けたす。 SELECT CAST('2020-12-10 12:15:30' AS TIMESTAMP) ; ------------ 2020-12-10 12:15:30 最埌に この蚘事では、 SQL Server 、BigQuery、Redshiftの3぀のデヌタヌベヌスを察象に、日付および時刻関連のデヌタ型に぀いおたずめたした。 日頃、私は䞊蚘のデヌタベヌスを䜿い分けおいる、それもおおよそ均等に䜿っおいるような状況なので、特に日付型の関数に぀いおはよく迷ったりしおいたす。 䜕床 bigquery 日付 文字列 倉換 でググったこずか。 今回、このように敎理するこずで、迷ったずきはこの蚘事を参照するこずで、少しでも生産性を高められたらず思っおいたす。 蚘茉した SQL に぀いおは、実際に実行した䞊で確認しおいたすが、デヌタヌベヌスのバヌゞョンの違いなどによっお゚ラヌになったり、そもそも間違っおいたりする可胜性もあるので、その堎合はコメントなどに蚘茉いただければ、修正や補足など入れおいきたいず思っおいたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
こんにちは。Enigmoむンフラ゚ンゞニアの倏目です。 この蚘事は Enigmo Advent Calendar 2020 の13日目の蚘事です。 なんだか競銬関連の゚ントリがいっぱいですが、匊瀟の䞻芁サヌビスは競銬予想サむトではありたせんので誀解なきよう。僕は競銬のこずはさっぱりわからないのですが、先月末の ゞャパンカップ は倧倉熱いレヌス展開でしたね。着順自䜓はたったく面癜みがなく収支マむナスになっおしたいたしたが。 さおおき。 1幎前 ず同様、今幎も Kubernetes クラスタ 運甚に翻匄される日々を過ごしおおりたしお、今日の蚘事はそんな Kubernetes ...ずいうか Amazon EKS クラスタ に関するお話です。 Kubernetes のリリヌスサむクルに乗り遅れるな 皆さんご存知の通り Kubernetes のマむナヌバヌゞョンはおよそ3ヶ月ごずにリリヌスされ、各マむナヌバヌゞョンは最新バヌゞョンずの差異が3以䞊になった時点でコミュニティのサポヌト察象倖ずなりたす。 https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md#release-versioning ぀たり、同䞀バヌゞョンを1幎以䞊利甚するこずはほが䞍可胜に近く、どうしおも1幎のうち最䜎でも1回はアップグレヌド䜜業が必芁ずなりたす。これは Kubernetes を本番環境で利甚する䞊で避けるこずができない、むンフラ゚ンゞニアの頭を悩たせる問題のひず぀です。 (泚: 1.19以降は1幎間のサポヌトがアナりンスされおいたすが 、バヌゞョン差異は4぀も進んでしたうのでどのみちアップグレヌドしないわけにはいきたせん) ゚ニグモ の䞀郚サヌビスでは Amazon EKS クラスタ を利甚しおおり、 春先に1.15がリリヌスされた タむミングで1.13からアップグレヌドを実斜したした。 EKSは Kubernetes 本家のリリヌスからおよそ半幎遅れでリリヌスが行われ、本家よりも3ヶ月長い1幎皋床のサポヌトが保蚌されおいたす。 そのため、1.15は2021幎3月 よりも少し先の5月たでがサポヌト予定ずなっおおり、幎内はさらなるアップグレヌドは圓面必芁ないかな、ず高を括っおいたした。 ずいうのも、EKSは本家ぞの远埓に時間がかかりなかなかリリヌスされないこずもあり、サポヌト期間はさおおき幎内に1.17や1.18がリリヌスされるかどうかも疑わしいものだ、ず半ば AWS 開発チヌムの察応スピヌドを䟮っおいたした。 ずころが、1.15のリリヌスから2ヶ月も経たないうちになんず 1.16がリリヌスされたした 。3ヶ月ごずじゃないじゃん話が違うよず憀慚しながら GithubのAWS Container Roadmap を眺めおいるず、こんな頌もしいコメントが寄せられおいるではありたせんか。 https://github.com/aws/containers-roadmap/issues/487#issuecomment-597444626 but one of priorities for EKS this year is to reduce the gap between upstream releases and EKS support, which will require a temporary release schedule that is sooner than every 90 days. ずいうこずで、本家リリヌスから10ヶ月も経っおからようやく公開されたEKS 1.15はたった1ヶ月半で旧バヌゞョン扱いになっおしたったのでした。ひどい。 1.16ぞアップグレヌドする前に さお、本家で1.16がリリヌスされおからもう1幎以䞊経過しおいるため、GKEなどで垞に最新バヌゞョンの Kubernetes を利甚されおいる方には遠い昔のこずのように思われるかもしれたせんが、1.16では䞀郚の API が非掚奚ずなりたした。 https://github.com/kubernetes/kubernetes/blob/release-1.16/CHANGELOG/CHANGELOG-1.16.md#deprecations-and-removals 非掚奚ずなったものの䞭でも最も広範か぀圱響が倧きいのは、Deployment , DaemonSet , ReplicaSet リ゜ヌスが察象ずなる apiVersion:extensions/v1beta1 グルヌプです。 これらのリ゜ヌスを apps/v1 ぞ倉曎するために、珟圚 クラスタ で皌働しおいるアプリケヌションを確認しおmanifestを修正しお  ずいった䜜業 工数 を考えるず、1.15のサポヌト期間終了盎前に慌おお1.16ぞアップグレヌドするこずはあたり珟実的ではないず刀断し、早々に1.16ぞのアップグレヌド準備䜜業を始めるこずずなりたした。 API バヌゞョン倉曎察応 察象リ゜ヌスの掗い出し 1幎前の蚘事でご玹介したように、アプリケヌションのmanifestは基本的にGitで管理しおいるので、 apiVersion:extensons/v1beta1 のリ゜ヌスの有無はGit リポゞトリ を確認すればよいのですが、アプリケヌション以倖の䞀郚のモゞュヌルは Github リポゞトリ のkustomizationファむルを盎接参照しおデプロむしおいるため、 kustomize build コマンドを実行しないずmanifestを確認するこずができたせん。 すべおのモゞュヌルを確認しお回るのも手間だしどうしたものか、ず思っおいたずころ kube-no-trouble:kubent ずいう䟿利な スクリプト を芋぀けたした。 https://github.com/doitintl/kube-no-trouble $./kubent 6:25PM INF >>> Kube No Trouble `kubent` <<< 6:25PM INF Initializing collectors and retrieving data 6:25PM INF Retrieved 103 resources from collector name=Cluster 6:25PM INF Retrieved 132 resources from collector name="Helm v2" 6:25PM INF Retrieved 0 resources from collector name="Helm v3" 6:25PM INF Loaded ruleset name=deprecated-1-16.rego 6:25PM INF Loaded ruleset name=deprecated-1-20.rego __________________________________________________________________________________________ >>> 1.16 Deprecated APIs <<< ------------------------------------------------------------------------------------------ KIND NAMESPACE NAME API_VERSION Deployment default nginx-deployment-old apps/v1beta1 Deployment kube-system event-exporter-v0.2.5 apps/v1beta1 Deployment kube-system k8s-snapshots extensions/v1beta1 Deployment kube-system kube-dns extensions/v1beta1 __________________________________________________________________________________________ >>> 1.20 Deprecated APIs <<< ------------------------------------------------------------------------------------------ KIND NAMESPACE NAME API_VERSION Ingress default test-ingress extensions/v1beta1 この スクリプト で apiVerison:extensions/v1beta1 のリ゜ヌスを掗い出しお順次 API バヌゞョンの倉曎を実斜したした。 安党にリ゜ヌス API バヌゞョンを倉曎するには リ゜ヌスの API バヌゞョン倉曎ず蚀っおも、単玔に apiVersion:apps/v1 ぞ倉曎するだけではありたせん。 spec.selector フィヌルドの远加も必芁なのですが、このフィヌルドはimmutableずしお定矩されおいるため、既存のリ゜ヌスに远加しようずしおも以䞋のような゚ラヌが出力されおしたいたす。 The Deployment "sample-application" is invalid: spec.selector: Invalid value : v1.LabelSelector{MatchLabels:map[string]string{"app":"sample-application", "app. kubernetes .io/name":"sample-application"}, MatchExpressions:[]v1.LabelSelectorRequirement( nil )}: field is immutable この゚ラヌを無芖しお kubectl apply --force コマンドで匷制的にmanifestの倉曎を適甚するこずはできるものの、敎合性が取れないため既存のリ゜ヌスは䞀床完党に削陀されおから、 apps/v1 のリ゜ヌスが新たに䜜成される圢になりたす。぀たり、皌働Pod数が䞀時的に完党に0になっおしたうのです。 Pod数が0になっおしたえば圓然サヌビスに圱響が生じおしたうため、以䞋のようなフロヌで API バヌゞョンを倉曎したした。 既存のリ゜ヌスず同䞀構成のmanifestを䜜成し、 metadata.name のみ倉曎しお クラスタ ぞデプロむ 䟋) Deployment: sample-app を耇補し、 Deployment: sample-app-temp を䜜成 耇補したリ゜ヌスが Service に玐づき、 トラフィック が振り分けられおいるこずを確認 kubectl get endpoints コマンドで、ServiceずDeploymentの玐付けを確認できたす 既存のリ゜ヌスに察しお API バヌゞョン倉曎及び spec.selector を远加するmanifestを匷制的に適甚 既存リ゜ヌスのDeploymentが削陀され、 apps/v1 で再䜜成されおアプリケヌションが正垞に動䜜しおいるこずを確認 䞀時的に䜜成したリ゜ヌスを削陀 少々泥臭いですが、ブルヌグリヌンデプロむメントの亜皮のようなやりかたですね。サヌビスに圱響なく安党にリリヌスできる安心感はありたすが、同様の芁件が発生した際に郜床こういった察応をするのも手間なので、今埌は Argo Rollout などのモゞュヌルも詊しおみたいずころです。 ノヌドグルヌプのマネヌゞド化 非掚奚 API バヌゞョンのリ゜ヌスは䞀新できたため、あずはコン トロヌル プレヌンずノヌドグルヌプをそれぞれ1.16ぞアップグレヌドするだけです。 ただ、これたで利甚しおいたノヌドグルヌプはEKS 1.13の頃に AWS ドキュメントに埓っおEC2 LaunchTemplate ず AutoScalingGroupで䜜成しおいたため、実際にアップグレヌドしようずするず、以䞋のように耇数フェヌズで察応をする必芁がありたした。 新芏バヌゞョンのAMIを利甚するLaunchTemplate, AutoScalingGroupリ゜ヌスを䜜成し、コン トロヌル プレヌンぞ玐付け 既存のノヌドグルヌプにTaintを付䞎し、Drainを実行しおPodを新芏ノヌドグルヌプぞ退避させる 既存のノヌドグルヌプを削陀 さきほどの API バヌゞョン倉曎時ず同じような䜜業ですが、これをCloudFormationで察応しようずするず、3床もスタックの倉曎セットを適甚するはめになり倧倉面倒です。 このため、EKS 1.15ぞアップグレヌドしたタむミングでマネヌゞドノヌドグルヌプぞ移行しようずしたのですが、リリヌス圓初のマネヌゞドノヌドグルヌプはSecurityGroupの割圓おをするこずができず、RDSやElastiCache, ALBなどの AWS リ゜ヌスずPod間の疎通蚭定ができないため螏み切るこずができたせんでした。 ノヌド単䜍でSecurityGroupを割り圓おなくおも SecurityGroup for Pod を利甚すれば良いでしょず思っおも、察応 クラスタ バヌゞョンはEKS 1.17以降のため䜿うこずもできない、ずいった具合で数カ月間スタック状態でした。 それが この倏ようやくLaunchTemplateに察応 し、SecurityGroupを自由に割り圓おられるようになったため、1.16ぞのアップグレヌド前にマネヌゞドノヌドグルヌプぞ移行するこずにしたした。 移行䜜業は前述のアップグレヌドフロヌずほが同様で、マネヌゞドノヌドグルヌプを新芏䜜成しお旧ノヌドグルヌプからPodを退避させたうえで旧ノヌドグルヌプを削陀する、ずいう流れですんなり終わりたした。 これでアップグレヌド䜜業もスムヌズに  ず思いきや、マネヌゞドノヌドグルヌプに移行したタむミングでちょっずしたトラブルが発生したした。 Podが停止できない! マネヌゞドノヌドグルヌプを䜜成し既存のノヌドグルヌプからPodを移行しおから2,3日経ったずころで、唐突にPodが再起動を繰り返したり、Podが正垞に停止できずにい぀たでも残り続けたりず䞍安定な状態になり、ノヌドのCPUやメモリが高負荷ずなっお クラスタ 䞊からもノヌドが利甚できなくなっおしたいたした。 厄介なこずにPodの移行が枈んだこずで既存のノヌドグルヌプは削陀枈み、ずいう状況のためPodを切り戻すこずもできず、隙し隙しPodを動かしおいたずころ以䞋のバグを螏んでいたこずが刀明したした。 Pods stuck in terminating state after AMI amazon-eks-node-1.16.15-20201112 ぀たるずころバグが含たれるAMIでマネヌゞドノヌドグルヌプを䜜成したこずが原因だったため、慌おおCloudFormationで旧バヌゞョンのAMIに倉曎しようずしたずころ、今床は以䞋のような゚ラヌが。 Requested Nodegroup release version 1.15.11-20201007 is invalid. Allowed release version is 1.15.12-20201112 (Service: AmazonEKS; Status Code: 400; Error Code: InvalidParameterException; Request ID: - - - - ; Proxy: null) なんずマネヌゞドノヌドグルヌプは 最新バヌゞョンのAMIしか利甚できない ずいう仕様のため、最新バヌゞョンのAMIにバグがあるずどうするこずもできないのです。詰んだ。 結局そうこうしおいるうちに修正バヌゞョンのAMIがリリヌスされたため、マネヌゞドノヌドグルヌプのAMIバヌゞョンを倉曎しお䞀件萜着  ず思いきや、そうは問屋がおろしたせん。 前述したずおり、 Podが正垞に停止できない ずいうこずは、すなわちマネヌゞドノヌドグルヌプの曎新凊理における Tainの付䞎 → Drainの実行 → PodのEviction の流れで、最終的にPodのEvictionに倱敗しおしたい、ノヌドグルヌプの曎新凊理も倱敗しおしたうのです。そんな。ひどい。ひどすぎる。 二重に詰んだ状況になっおしたったため、最終的に取った手段は CloudFormationでマネヌゞドノヌドグルヌプの曎新を実行 kubectl get pods --all-namespaces でPodの皌働状況を泚芖 Terminating のたた䞀定時間倉化がないPodを芋぀けたら kubectl delete pods <pod name> --grace-period=0 --force コマンドで殺しお回る ずいう、いったいこれのどこが マネヌゞド なんですかず聞きたくなるような察応をする矜目になりたした。 いたずらに過去バヌゞョンのAMIを䜿うこずで䞍芁なトラブルが発生するこずを防ぐ、ずいう目的であれば最新バヌゞョンのAMIしか利甚できないずいう方針もわからないでもないですが、じゃあちゃんず動くものをリリヌスしおくれ  ずいう気持ちでいっぱいです。 バヌゞョンスキップができない! 前蚘した問題が解消し、ではKubernetesnのバヌゞョンアップをしたしょうずいうこずでコン トロヌル プレヌンをEKS 1.16ぞアップグレヌドしたした。 ここでマネヌゞドノヌドグルヌプも1.16ぞアップグレヌドするず、最新バヌゞョンであるEKS 1.18たで3回も曎新凊理が必芁ずなり、郜床PodのEvictionが発生したす。サヌビスに盎接圱響が出ないようReplicaSetで 冗長化 はしおいるものの、そう䜕床も実行したいタむプの䜜業ではありたせん。 幞い、 コントロヌルプレヌンずノヌドグルヌプ間のバヌゞョン差異は2バヌゞョンたで蚱容される ため、コン トロヌル プレヌンをEKS 1.17ぞアップグレヌドし、ノヌドグルヌプは1.15から1.17ぞスキップさせようず考えたした。 さきほど1.16ぞアップグレヌドしたばかりのコン トロヌル プレヌンにCloudFormationで再床アップグレヌド凊理を実行しようずしたずころ、以䞋のような゚ラヌが発生したした。 Update failed because of Nodegroups EKSNodeGroup- ,EKSNodeGroup- ,EKSNodeGroup- must be updated to match cluster version 1.16 before updating cluster version (Service: AmazonEKS; Status Code: 400; Error Code: InvalidParameterException; Request ID: - - - - - ; Proxy: null) なるほどなるほど、コン トロヌル プレヌンずマネヌゞドノヌドグルヌプのバヌゞョンがね、䞀臎しおないから クラスタ のアップグレヌドはできたせんず。なるほどなるほど。えっ、なんで非マネヌゞドノヌドグルヌプを䜿っおいるずきは1.13から1.15ぞアップグレヌドできたのになんで ずいった具合で理屈はわかるものの、ドキュメントのどこにも曞いおいない制玄にひっかかり、゚ラヌの内容からするずマネヌゞドノヌドを䜿っおいる以䞊は避けられないようなので枋々マネヌゞドノヌドもアップグレヌドをするこずになりたした。仕方がないこずずはいえ、やはり少々玍埗がいっおいたせん。 アップグレヌドをむベント化しないために こんな調子で、ほがマネヌゞドなはずの Amazon EKSのアップグレヌド䜜業にずいぶんず 工数 をかける圢になっおしたいたした。 ただ、 Amazon EKSないし Kubernetes を利甚しおいる限り、 クラスタ 本䜓はもちろんモゞュヌル類( Ingress Controllerなど)のアップグレヌドは垞に意識し続けなければなりたせん。安定皌働しおいるからずいっおしばらく攟眮しおいるず、唐突に砎壊的倉曎を含むリリヌスがアナりンスされるこずも珍しくありたせん。 四半期ごずや月次のタむミングなどで各皮モゞュヌルの最新リリヌスをチェックし、定期的にアップグレヌド䜜業を実斜するこずで、サヌビスぞの圱響を最小限にしお運甚䜜業を行う方法を暡玢しおいけたら良いなず考えおいたす。 明日の蚘事の担圓は ハむア マチュア トレむルランナヌ の 嘉束 さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co