電通総研のブログ - TECH PLAY

TECH PLAY

電通総研

電通総研 の技術ブログ

å…š867ä»¶

電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、 蒞気機関 が高床に発達したレトロなアニメ スチヌムパンク の䞖界芳線です。 Steampunk スチヌムパンク っお蚀葉を知っおたすか。SFから掟生しおいお、 蒞気機関 Steamが高床に発達したレトロな䞖界芳です。有名な䜜品だず「 倩空の城ラピュタ 」、「 ハりルの動く城 」、「 鋌の錬金術垫 」などがありたす。 pixiv癟科事兞 スチヌムパンク 今回は、Steampunkの䞖界に飛び蟌んでみたしょう。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting clockwork machines machines with cogs flying above clouds illuminated fountain in town たずめ 仲間募集 Stable Diffusionの過去コンテンツ steampunk illustration of huge battleship flying over city highly detailed 今回もシンプルな呪文から始めお、埐々に呪文を足しおいきたしょう。 Steampunkなむラストを描くには、steampunk illustration ofで始めたす。 今回の描画察象は、街の䞊を飛んでいる巚倧な戊艊huge battleship flying over cityです。 長い呪文は切り捚おられる線 で、説明したようにaやtheは必芁ないので、省いおいたす。 highly detailedを足すず描画察象のクオリティが䞊がりたす。 今回の呪文 steampunk illustration of huge battleship flying over city highly detailed トヌク ン出力結果改行版 長い呪文は切り捚おられる線 参照 10 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>'] 画像出力結果 artstation deviantart concept art digital painting award winning 䜜颚甚の呪文を远加したしょう。 artstation、 deviantart でアヌトの投皿サむトを指定したす。 concept art、digital painting、award winningはクオリティを䞊げるためのお玄束の呪文。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning 閲芧甚呪文改行版 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning トヌク ン出力結果改行版 19 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>'] artstationがartずstationの2぀の トヌク ンに分かれおしたっおたすが、artstationが有効な呪文であるこずは、䜕床もあり/なしで確認しおいたす。 画像出力結果 fantasy scene fantasy composition fantasy lighting 挔出甚の呪文を远加したしょう。sceneシヌン、composition構図、lightingラむティングを指定したす。いろいろ詊したしたが、Steampunkの䞖界芳には、fantasyがあっおいるようです。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 25 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 良い感じに仕䞊がりたしたね。今床は、描画察象 サブゞ ェクトを倉えおみたしょう。 clockwork machines clockwork machinesれンマむ仕掛けの機械を詊しおみたしょう。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of clockwork machines highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of clockwork machines highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 22 ['steampunk</w>', 'illustration</w>', 'of</w>', 'clockwork</w>', 'machines</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 machines with cogs flying above clouds 今床は、雲の䞊を飛んでいる歯車付き機械です。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of machines with cogs flying above clouds highly detailed artstation deviantart concept art digital painting award winning fantasy scene golden hour fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of machines with cogs flying above clouds highly detailed artstation deviantart concept art digital painting award winning fantasy scene golden hour fantasy composition fantasy lighting トヌク ン出力結果改行版 29 ['steampunk</w>', 'illustration</w>', 'of</w>', 'machines</w>', 'flying</w>', 'above</w>', 'clouds</w>', 'with</w>', 'co', 'gs</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'golden</w>', 'hour</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] cogs歯車がcoずgsに分割されおしたっおいたすが、cogsが有効な呪文であるこずは䜕床も詊しお確認枈みです。 画像出力結果 illuminated fountain in town 最埌は、街の䞭のラむトアップされた噎氎です。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of illuminated fountain in town highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of illuminated fountain in town highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 24 ['steampunk</w>', 'illustration</w>', 'of</w>', 'illuminated</w>', 'fountain</w>', 'in</w>', town</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 たずめ 今回は、Steampunkのむラストを扱いたした。 蒞気機関 が高床に発達したレトロなアニメ スチヌムパンク の䞖界芳、奜きな人は倚いのではないでしょうか。 次回は、 A as Bの呪文による画像合成線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、 蒞気機関 が高床に発達したレトロなアニメ スチヌムパンク の䞖界芳線です。 Steampunk スチヌムパンク っお蚀葉を知っおたすか。SFから掟生しおいお、 蒞気機関 Steamが高床に発達したレトロな䞖界芳です。有名な䜜品だず「 倩空の城ラピュタ 」、「 ハりルの動く城 」、「 鋌の錬金術垫 」などがありたす。 pixiv癟科事兞 スチヌムパンク 今回は、Steampunkの䞖界に飛び蟌んでみたしょう。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting clockwork machines machines with cogs flying above clouds illuminated fountain in town たずめ 仲間募集 Stable Diffusionの過去コンテンツ steampunk illustration of huge battleship flying over city highly detailed 今回もシンプルな呪文から始めお、埐々に呪文を足しおいきたしょう。 Steampunkなむラストを描くには、steampunk illustration ofで始めたす。 今回の描画察象は、街の䞊を飛んでいる巚倧な戊艊huge battleship flying over cityです。 長い呪文は切り捚おられる線 で、説明したようにaやtheは必芁ないので、省いおいたす。 highly detailedを足すず描画察象のクオリティが䞊がりたす。 今回の呪文 steampunk illustration of huge battleship flying over city highly detailed トヌク ン出力結果改行版 長い呪文は切り捚おられる線 参照 10 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>'] 画像出力結果 artstation deviantart concept art digital painting award winning 䜜颚甚の呪文を远加したしょう。 artstation、 deviantart でアヌトの投皿サむトを指定したす。 concept art、digital painting、award winningはクオリティを䞊げるためのお玄束の呪文。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning 閲芧甚呪文改行版 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning トヌク ン出力結果改行版 19 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>'] artstationがartずstationの2぀の トヌク ンに分かれおしたっおたすが、artstationが有効な呪文であるこずは、䜕床もあり/なしで確認しおいたす。 画像出力結果 fantasy scene fantasy composition fantasy lighting 挔出甚の呪文を远加したしょう。sceneシヌン、composition構図、lightingラむティングを指定したす。いろいろ詊したしたが、Steampunkの䞖界芳には、fantasyがあっおいるようです。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of huge battleship flying over city highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 25 ['steampunk</w>', 'illustration</w>', 'of</w>', 'huge</w>', 'battleship</w>', 'flying</w>', 'over</w>', 'city</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 良い感じに仕䞊がりたしたね。今床は、描画察象 サブゞ ェクトを倉えおみたしょう。 clockwork machines clockwork machinesれンマむ仕掛けの機械を詊しおみたしょう。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of clockwork machines highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of clockwork machines highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 22 ['steampunk</w>', 'illustration</w>', 'of</w>', 'clockwork</w>', 'machines</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 machines with cogs flying above clouds 今床は、雲の䞊を飛んでいる歯車付き機械です。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of machines with cogs flying above clouds highly detailed artstation deviantart concept art digital painting award winning fantasy scene golden hour fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of machines with cogs flying above clouds highly detailed artstation deviantart concept art digital painting award winning fantasy scene golden hour fantasy composition fantasy lighting トヌク ン出力結果改行版 29 ['steampunk</w>', 'illustration</w>', 'of</w>', 'machines</w>', 'flying</w>', 'above</w>', 'clouds</w>', 'with</w>', 'co', 'gs</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'golden</w>', 'hour</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] cogs歯車がcoずgsに分割されおしたっおいたすが、cogsが有効な呪文であるこずは䜕床も詊しお確認枈みです。 画像出力結果 illuminated fountain in town 最埌は、街の䞭のラむトアップされた噎氎です。 今回の呪文暪長、コピヌ&ペヌスト甚 steampunk illustration of illuminated fountain in town highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting 閲芧甚呪文改行版 steampunk illustration of illuminated fountain in town highly detailed artstation deviantart concept art digital painting award winning fantasy scene fantasy composition fantasy lighting トヌク ン出力結果改行版 24 ['steampunk</w>', 'illustration</w>', 'of</w>', 'illuminated</w>', 'fountain</w>', 'in</w>', town</w>', 'highly</w>', 'detailed</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'fantasy</w>', 'scene</w>', 'fantasy</w>', 'composition</w>', 'fantasy</w>', 'lighting</w>'] 画像出力結果 たずめ 今回は、Steampunkのむラストを扱いたした。 蒞気機関 が高床に発達したレトロなアニメ スチヌムパンク の䞖界芳、奜きな人は倚いのではないでしょうか。 次回は、 A as Bの呪文による画像合成線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
はじめたしお、X むノベヌション 本郚 オヌプン むノベヌション ラボの飯田です。 ISIDでは、有志で論文茪読䌚を実斜しおいたす。 tech.isid.co.jp 今回、その䞭で、私が読んだDNAストレヌゞに぀いおご玹介したす。 DNAストレヌゞずいう技術は、DNAを情報蚘録媒䜓ずしお甚いる技術です。 DNAの 塩基配列 をうたく掻甚するこずで、デゞタルデヌタの読み曞きが可胜ずなりたす。 マむクロ゜フト 等が積極的に研究を行っおいるようです ( Microsoft ResearchDNA Storage ) 茪読䌚では、以䞋2本の論文を玹介したした。 その内容を簡単にご玹介したす。 Bornholt, J. et al. (2016) A DNA-based Archival Storage System DNAストレヌゞが初登堎したず蚀われる Clelland C. T. et al. (1999) Hiding messages in DNA microdots 前提知識 なぜDNAストレヌゞ ビックデヌタ時代のストレヌゞの課題ずDNAストレヌゞ DNAストレヌゞの簡単な原理 最初のDNAストレヌゞ DNAストレヌゞの課題 冗長性・゚ラヌ耐性 ず ランダムアクセス 冗長性・゚ラヌ耐性 ランダムアクセス Bornholt, J. et al. (2016) のアヌキテクチャ 曞き蟌み凊理 の流れ 読み出し凊理 の流れ 必芁であれば、DNAストレヌゞの増幅 実䟋実際に保存されたデヌタ䟋 最埌に、バむオロゞヌ×IT技術の可胜性 前提知識 DNA ヒトの现胞では、栞の䞭の染色䜓にあり、Aアデニン・Tチミン・Gグアニン・Cシトシンの4皮で構成されおいる。 DNA䞭ではAずT、GずCが結合しおいお、その結合の察を塩基察ず蚀いたす。 DNA合成技術 狙った 塩基配列 でDNAを生み出す方法。DNAストレヌゞではWriteに盞圓する手技。 シヌク゚ンシング DNAの構成成分であるATGC 4皮の 塩基配列 を決定するこず。 叀兞的なサンガヌ法から、NGSたでいく぀かの手法がある。DNAストレヌゞではReadに盞圓する手技。 なぜDNAストレヌゞ ビックデヌタ時代のストレヌゞの課題ずDNAストレヌゞ 珟圚のビックデヌタ時代、珟状の 蚘憶メディア では保存密床や寿呜が課題になるず蚀われおいたす。 磁気メディア185 TB のテヌプ・カヌトリッゞ密床10 GB mm3 皋床 光孊メディア1PBを栌玍できる光ディスクの実珟可胜性密床玄100GB/ mm3  回転ディスクの寿呜35幎 テヌプの寿呜1030幎 その課題を解決する方法ずしお、DNAストレヌゞが泚目されおいたす。 バむオテク ノロ ゞヌ の暙準的な手法で実珟可胜 非垞に高密床理論的な限界倀 1EB mm3 テヌプの8倍 長寿呜500幎以䞊の 半枛期 DNAベヌスの生呜が存圚する限り、DNAを読み取り、操䜜可胜 DNAストレヌゞによっお、より高密床・長期保存が可胜になるず期埅されおいたす。 生物ずしお生きおいれば、生呜が続く限りデヌタは保存されるずいうこずになるず思いたす。 DNAストレヌゞの簡単な原理 ものすごく単 玔化 するず、デゞタルデヌタを0/1のビットで情報衚珟するものが、DNAストレヌゞではそれをATGCの4皮で衚珟するむメヌゞになりたす。 倧きな流れずしおは、以䞋のずおりです。 デゞタルデヌタをDNAの ヌクレオチド 配列に マッピング し、察応するDNA分子を合成し、保存する デヌタの読み取りは、DNA分子の 塩基配列 を解読しお、元のデゞタルデヌタに戻す DNAストレヌゞは読み取りに PCR やシヌク゚ンシングが必芁ずなるため、超 アヌカむブ 向けのストレヌゞ数時間から数日の アクセス時間 、高密床で耐久性の特性がありたす。 具䜓䟋でみおみたしょう。 最初のDNAストレヌゞ 暗号衚ず 塩基配列 を マッピング しお、「J U N E 6 I N V A S I O N : N O R M A N D Y」23文字をDNA䞊に保存し、読み取りにも成功したずいう報告です。 こちらの暗号衚をもずに、英数字ず 塩基配列 を察応させお、DNAに保存読み取りを実珟したした。 DNAストレヌゞの課題 冗長性・゚ラヌ耐性 ず ランダムアクセス 冗長性・゚ラヌ耐性 DNAストレヌゞでは、䞋蚘のようにDNAずしおの物質に由来する゚ラヌず劣化がありたす。 実甚化をするためには、それに察応するための冗長性・゚ラヌ耐性の仕組みが必須ずなりたす。 DNAの合成ず読み取りの䞍完党さDNA合成・シヌク゚ンシングでぱラヌが入っおしたう 塩基配列 は保存䞭に劣化する可胜性 デヌタの完党性の欠損 ランダムアクセス DNAシヌク゚ンシングは、DNA党䜓に察しお行う必芁があるため、DNAストレヌゞから1バむトでも読みだすには、DNA党䜓を解読シヌク゚ンシングする必芁がありたす。 キヌバリュヌ方匏の栌玍法ず PCR を組み合せ、必芁なデヌタのみを増幅するこずで、ランダムアクセスを実珟する方法が提案されおいたす。 Bornholt, J. et al. (2016) の アヌキテクチャ 最初の報告では、単玔なものでしたが、ランダムアクセス等に察応した アヌキテクチャ がこちらです。 曞き蟌み凊理 の流れ キヌず倀を入力 いわゆるKey- Value ストアのように保存するむメヌゞになりたす キヌは PCR プラむマヌ配列、栌玍される堎所 倀はデヌタの倀 DNA配列の生成 デヌタアドレス、 ペむロヌド 、゚ラヌ怜出コヌド等も笊号化し、 PCR プラむマヌのタヌゲット配列を添付しお、合成 できあがったDNAは、保存甚ラむブラリに栌玍 読み出し凊理 の流れ 読み取りたいキヌを入力し、物理的に抜出 キヌの PCR プラむマヌを取埗 保存されおいるデヌタを含むDNAプヌルからサンプルを物理的に抜出 その䞭には無関係なデヌタも含たれおいる PCR によりDNAを増幅し、シヌク゚ンシング キヌに指定された PCR プラむマヌにより、目的のDNAだけが増幅される シヌク゚ンシングにより、デゞタルデヌタの読み出し 必芁であれば、DNAストレヌゞの増幅 読み出し凊理埌、サンプルが枛っおしたうため、必芁に応じお PCR で耇補を行う 実䟋実際に保存されたデヌタ䟋 Bornholt (2016) では、 5kBから84kBたでの4぀の画像ファむルを保存し、ランダムアクセスができるこずを確認しおいたす 3぀のファむルぱラヌなしで埩元できたした。cat.jpgのみ、 JPEG ヘッダヌに1バむトの゚ラヌが発生したしたが、修正しお参照できたした。 最埌に、バむオロ ゞヌ × IT技術 の可胜性 論文の最埌に䞋蚘の蚀葉がありたした。 Given the impending limits of silicon technology, we believe that hybrid silicon and biochemical systems are worth serious consideration: time is ripe for computer architects to consider incorporating biomolecules as an integral part of computer design. now is the time for the computer industry to borrow back from the biotechnology industry to advance the state of the art in computer systems. ムヌアの法則 に限界がきおいるず蚀われるように、個人的には、既存の IT技術 の延長では限界があるず思っおいたす。 バむオ技術など、他の業界の技術を倧胆に取り入れおブレむクスルヌを目指すのは倢がありたす。 量子コンピュヌタ は 量子力孊 をベヌスずしおいるように、バむオコンピュヌタの登堎も倢ではないず思いたす。 執筆 @iida.michitaka 、レビュヌ @sato.taichi  Shodo で執筆されたした 
はじめたしお、X むノベヌション 本郚 オヌプン むノベヌション ラボの飯田です。 ISIDでは、有志で論文茪読䌚を実斜しおいたす。 tech.isid.co.jp 今回、その䞭で、私が読んだDNAストレヌゞに぀いおご玹介したす。 DNAストレヌゞずいう技術は、DNAを情報蚘録媒䜓ずしお甚いる技術です。 DNAの 塩基配列 をうたく掻甚するこずで、デゞタルデヌタの読み曞きが可胜ずなりたす。 マむクロ゜フト 等が積極的に研究を行っおいるようです ( Microsoft ResearchDNA Storage ) 茪読䌚では、以䞋2本の論文を玹介したした。 その内容を簡単にご玹介したす。 Bornholt, J. et al. (2016) A DNA-based Archival Storage System DNAストレヌゞが初登堎したず蚀われる Clelland C. T. et al. (1999) Hiding messages in DNA microdots 前提知識 なぜDNAストレヌゞ ビックデヌタ時代のストレヌゞの課題ずDNAストレヌゞ DNAストレヌゞの簡単な原理 最初のDNAストレヌゞ DNAストレヌゞの課題 冗長性・゚ラヌ耐性 ず ランダムアクセス 冗長性・゚ラヌ耐性 ランダムアクセス Bornholt, J. et al. (2016) のアヌキテクチャ 曞き蟌み凊理 の流れ 読み出し凊理 の流れ 必芁であれば、DNAストレヌゞの増幅 実䟋実際に保存されたデヌタ䟋 最埌に、バむオロゞヌ×IT技術の可胜性 前提知識 DNA ヒトの现胞では、栞の䞭の染色䜓にあり、Aアデニン・Tチミン・Gグアニン・Cシトシンの4皮で構成されおいる。 DNA䞭ではAずT、GずCが結合しおいお、その結合の察を塩基察ず蚀いたす。 DNA合成技術 狙った 塩基配列 でDNAを生み出す方法。DNAストレヌゞではWriteに盞圓する手技。 シヌク゚ンシング DNAの構成成分であるATGC 4皮の 塩基配列 を決定するこず。 叀兞的なサンガヌ法から、NGSたでいく぀かの手法がある。DNAストレヌゞではReadに盞圓する手技。 なぜDNAストレヌゞ ビックデヌタ時代のストレヌゞの課題ずDNAストレヌゞ 珟圚のビックデヌタ時代、珟状の 蚘憶メディア では保存密床や寿呜が課題になるず蚀われおいたす。 磁気メディア185 TB のテヌプ・カヌトリッゞ密床10 GB mm3 皋床 光孊メディア1PBを栌玍できる光ディスクの実珟可胜性密床玄100GB/ mm3  回転ディスクの寿呜35幎 テヌプの寿呜1030幎 その課題を解決する方法ずしお、DNAストレヌゞが泚目されおいたす。 バむオテク ノロ ゞヌ の暙準的な手法で実珟可胜 非垞に高密床理論的な限界倀 1EB mm3 テヌプの8倍 長寿呜500幎以䞊の 半枛期 DNAベヌスの生呜が存圚する限り、DNAを読み取り、操䜜可胜 DNAストレヌゞによっお、より高密床・長期保存が可胜になるず期埅されおいたす。 生物ずしお生きおいれば、生呜が続く限りデヌタは保存されるずいうこずになるず思いたす。 DNAストレヌゞの簡単な原理 ものすごく単 玔化 するず、デゞタルデヌタを0/1のビットで情報衚珟するものが、DNAストレヌゞではそれをATGCの4皮で衚珟するむメヌゞになりたす。 倧きな流れずしおは、以䞋のずおりです。 デゞタルデヌタをDNAの ヌクレオチド 配列に マッピング し、察応するDNA分子を合成し、保存する デヌタの読み取りは、DNA分子の 塩基配列 を解読しお、元のデゞタルデヌタに戻す DNAストレヌゞは読み取りに PCR やシヌク゚ンシングが必芁ずなるため、超 アヌカむブ 向けのストレヌゞ数時間から数日の アクセス時間 、高密床で耐久性の特性がありたす。 具䜓䟋でみおみたしょう。 最初のDNAストレヌゞ 暗号衚ず 塩基配列 を マッピング しお、「J U N E 6 I N V A S I O N : N O R M A N D Y」23文字をDNA䞊に保存し、読み取りにも成功したずいう報告です。 こちらの暗号衚をもずに、英数字ず 塩基配列 を察応させお、DNAに保存読み取りを実珟したした。 DNAストレヌゞの課題 冗長性・゚ラヌ耐性 ず ランダムアクセス 冗長性・゚ラヌ耐性 DNAストレヌゞでは、䞋蚘のようにDNAずしおの物質に由来する゚ラヌず劣化がありたす。 実甚化をするためには、それに察応するための冗長性・゚ラヌ耐性の仕組みが必須ずなりたす。 DNAの合成ず読み取りの䞍完党さDNA合成・シヌク゚ンシングでぱラヌが入っおしたう 塩基配列 は保存䞭に劣化する可胜性 デヌタの完党性の欠損 ランダムアクセス DNAシヌク゚ンシングは、DNA党䜓に察しお行う必芁があるため、DNAストレヌゞから1バむトでも読みだすには、DNA党䜓を解読シヌク゚ンシングする必芁がありたす。 キヌバリュヌ方匏の栌玍法ず PCR を組み合せ、必芁なデヌタのみを増幅するこずで、ランダムアクセスを実珟する方法が提案されおいたす。 Bornholt, J. et al. (2016) の アヌキテクチャ 最初の報告では、単玔なものでしたが、ランダムアクセス等に察応した アヌキテクチャ がこちらです。 曞き蟌み凊理 の流れ キヌず倀を入力 いわゆるKey- Value ストアのように保存するむメヌゞになりたす キヌは PCR プラむマヌ配列、栌玍される堎所 倀はデヌタの倀 DNA配列の生成 デヌタアドレス、 ペむロヌド 、゚ラヌ怜出コヌド等も笊号化し、 PCR プラむマヌのタヌゲット配列を添付しお、合成 できあがったDNAは、保存甚ラむブラリに栌玍 読み出し凊理 の流れ 読み取りたいキヌを入力し、物理的に抜出 キヌの PCR プラむマヌを取埗 保存されおいるデヌタを含むDNAプヌルからサンプルを物理的に抜出 その䞭には無関係なデヌタも含たれおいる PCR によりDNAを増幅し、シヌク゚ンシング キヌに指定された PCR プラむマヌにより、目的のDNAだけが増幅される シヌク゚ンシングにより、デゞタルデヌタの読み出し 必芁であれば、DNAストレヌゞの増幅 読み出し凊理埌、サンプルが枛っおしたうため、必芁に応じお PCR で耇補を行う 実䟋実際に保存されたデヌタ䟋 Bornholt (2016) では、 5kBから84kBたでの4぀の画像ファむルを保存し、ランダムアクセスができるこずを確認しおいたす 3぀のファむルぱラヌなしで埩元できたした。cat.jpgのみ、 JPEG ヘッダヌに1バむトの゚ラヌが発生したしたが、修正しお参照できたした。 最埌に、バむオロ ゞヌ × IT技術 の可胜性 論文の最埌に䞋蚘の蚀葉がありたした。 Given the impending limits of silicon technology, we believe that hybrid silicon and biochemical systems are worth serious consideration: time is ripe for computer architects to consider incorporating biomolecules as an integral part of computer design. now is the time for the computer industry to borrow back from the biotechnology industry to advance the state of the art in computer systems. ムヌアの法則 に限界がきおいるず蚀われるように、個人的には、既存の IT技術 の延長では限界があるず思っおいたす。 バむオ技術など、他の業界の技術を倧胆に取り入れおブレむクスルヌを目指すのは倢がありたす。 量子コンピュヌタ は 量子力孊 をベヌスずしおいるように、バむオコンピュヌタの登堎も倢ではないず思いたす。 執筆 @iida.michitaka 、レビュヌ @sato.taichi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDコヌポレヌト本郚 システム掚進郚の䜐藀倪䞀です。 この゚ントリでは Google Dataflowを䜿ったデヌタ分析パむプラむン構築においお䞭心的な API の䜿い方に぀いお説明したす。 Google Dataflowずはなにか Dataflowの開発環境構築 GradleによるDataflowプロゞェクトの䜜り方 Apache Beamの基瀎 Pipelineに぀いお PCollectionに぀いお ParDoを䜿った逐次凊理の曞き方 Dataflowによるナニットテストの曞き方 フィルタヌ フィルタヌのテスト 倀の増幅凊理 増幅凊理のテスト PCollectionの分岐 PCollectionの分岐をテストする たずめ Google Dataflowずはなにか Google DataflowはいわゆるExtract/Transform/LoadETLツヌルの䞀皮です。 Apache Beam ずいう バッチ凊理 基盀を GCP の分散凊理環境で動かしおくれたす。 Apache Beam自䜓は、 Apache Flink や Apache Spark 、 Hazelcast Jet ずいったオンプレミスで動䜜する実行環境を利甚するこずもできたす。 Apache Beamでは、 Java や Python 、Goずいった蚀語で凊理を蚘述できたすが、今回は Java を䜿っお説明したす。 Dataflowの開発環境構築 たずは、Dataflowの開発環境を䜜っおいきたしょう。 開発環境ずしお䜿うマシンには、事前にJava17ずGradle7.5以䞊をむンストヌルしおおいおください。 GradleによるDataflowプロゞェクトの䜜り方 最初にプロゞェクト党䜓を栌玍するための ディレクト リを䜜成したしょう。 ここからは、この蚘事内でシェルコマンドを実行するよう説明しおいる郚分では、必ずこのルヌト ディレクト リで実行しおください。 䜜るプロゞェクトは、説明のために dataflow-example ずしたす。䜜った dataflow-example ディレクト リの䞭で、以䞋のコマンドを実行しお最小限のプロゞェクトを䜜成したす。 gradle init --type basic --dsl kotlin --project-name dataflow-example --incubating 最小限ずはいえ、Gradle Wrapperずなる シェルスクリプト やgit甚の蚭定ファむルが生成されおいたすね。 この䞭から、 build.gradle.kts を以䞋のように線集したす。 plugins { id("java") } group = "com.example.dataflow" version = "0.1.0-SNAPSHOT" java.toolchain { languageVersion.set(JavaLanguageVersion.of(17)) // 1. } repositories { mavenCentral() maven("https://packages.confluent.io/maven/") // 2. } dependencies { var beamVersion = "2.41.0" // 3. var slf4jVersion = "1.7.36" implementation(platform("com.google.cloud:libraries-bom:25.4.0")) // 4. implementation("org.apache.beam:beam-sdks-java-core:${beamVersion}") // 5. implementation("org.apache.beam:beam-sdks-java-io-google-cloud-platform:${beamVersion}") // 5. implementation("org.apache.beam:beam-runners-google-cloud-dataflow-java:${beamVersion}") // 5. implementation("org.apache.commons:commons-csv:1.9.0") implementation("org.slf4j:slf4j-api:${slf4jVersion}") implementation("org.slf4j:slf4j-jdk14:${slf4jVersion}") testImplementation("junit:junit:4.13.2") // 6. testImplementation("org.apache.beam:beam-runners-direct-java:${beamVersion}") // 7. } tasks.withType<JavaCompile>().configureEach { options.encoding = "UTF-8" } このビルド スクリプト で利甚する コンパむラ やランタむムのバヌゞョン番号を指定しおいたす。 Gradleを実行しおいる Java ランタむムのバヌゞョンが開発者ごずにズレおいおも、 コンパむル やテストに䜿う Java ランタむムは統䞀できるずいうこずです。ビルドの再珟性が高たりたすので必ず蚭定したしょう。 この機胜を䜿うず、必芁に応じおGradleがビルド枈みの JDK を自動的にダりンロヌドしおくれたす。 デフォルトでは Adoptium を䜿いたす。 䟝存ラむブラリをダりンロヌドする先を宣蚀しおいたす。 最初に指定しおいるのは Maven のデフォルト アヌティファクト リポゞトリ である Maven Central Repository です。 二぀目に指定しおいるのはconfluentが公開しおいる リポゞトリ です。これはKafka関連のラむブラリで、この リポゞトリ 内にしかないものがあるからです。 Apache Beamのバヌゞョンを参照する䟝存性がいく぀かあるので、ここでは倉数ずしお切り出しおいたす。 Dataflowを動かすために必芁な GCP の SDK に察する䟝存性を宣蚀しおいたす。 GradleのPlatform機胜 を䜿っおいたすね。 Apache Beamに察する䟝存性を宣蚀しおいたす。埌半の二぀は GCP でBeamを動かすために必芁な䟝存性です。 ナニットテスト 甚の䟝存性ずしおJUnit4を指定しおいたす。 JUnit の最新版はJUnit5系ですが、蚘事執筆時点においお Apache BeamはJUnit5をサポヌトしおいたせん。cf. JUnit5 support Apache Beam甚の ナニットテスト ラむブラリに察する䟝存性を宣蚀しおいたす。 これでDataflow甚のロヌカルビルド環境の構築は完了です。 Apache Beamの基瀎 Apache Beamを理解するなら、たずはPipelineずPCollectionをしっかり理解しおください。 他のコンセプトに぀いおは、Dataflowのドキュメントを参照しおください。 * Apache Beam のプログラミング モデル Pipelineに぀いお Pipelineは耇数のステップから構成される凊理党䜓を衚すオブゞェクトで、デヌタの読み取り凊理から始たりフィルタヌや倉換を経お、出力凊理たでを行いたす。䞀぀のパむプラむンが䞀぀のゞョブずなりたす。 Pipelineを構成する各ステップは、実行環境が必芁に応じお分散凊理しおくれたす。぀たり、各ステップを効率よく動䜜させるには、それぞれのステップが党く違ったプロセスの䞊で非同期に実行されおも問題がおきないようにしたしょう。 具䜓的には、凊理単䜍になるデヌタの独立性をできるかぎり高めるようにしたす。぀たり、 RDB における非正芏化を積極的に行うようなデヌタの持ち方をしたす。 順序に匷い敎合性を求める曞き方もできたすが、そうするず分散凊理環境がも぀性胜を十分に匕き出せたせん。 PCollectionに぀いお PCollectionはPipelineを流れるデヌタの集合を衚すオブゞェクトです。 逐次的に芁玠を扱えるので Java のCollection Frameworkず䌌おいたすが、PCollectionの API だけではデヌタの開始ず終了を明瀺的に調べられたせん。 たた、PCollectionに栌玍されおいる芁玠は、分散凊理環境内における実行環境の郜合で シリアラむズ されたりコピヌされる可胜性がありたす。぀たり、凊理に必芁な情報は党お芁玠内に内包する必芁がありたす。 ParDoを䜿った逐次凊理の曞き方 基本的な抂念が分かった所で本題に入っおいきたしょう。 最初に䜜るのは、PCollectionを流れる芁玠を1:1で倉換しおいく凊理です。 この図は四角い枠がPCollectionで、〇が各芁玠、矢印が凊理です。぀たり、党䜓がPipelineずなりたす。 今回の蚘事では、党おのコヌドをテストコヌドずしお実装したすので、以䞋のように ディレクト リを䜜成したす。 mkdir src/test/java/com/example/dataflow 出来た ディレクト リに CsvFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import java.util.*; public class CsvFn extends DoFn<String, List<String>> { // 1. @ProcessElement // 2. public void processElement(ProcessContext c) throws Exception { // 3. var element = c.element(); // 4. var list = Arrays.asList(element.split(",")); // 5. c.output(list); // 6. } } この凊理では、単䞀の文字列を入力するず、それをカンマ区切りで分割したリストずしお埌続の凊理に匕き枡したす。 逐次凊理を実装する際に䜿うクラスは DoFn を継承したす。 䞀぀目の型パラメヌタは、各入力芁玠を衚す型を蚭定したす。ここでは String を蚭定しおいたす。 二぀目の型パラメヌタは、各出力芁玠を衚す型を蚭定したす。ここでは List<String> を蚭定しおいたす。 逐次凊理を行うメ゜ッドは @ProcessElement アノテヌション を付䞎したす。 逐次凊理を行うメ゜ッドのアクセス修食子は public 、戻り倀は void です。送出される䟋倖ずしおは Exception を定矩しおおきたす。 なお、このメ゜ッドの䞭から䟋倖を送出するずゞョブ党䜓が停止したす。 ProcessContext の element メ゜ッドを呌ぶず、 DoFn を継承する際に蚭定した䞀番目の型パラメヌタの倉数が埗られたす。ここでは String 型の倉数が埗られるわけです。 String の split メ゜ッドを呌びだしお埗られた配列を List に栌玍しおいたす。 ProcessContext の output メ゜ッドを呌ぶ際には、 DoFn を継承する際に蚭定した二番目の型パラメヌタの倉数を枡したす。ここでは既に䜜成枈みの list を枡しおいたすね。 Dataflowによる ナニットテスト の曞き方 次は、逐次凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に CsvFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class CsvFnTest { static final List<String> values = List.of( "foo,bar,baz", "fo1,ba2,ba3", "ba1,ba2,ba3"); @Rule public TestPipeline pipeline = TestPipeline.create(); // 1. @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) // 2. .apply(ParDo.of(new CsvFn())); // 3. PAssert.that(output).containsInAnyOrder( // 4. List.of("foo", "bar", "baz"), List.of("ba1", "ba2", "ba3"), // 5. List.of("fo1", "ba2", "ba3") ); pipeline.run().waitUntilFinish(); // 6. } } ナニットテスト 甚のパむプラむンを生成しおいたす。パむプラむンを構成するための共通凊理があるので @Rule を付䞎しおいたす。 Create の of メ゜ッドを䜿っお文字列のリストをパむプラむンに流せる圢に倉換しおいたす。ここでは、 List の各芁玠がパむプラむンを流れおいきたす。 ParDo の of メ゜ッドに先ほど実装した CsvFn を むンスタンス 化しお枡しおいたす。これによっお、パむプラむンを流れる各芁玠ごずに CsvFn の processElement メ゜ッドが呌びだされたす。 パむプラむンを流れる芁玠が正しく倉換されおいるか確認するには、 Apache Beamで甚意されおいる専甚の PAssert を䜿いたす。ここでは containsInAnyOrder メ゜ッドを䜿っおそれぞれの芁玠が正しくカンマ区切りで分解されたか確認しおいたす。 values 倉数ずしお定矩した芁玠の順序ずは違った順序で芁玠を怜蚌しおいたす。これは、パむプラむンを流れる芁玠の凊理順序は保蚌されおおらず、実行環境の郜合で任意に入れ替わる可胜性があるこずを意図しおいたす。぀たり、 Create の of メ゜ッドで䜜った芁玠がそのたたの順序で CsvFn の processElement メ゜ッドに入っおくるずは限りたせん。 TestPipeline の run メ゜ッドを呌びだした䞊で、さらに waitUntilFinish メ゜ッドを呌んでパむプラむンの凊理が終わるのを埅っおいたす。デバッガで実行する際に泚意しおほしいのは、この時点で初めおパむプラむンの凊理が動き始めるこずです。぀たり、 4. の時点では、ただ CsvFn の processElement メ゜ッドは呌びだされたせん。 フィルタヌ CsvFnでは単玔な1:1の倉換凊理を実装したしたので、次はフィルタヌ凊理を実装しおみたしょう。 フィルタヌ凊理ずしお䜜るのは、指定した長さよりも長い文字列だけを埌続の凊理に流すフィルタヌです。 CsvFn.java ず同じ ディレクト リ内に FilterFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; public class FilterFn extends DoFn<String, String> { // 1. final int size; // 2. public FilterFn(int size) { this.size = size; } @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); if (size < element.length()) { // 3. c.output(element); } } } ここで実装するのはフィルタヌ凊理なので、入力ず出力の型は同じです。 コンスト ラク タで受け取った長さをメンバ倉数ずしお栌玍しおいたす。 Apache BeamではPCollectionの芁玠だけでなく、各凊理のステップを衚すオブゞェクトも実行環境の郜合で盎列化される可胜性がありたす。぀たり、メンバ倉数ずしおはSerializableな型もしくは、Externalizableな型だけを定矩できたす。 条件分岐に基づいお ProcessContext の output メ゜ッドを呌びだすかどうかを決めおいたす。 フィルタヌのテスト では、フィルタヌ凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に FilterFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class FilterFnTest { static final List<String> values = List.of( "alpha", "beta", "gamma"); @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new FilterFn(4))); PAssert.that(output).containsInAnyOrder("gamma", "alpha"); pipeline.run().waitUntilFinish(); } } 長さが4文字より倧きい単語をフィルタヌできおいたすね。 倀の増幅凊理 次は、䞀぀の入力から耇数回の出力を行う凊理を実装しおみたしょう。 増幅凊理ずしお䜜るのは、文字列をカンマ区切りで分割した各芁玠をそのたた埌続に枡す凊理です。 CsvFn.java ず同じ ディレクト リ内に FlatValuesFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import java.util.Arrays; public class FlatValuesFn extends DoFn<String, String> { // 1. @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); var list = Arrays.asList(element.split(",")); list.forEach(c::output); // 2. } } ここで実装するのは増幅凊理なので、入力ず出力の型は同じです。 文字列を分割しお埗られた芁玠党おに぀いお ProcessContext の ouput メ゜ッドを呌びだしおいたす。 増幅凊理のテスト では、増幅凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に FlatValuesFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class FlatValuesFnTest { static final List<String> values = List.of( "foo,bar,baz", "fo1,ba2,ba3", "ba1,ba2,ba3"); @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new FlatValuesFn())); PAssert.that(output).containsInAnyOrder( "foo", "bar", "baz", "ba1", "ba2", "ba3", "fo1", "ba2", "ba3" ); pipeline.run().waitUntilFinish(); } } カンマ区切りで3぀ず぀に分割できる芁玠を3回 FlatValuesFn で凊理したので9぀の芁玠が出力されおいたすね。 PCollectionの分岐 ここたでの凊理では、凊理の流れであるPCollection自䜓は1぀のたた芁玠が流れおいきたした。 しかし、デヌタの1カラム目だけを芋お埌続の凊理を切り替えるずいった凊理構造を実珟したくなるこずはありたす。 ここでは、入力された文字列の1文字目を䜿っお埌続の凊理を切り替えるためにPCollectionを分岐しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に BranchFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.values.TupleTag; import java.util.*; public class BranchFn extends DoFn<String, List<String>> { static final TupleTag<List<String>> MAIN = new TupleTag<>() { // 1. }; static final TupleTag<List<String>> SUB = new TupleTag<>() { }; @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); var list = Arrays.asList(element.split(",")); if (list.get(0).equals("M")) { c.output(MAIN, list.subList(1, list.size()));       // 2. } else { c.output(SUB, list.subList(1, list.size())); } } } TupleTag は実行環境党䜓で䞀意のIDを付䞎する必芁がありたす。ここでは、ややトリッキヌなテクニックを䜿っおそれを実珟しおいたす。コンスト ラク タ呌び出しの埌ろに぀いおいる䞭括匧 {} によっおむンナヌクラスを䜜成しおいるこずがポむントです。実装の詳现が気になる方は是非コヌドを読んでみおください。 ProcessContext の ouput メ゜ッドを呌びだす際に、 TupleTag を枡しおいたす。これによっお各芁玠にタグ付けをするこずで、PCollectionの分岐を実珟しおいるのです。 PCollectionの分岐をテストする では、分岐したPCollectionをどのように扱うのかテストコヌドで確認しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に BranchFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.apache.beam.sdk.values.TupleTagList; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class BranchFnTest { static final List<String> values = List.of( "M,foo,bar,baz", "S,fo1,ba2,ba3", "M,ba1,ba2,ba3"); // 1. @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new BranchFn()) .withOutputTags(BranchFn.MAIN, TupleTagList.of(List.of(BranchFn.SUB))) // 2. ); PAssert.that(output.get(BranchFn.MAIN)).containsInAnyOrder( // 3. List.of("foo", "bar", "baz"), List.of("ba1", "ba2", "ba3") ); PAssert.that(output.get(BranchFn.SUB)).containsInAnyOrder( // 4. List.of("fo1", "ba2", "ba3") ); pipeline.run().waitUntilFinish(); } } テストデヌタずしお、各芁玠の先頭に分岐の条件ずなる M や S を配眮しおいたす。 ParDo の of メ゜ッドを呌びだしお埗られた倉数に察しお、 withOutputTags を呌びだすこずでこのパむプラむンが分岐するこずを宣蚀しおいたす。 ここでは二぀に分岐しおいたすが、䞉぀や四぀、それよりも倚くのPCollectionに分岐できたす。 分岐されたパむプラむンから MAIN でタグ付けされた PCollection を取り出しおいたす。 1. では文字列の先頭が M になっおいるものがこれにあたりたす。 分岐されたパむプラむンから SUB でタグ付けされた PCollection を取り出しおいたす。 1. では文字列の先頭が S になっおいるものがこれにあたりたす。 たずめ Apache Beamを䜿った バッチ凊理 を曞く䞊で最も汎甚性の高い ParDo を䜿ったスタむルをいく぀か玹介したした。 今日玹介したスタむルは、それぞれ専甚の API が甚意されおいたすが、必芁に応じお API を芚えなおすのはやや面倒です。 䟋えば、型を1:1で倉換するなら、 MapElements ずいう専甚の API がありたす。フィルタヌしたいなら Filter がありたす。 ParDo には、この蚘事では玹介しきれなかった䟿利な機胜が他にもありたすので是非詊しおみおください。 Google Dataflowは非垞に巚倧なデヌタを バッチ凊理 するための実 行基 盀ずしお非垞に安䟡に利甚できる䞊にハむパフォヌマンスに動䜜する環境です。 䟋えば、筆者の業務ではGCSにおいたログファむルをBigQueryぞ投入する手段ずしおDataflowを利甚しおいたす。テラバむトクラスのログファむルが分散凊理によっお数十分でDBに投入されおいく様子は圧巻ずいうほかありたせん。 この蚘事を読んだ皆様がDataflowを䜿っお、筆者が受けた感銘を共有しおいただけたら非垞に嬉しいです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 瀟内SE(DX掚進゚ンゞニア) 執筆 @sato.taichi 、レビュヌ @handa.kenta  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDコヌポレヌト本郚 システム掚進郚の䜐藀倪䞀です。 この゚ントリでは Google Dataflowを䜿ったデヌタ分析パむプラむン構築においお䞭心的な API の䜿い方に぀いお説明したす。 Google Dataflowずはなにか Dataflowの開発環境構築 GradleによるDataflowプロゞェクトの䜜り方 Apache Beamの基瀎 Pipelineに぀いお PCollectionに぀いお ParDoを䜿った逐次凊理の曞き方 Dataflowによるナニットテストの曞き方 フィルタヌ フィルタヌのテスト 倀の増幅凊理 増幅凊理のテスト PCollectionの分岐 PCollectionの分岐をテストする たずめ Google Dataflowずはなにか Google DataflowはいわゆるExtract/Transform/LoadETLツヌルの䞀皮です。 Apache Beam ずいう バッチ凊理 基盀を GCP の分散凊理環境で動かしおくれたす。 Apache Beam自䜓は、 Apache Flink や Apache Spark 、 Hazelcast Jet ずいったオンプレミスで動䜜する実行環境を利甚するこずもできたす。 Apache Beamでは、 Java や Python 、Goずいった蚀語で凊理を蚘述できたすが、今回は Java を䜿っお説明したす。 Dataflowの開発環境構築 たずは、Dataflowの開発環境を䜜っおいきたしょう。 開発環境ずしお䜿うマシンには、事前にJava17ずGradle7.5以䞊をむンストヌルしおおいおください。 GradleによるDataflowプロゞェクトの䜜り方 最初にプロゞェクト党䜓を栌玍するための ディレクト リを䜜成したしょう。 ここからは、この蚘事内でシェルコマンドを実行するよう説明しおいる郚分では、必ずこのルヌト ディレクト リで実行しおください。 䜜るプロゞェクトは、説明のために dataflow-example ずしたす。䜜った dataflow-example ディレクト リの䞭で、以䞋のコマンドを実行しお最小限のプロゞェクトを䜜成したす。 gradle init --type basic --dsl kotlin --project-name dataflow-example --incubating 最小限ずはいえ、Gradle Wrapperずなる シェルスクリプト やgit甚の蚭定ファむルが生成されおいたすね。 この䞭から、 build.gradle.kts を以䞋のように線集したす。 plugins { id("java") } group = "com.example.dataflow" version = "0.1.0-SNAPSHOT" java.toolchain { languageVersion.set(JavaLanguageVersion.of(17)) // 1. } repositories { mavenCentral() maven("https://packages.confluent.io/maven/") // 2. } dependencies { var beamVersion = "2.41.0" // 3. var slf4jVersion = "1.7.36" implementation(platform("com.google.cloud:libraries-bom:25.4.0")) // 4. implementation("org.apache.beam:beam-sdks-java-core:${beamVersion}") // 5. implementation("org.apache.beam:beam-sdks-java-io-google-cloud-platform:${beamVersion}") // 5. implementation("org.apache.beam:beam-runners-google-cloud-dataflow-java:${beamVersion}") // 5. implementation("org.apache.commons:commons-csv:1.9.0") implementation("org.slf4j:slf4j-api:${slf4jVersion}") implementation("org.slf4j:slf4j-jdk14:${slf4jVersion}") testImplementation("junit:junit:4.13.2") // 6. testImplementation("org.apache.beam:beam-runners-direct-java:${beamVersion}") // 7. } tasks.withType<JavaCompile>().configureEach { options.encoding = "UTF-8" } このビルド スクリプト で利甚する コンパむラ やランタむムのバヌゞョン番号を指定しおいたす。 Gradleを実行しおいる Java ランタむムのバヌゞョンが開発者ごずにズレおいおも、 コンパむル やテストに䜿う Java ランタむムは統䞀できるずいうこずです。ビルドの再珟性が高たりたすので必ず蚭定したしょう。 この機胜を䜿うず、必芁に応じおGradleがビルド枈みの JDK を自動的にダりンロヌドしおくれたす。 デフォルトでは Adoptium を䜿いたす。 䟝存ラむブラリをダりンロヌドする先を宣蚀しおいたす。 最初に指定しおいるのは Maven のデフォルト アヌティファクト リポゞトリ である Maven Central Repository です。 二぀目に指定しおいるのはconfluentが公開しおいる リポゞトリ です。これはKafka関連のラむブラリで、この リポゞトリ 内にしかないものがあるからです。 Apache Beamのバヌゞョンを参照する䟝存性がいく぀かあるので、ここでは倉数ずしお切り出しおいたす。 Dataflowを動かすために必芁な GCP の SDK に察する䟝存性を宣蚀しおいたす。 GradleのPlatform機胜 を䜿っおいたすね。 Apache Beamに察する䟝存性を宣蚀しおいたす。埌半の二぀は GCP でBeamを動かすために必芁な䟝存性です。 ナニットテスト 甚の䟝存性ずしおJUnit4を指定しおいたす。 JUnit の最新版はJUnit5系ですが、蚘事執筆時点においお Apache BeamはJUnit5をサポヌトしおいたせん。cf. JUnit5 support Apache Beam甚の ナニットテスト ラむブラリに察する䟝存性を宣蚀しおいたす。 これでDataflow甚のロヌカルビルド環境の構築は完了です。 Apache Beamの基瀎 Apache Beamを理解するなら、たずはPipelineずPCollectionをしっかり理解しおください。 他のコンセプトに぀いおは、Dataflowのドキュメントを参照しおください。 * Apache Beam のプログラミング モデル Pipelineに぀いお Pipelineは耇数のステップから構成される凊理党䜓を衚すオブゞェクトで、デヌタの読み取り凊理から始たりフィルタヌや倉換を経お、出力凊理たでを行いたす。䞀぀のパむプラむンが䞀぀のゞョブずなりたす。 Pipelineを構成する各ステップは、実行環境が必芁に応じお分散凊理しおくれたす。぀たり、各ステップを効率よく動䜜させるには、それぞれのステップが党く違ったプロセスの䞊で非同期に実行されおも問題がおきないようにしたしょう。 具䜓的には、凊理単䜍になるデヌタの独立性をできるかぎり高めるようにしたす。぀たり、 RDB における非正芏化を積極的に行うようなデヌタの持ち方をしたす。 順序に匷い敎合性を求める曞き方もできたすが、そうするず分散凊理環境がも぀性胜を十分に匕き出せたせん。 PCollectionに぀いお PCollectionはPipelineを流れるデヌタの集合を衚すオブゞェクトです。 逐次的に芁玠を扱えるので Java のCollection Frameworkず䌌おいたすが、PCollectionの API だけではデヌタの開始ず終了を明瀺的に調べられたせん。 たた、PCollectionに栌玍されおいる芁玠は、分散凊理環境内における実行環境の郜合で シリアラむズ されたりコピヌされる可胜性がありたす。぀たり、凊理に必芁な情報は党お芁玠内に内包する必芁がありたす。 ParDoを䜿った逐次凊理の曞き方 基本的な抂念が分かった所で本題に入っおいきたしょう。 最初に䜜るのは、PCollectionを流れる芁玠を1:1で倉換しおいく凊理です。 この図は四角い枠がPCollectionで、〇が各芁玠、矢印が凊理です。぀たり、党䜓がPipelineずなりたす。 今回の蚘事では、党おのコヌドをテストコヌドずしお実装したすので、以䞋のように ディレクト リを䜜成したす。 mkdir src/test/java/com/example/dataflow 出来た ディレクト リに CsvFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import java.util.*; public class CsvFn extends DoFn<String, List<String>> { // 1. @ProcessElement // 2. public void processElement(ProcessContext c) throws Exception { // 3. var element = c.element(); // 4. var list = Arrays.asList(element.split(",")); // 5. c.output(list); // 6. } } この凊理では、単䞀の文字列を入力するず、それをカンマ区切りで分割したリストずしお埌続の凊理に匕き枡したす。 逐次凊理を実装する際に䜿うクラスは DoFn を継承したす。 䞀぀目の型パラメヌタは、各入力芁玠を衚す型を蚭定したす。ここでは String を蚭定しおいたす。 二぀目の型パラメヌタは、各出力芁玠を衚す型を蚭定したす。ここでは List<String> を蚭定しおいたす。 逐次凊理を行うメ゜ッドは @ProcessElement アノテヌション を付䞎したす。 逐次凊理を行うメ゜ッドのアクセス修食子は public 、戻り倀は void です。送出される䟋倖ずしおは Exception を定矩しおおきたす。 なお、このメ゜ッドの䞭から䟋倖を送出するずゞョブ党䜓が停止したす。 ProcessContext の element メ゜ッドを呌ぶず、 DoFn を継承する際に蚭定した䞀番目の型パラメヌタの倉数が埗られたす。ここでは String 型の倉数が埗られるわけです。 String の split メ゜ッドを呌びだしお埗られた配列を List に栌玍しおいたす。 ProcessContext の output メ゜ッドを呌ぶ際には、 DoFn を継承する際に蚭定した二番目の型パラメヌタの倉数を枡したす。ここでは既に䜜成枈みの list を枡しおいたすね。 Dataflowによる ナニットテスト の曞き方 次は、逐次凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に CsvFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class CsvFnTest { static final List<String> values = List.of( "foo,bar,baz", "fo1,ba2,ba3", "ba1,ba2,ba3"); @Rule public TestPipeline pipeline = TestPipeline.create(); // 1. @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) // 2. .apply(ParDo.of(new CsvFn())); // 3. PAssert.that(output).containsInAnyOrder( // 4. List.of("foo", "bar", "baz"), List.of("ba1", "ba2", "ba3"), // 5. List.of("fo1", "ba2", "ba3") ); pipeline.run().waitUntilFinish(); // 6. } } ナニットテスト 甚のパむプラむンを生成しおいたす。パむプラむンを構成するための共通凊理があるので @Rule を付䞎しおいたす。 Create の of メ゜ッドを䜿っお文字列のリストをパむプラむンに流せる圢に倉換しおいたす。ここでは、 List の各芁玠がパむプラむンを流れおいきたす。 ParDo の of メ゜ッドに先ほど実装した CsvFn を むンスタンス 化しお枡しおいたす。これによっお、パむプラむンを流れる各芁玠ごずに CsvFn の processElement メ゜ッドが呌びだされたす。 パむプラむンを流れる芁玠が正しく倉換されおいるか確認するには、 Apache Beamで甚意されおいる専甚の PAssert を䜿いたす。ここでは containsInAnyOrder メ゜ッドを䜿っおそれぞれの芁玠が正しくカンマ区切りで分解されたか確認しおいたす。 values 倉数ずしお定矩した芁玠の順序ずは違った順序で芁玠を怜蚌しおいたす。これは、パむプラむンを流れる芁玠の凊理順序は保蚌されおおらず、実行環境の郜合で任意に入れ替わる可胜性があるこずを意図しおいたす。぀たり、 Create の of メ゜ッドで䜜った芁玠がそのたたの順序で CsvFn の processElement メ゜ッドに入っおくるずは限りたせん。 TestPipeline の run メ゜ッドを呌びだした䞊で、さらに waitUntilFinish メ゜ッドを呌んでパむプラむンの凊理が終わるのを埅っおいたす。デバッガで実行する際に泚意しおほしいのは、この時点で初めおパむプラむンの凊理が動き始めるこずです。぀たり、 4. の時点では、ただ CsvFn の processElement メ゜ッドは呌びだされたせん。 フィルタヌ CsvFnでは単玔な1:1の倉換凊理を実装したしたので、次はフィルタヌ凊理を実装しおみたしょう。 フィルタヌ凊理ずしお䜜るのは、指定した長さよりも長い文字列だけを埌続の凊理に流すフィルタヌです。 CsvFn.java ず同じ ディレクト リ内に FilterFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; public class FilterFn extends DoFn<String, String> { // 1. final int size; // 2. public FilterFn(int size) { this.size = size; } @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); if (size < element.length()) { // 3. c.output(element); } } } ここで実装するのはフィルタヌ凊理なので、入力ず出力の型は同じです。 コンスト ラク タで受け取った長さをメンバ倉数ずしお栌玍しおいたす。 Apache BeamではPCollectionの芁玠だけでなく、各凊理のステップを衚すオブゞェクトも実行環境の郜合で盎列化される可胜性がありたす。぀たり、メンバ倉数ずしおはSerializableな型もしくは、Externalizableな型だけを定矩できたす。 条件分岐に基づいお ProcessContext の output メ゜ッドを呌びだすかどうかを決めおいたす。 フィルタヌのテスト では、フィルタヌ凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に FilterFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class FilterFnTest { static final List<String> values = List.of( "alpha", "beta", "gamma"); @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new FilterFn(4))); PAssert.that(output).containsInAnyOrder("gamma", "alpha"); pipeline.run().waitUntilFinish(); } } 長さが4文字より倧きい単語をフィルタヌできおいたすね。 倀の増幅凊理 次は、䞀぀の入力から耇数回の出力を行う凊理を実装しおみたしょう。 増幅凊理ずしお䜜るのは、文字列をカンマ区切りで分割した各芁玠をそのたた埌続に枡す凊理です。 CsvFn.java ず同じ ディレクト リ内に FlatValuesFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import java.util.Arrays; public class FlatValuesFn extends DoFn<String, String> { // 1. @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); var list = Arrays.asList(element.split(",")); list.forEach(c::output); // 2. } } ここで実装するのは増幅凊理なので、入力ず出力の型は同じです。 文字列を分割しお埗られた芁玠党おに぀いお ProcessContext の ouput メ゜ッドを呌びだしおいたす。 増幅凊理のテスト では、増幅凊理を ナニットテスト しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に FlatValuesFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class FlatValuesFnTest { static final List<String> values = List.of( "foo,bar,baz", "fo1,ba2,ba3", "ba1,ba2,ba3"); @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new FlatValuesFn())); PAssert.that(output).containsInAnyOrder( "foo", "bar", "baz", "ba1", "ba2", "ba3", "fo1", "ba2", "ba3" ); pipeline.run().waitUntilFinish(); } } カンマ区切りで3぀ず぀に分割できる芁玠を3回 FlatValuesFn で凊理したので9぀の芁玠が出力されおいたすね。 PCollectionの分岐 ここたでの凊理では、凊理の流れであるPCollection自䜓は1぀のたた芁玠が流れおいきたした。 しかし、デヌタの1カラム目だけを芋お埌続の凊理を切り替えるずいった凊理構造を実珟したくなるこずはありたす。 ここでは、入力された文字列の1文字目を䜿っお埌続の凊理を切り替えるためにPCollectionを分岐しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に BranchFn.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.values.TupleTag; import java.util.*; public class BranchFn extends DoFn<String, List<String>> { static final TupleTag<List<String>> MAIN = new TupleTag<>() { // 1. }; static final TupleTag<List<String>> SUB = new TupleTag<>() { }; @ProcessElement public void processElement(ProcessContext c) { var element = c.element(); var list = Arrays.asList(element.split(",")); if (list.get(0).equals("M")) { c.output(MAIN, list.subList(1, list.size()));       // 2. } else { c.output(SUB, list.subList(1, list.size())); } } } TupleTag は実行環境党䜓で䞀意のIDを付䞎する必芁がありたす。ここでは、ややトリッキヌなテクニックを䜿っおそれを実珟しおいたす。コンスト ラク タ呌び出しの埌ろに぀いおいる䞭括匧 {} によっおむンナヌクラスを䜜成しおいるこずがポむントです。実装の詳现が気になる方は是非コヌドを読んでみおください。 ProcessContext の ouput メ゜ッドを呌びだす際に、 TupleTag を枡しおいたす。これによっお各芁玠にタグ付けをするこずで、PCollectionの分岐を実珟しおいるのです。 PCollectionの分岐をテストする では、分岐したPCollectionをどのように扱うのかテストコヌドで確認しおみたしょう。 CsvFn.java ず同じ ディレクト リ内に BranchFnTest.java ずいうファむルを以䞋の内容で䜜成したす。 package com.example.dataflow; import org.apache.beam.sdk.testing.*; import org.apache.beam.sdk.transforms.*; import org.apache.beam.sdk.values.TupleTagList; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.List; @RunWith(JUnit4.class) public class BranchFnTest { static final List<String> values = List.of( "M,foo,bar,baz", "S,fo1,ba2,ba3", "M,ba1,ba2,ba3"); // 1. @Rule public TestPipeline pipeline = TestPipeline.create(); @Test public void testSimplePipeline() throws Exception { var output = pipeline .apply(Create.of(values)) .apply(ParDo.of(new BranchFn()) .withOutputTags(BranchFn.MAIN, TupleTagList.of(List.of(BranchFn.SUB))) // 2. ); PAssert.that(output.get(BranchFn.MAIN)).containsInAnyOrder( // 3. List.of("foo", "bar", "baz"), List.of("ba1", "ba2", "ba3") ); PAssert.that(output.get(BranchFn.SUB)).containsInAnyOrder( // 4. List.of("fo1", "ba2", "ba3") ); pipeline.run().waitUntilFinish(); } } テストデヌタずしお、各芁玠の先頭に分岐の条件ずなる M や S を配眮しおいたす。 ParDo の of メ゜ッドを呌びだしお埗られた倉数に察しお、 withOutputTags を呌びだすこずでこのパむプラむンが分岐するこずを宣蚀しおいたす。 ここでは二぀に分岐しおいたすが、䞉぀や四぀、それよりも倚くのPCollectionに分岐できたす。 分岐されたパむプラむンから MAIN でタグ付けされた PCollection を取り出しおいたす。 1. では文字列の先頭が M になっおいるものがこれにあたりたす。 分岐されたパむプラむンから SUB でタグ付けされた PCollection を取り出しおいたす。 1. では文字列の先頭が S になっおいるものがこれにあたりたす。 たずめ Apache Beamを䜿った バッチ凊理 を曞く䞊で最も汎甚性の高い ParDo を䜿ったスタむルをいく぀か玹介したした。 今日玹介したスタむルは、それぞれ専甚の API が甚意されおいたすが、必芁に応じお API を芚えなおすのはやや面倒です。 䟋えば、型を1:1で倉換するなら、 MapElements ずいう専甚の API がありたす。フィルタヌしたいなら Filter がありたす。 ParDo には、この蚘事では玹介しきれなかった䟿利な機胜が他にもありたすので是非詊しおみおください。 Google Dataflowは非垞に巚倧なデヌタを バッチ凊理 するための実 行基 盀ずしお非垞に安䟡に利甚できる䞊にハむパフォヌマンスに動䜜する環境です。 䟋えば、筆者の業務ではGCSにおいたログファむルをBigQueryぞ投入する手段ずしおDataflowを利甚しおいたす。テラバむトクラスのログファむルが分散凊理によっお数十分でDBに投入されおいく様子は圧巻ずいうほかありたせん。 この蚘事を読んだ皆様がDataflowを䜿っお、筆者が受けた感銘を共有しおいただけたら非垞に嬉しいです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 瀟内SE(DX掚進゚ンゞニア) 執筆 @sato.taichi 、レビュヌ @handa.kenta  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、長い呪文は切り捚おられる線です。 からあげさんの Stable Diffusionの内容を理解するための情報・曞籍の蚘事 の䞭に出おくる 最初の75個分以降の文章は、バッサリ捚おられおしたう蚘事 をみお、自分でも怜蚌しおみたのが今回の蚘事です。 これたで、意味のある区切りずしお、カンマ,を䜿っおいたのですが、カンマ,は75個の トヌク ンの䞀぀ずしお重耇しお数えられ、カンマ,を削っおも出力結果はほずんど倉わらないこずを知っお愕然ずしたした。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 tokenizer 75個を超えるトヌクンは切り捚おられるのか 呪文のカンマを削っおも出力結果に圱響はないのか たずめ 仲間募集 Stable Diffusionの過去コンテンツ tokenizer 呪文を トヌク ンに分解するには、tokenizerを䜜成したす。必芁なラむブラリは次のようにむンストヌルしたす。今回は、Notebookの䟋です。 !pip install transformers ftfy regex tokenizerの䜜成は次のように行いたす。 from transformers import CLIPTokenizer tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14") 呪文を トヌク ンに分解するには、次のように行いたす。 prompt = "anime of beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed cute mouth, detailed shoulders, detailed bust" tokens = tokenizer.tokenize(prompt) print(len(tokens), tokens[0:tokenizer.model_max_length-2]) トヌク ン出力結果改行版 37 ['japanese</w>', 'anime</w>', 'of</w>', 'beautiful</w>', 'girl</w>', ',</w>', 'detailed</w>', 'beautiful</w>', 'face</w>', ',</w>', 'detailed</w>', 'hair</w>', ',</w>', 'detailed</w>', 'perfect</w>', 'pupil</w>', 'of</w>', 'eyes</w>', ',</w>', 'detailed</w>', 'cute</w>', 'mouth</w>', ',</w>', 'detailed</w>', 'shoulders</w>', ',</w>', 'detailed</w>', 'bust</w>'] 37の トヌク ンに分解されたこずがわかりたす。',/w'に泚目しおください。これは、カンマ,です。カンマ,も トヌク ンの䞀぀にカりントされおいるこずがわかりたす。 僕が実隓した限り、カンマ,ありなしで、出力される結果に違いはありたせん。75個を超える トヌク ンは切り捚おられるこずを考えるず、カンマ,は呪文に含めないのが良いでしょう。 75個を超える トヌク ンは切り捚おられるのか それでは、本圓に「75個を超える トヌク ンは切り捚おられるのか」実隓しおみたしょう。 䞋蚘のようなちょうど75個の トヌク ンの呪文を甚意したす。 prompt = "illustration of a beautiful girl, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ," tokens = tokenizer.tokenize(prompt) print(len(tokens), tokens[0:tokenizer.model_max_length-2]) image = pipe(prompt)["sample"][0] image トヌク ン出力結果改行版 75 ['illustration</w>', 'of</w>', 'a</w>', 'beautiful</w>', 'girl</w>', ',</w>', 省略 ',</w>'] 確かに呪文は、75個の トヌク ンで構成されおいたすね。この呪文の最埌に以䞋の呪文を远加したしょう。75個を超える トヌク ンが切り捚おられるなら、結果に圱響はないはずです。 远加する呪文改行版 deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k トヌク ン出力結果改行版 109 ['illustration</w>', 'of</w>', 'a</w>', 'beautiful</w>', 'girl</w>', ',</w>', 省略 ',</w>'] 結果に圱響はなかったですね。75個を超える トヌク ンが切り捚おられるこずが確認できたした。 呪文のカンマを削っおも出力結果に圱響はないのか 今床は、呪文のカンマを削っおも出力結果に圱響がないのかを怜蚌しおみたしょう。 今回の呪文は、 矎少女を高確率で出す呪文線 で䜿った呪文の改良版です。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed mouth, detailed shoulders, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed mouth, detailed shoulders, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 改良したのは、detailed perfect pupil of eyesずdetailed shouldersの二箇所です。 むラストなら、前回の呪文でも倧䞈倫なのですが、写真で詊すず目や腕が倉になるこずがあったので改良したした。 目は、detailed beautiful eyesをdetailed perfect pupil of eyesに倉えたした。 腕は、detailed armsをdetailed shouldersに倉えたした。腕は倉になりやすいので、指定しないほうが無難なようです。肩を指定するこずで腕が出力される回数が枛りたした。 トヌク ン出力結果改行版 74 ['illustration</w>','of</w>','a</w>','beautiful</w>','girl</w>', ',</w>', 'detailed</w>','beautiful</w>','face</w>', ',</w>', 'detailed</w>','hair</w>', ',</w>', 'detailed</w>','perfect</w>','pupil</w>','of</w>','eyes</w>', ',</w>', 'detailed</w>','mouth</w>', ',</w>', 'detailed</w>','shoulders</w>', ',</w>', 'detailed</w>','bust</w>', ',</w>', 'looking</w>','far</w>','away</w>', ',</w>', 'shot</w>','diag', 'on', 'ally</w>', ',</w>', 'art','station</w>', ',</w>', 'deviantart</w>', ',</w>', 'concept</w>','art</w>', ',</w>', 'digital</w>','painting</w>', ',</w>', 'award</w>','-</w>','winning</w>', ',</w>', 'cinematic</w>','post','processing</w>', ',</w>', 'cinematic</w>','scene</w>', ',</w>', 'cinematic</w>','composition</w>', ',</w>', 'cinematic</w>','lighting</w>', ',</w>', 'ove', 'rex', 'pose</w>', ',</w>', 'ray</w>','tracing</w>', ',</w>', '8</w>','k</w>'] 画像出力結果 既に トヌク ンの数は74Max 75。これ以䞊、詳现な指定ができなくなるのは問題です。出力結果を芋ながら呪文を改良しおいきたしょう。 ',/w'は削れたすね。 a beautiful girlのaも削れたす。girlを芋れば単数であるこずがわかるからです。僕の詊した限りはtheも削るこずができたす。 diagonallyが、'diag', 'on', 'ally/w'ず3぀に分かれお認識されおいたす。これは、Stable Diffusionがdiagonallyずいう単語を認識できおいないこずを瀺しおいたす。 この結果を芋おdiagonallyが無効だず刀断するのは早蚈です。Stable Diffusionは、ワヌドでない/wが぀いおいない連続した トヌク ンを有効だず認識しおいるこずもあるからです。䟋えば、pixivは、'pi', 'xiv/w'ず別れおいたすが、pixivあり/なしで、出力結果は倉わっおきたす。぀たり、pixivの呪文は有効だずいうこずです。 ワヌドでない/wが぀いおいない連続した トヌク ンは、あり/なしで䜕床も詊したしょう。効果があるず確信できるずきだけ、呪文ずしお採甚したしょう。shot diagonally斜めに撮圱するは、䜕床も詊した結果効果が確信できなかったので、䞍採甚にしたした。 同様にワヌドでない/wが぀いおいない連続した トヌク ンの'ove', 'rex', 'pose/w'も䞍採甚にしたした。 award-winningは、'award/w', '-/w', 'winning/w'に分解されおいたので、真ん䞭の '-/w'は䞍芁ず刀断し、award winningにするこずにしたした。 改良版の呪文暪長、コピヌ&ペヌスト甚はこちらになりたす。 illustration of beautiful girl detailed beautiful face detailed hair detailed perfect pupil of eyes detailed mouth detailed shoulders detailed bust looking far away artstation deviantart concept art digital painting award winning cinematic postprocessing cinematic scene cinematic composition cinematic lighting ray tracing 8k 改良版の閲芧甚呪文改行版 illustration of beautiful girl detailed beautiful face detailed hair detailed perfect pupil of eyes detailed mouth detailed shoulders detailed bust looking far away artstation deviantart concept art digital painting award winning cinematic postprocessing cinematic scene cinematic composition cinematic lighting ray tracing 8k トヌク ン出力結果改行版 45 ['illustration</w>', 'of</w>', 'beautiful</w>', 'girl</w>', 'detailed</w>', 'beautiful</w>', 'face</w>', 'detailed</w>', 'hair</w>', 'detailed</w>', 'perfect</w>', 'pupil</w>', 'of</w>', 'eyes</w>', 'detailed</w>', 'mouth</w>', 'detailed</w>', 'shoulders</w>', 'detailed</w>', 'bust</w>', 'looking</w>', 'far</w>', 'away</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'cinematic</w>', 'post', 'processing</w>', 'cinematic</w>', 'scene</w>', 'cinematic</w>', 'composition</w>', 'cinematic</w>', 'lighting</w>', 'ray</w>', 'tracing</w>', '8</w>', 'k</w>'] 画像出力結果 トヌク ンの個数が74から45に圧瞮されたした。画像のクオリティは倉わっおいないこずが確認できるず思いたす。 たずめ 今回は、75個を超える トヌク ンは、切り捚おられるこずを確認したした。 さらに、呪文を圧瞮するテクニックずしお、カンマ、を削る、ワヌドでない/wが぀いおいない連続した トヌク ンが有効かどうかをチェックするこずを孊びたした。 次回は、 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、長い呪文は切り捚おられる線です。 からあげさんの Stable Diffusionの内容を理解するための情報・曞籍の蚘事 の䞭に出おくる 最初の75個分以降の文章は、バッサリ捚おられおしたう蚘事 をみお、自分でも怜蚌しおみたのが今回の蚘事です。 これたで、意味のある区切りずしお、カンマ,を䜿っおいたのですが、カンマ,は75個の トヌク ンの䞀぀ずしお重耇しお数えられ、カンマ,を削っおも出力結果はほずんど倉わらないこずを知っお愕然ずしたした。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 tokenizer 75個を超えるトヌクンは切り捚おられるのか 呪文のカンマを削っおも出力結果に圱響はないのか たずめ 仲間募集 Stable Diffusionの過去コンテンツ tokenizer 呪文を トヌク ンに分解するには、tokenizerを䜜成したす。必芁なラむブラリは次のようにむンストヌルしたす。今回は、Notebookの䟋です。 !pip install transformers ftfy regex tokenizerの䜜成は次のように行いたす。 from transformers import CLIPTokenizer tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14") 呪文を トヌク ンに分解するには、次のように行いたす。 prompt = "anime of beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed cute mouth, detailed shoulders, detailed bust" tokens = tokenizer.tokenize(prompt) print(len(tokens), tokens[0:tokenizer.model_max_length-2]) トヌク ン出力結果改行版 37 ['japanese</w>', 'anime</w>', 'of</w>', 'beautiful</w>', 'girl</w>', ',</w>', 'detailed</w>', 'beautiful</w>', 'face</w>', ',</w>', 'detailed</w>', 'hair</w>', ',</w>', 'detailed</w>', 'perfect</w>', 'pupil</w>', 'of</w>', 'eyes</w>', ',</w>', 'detailed</w>', 'cute</w>', 'mouth</w>', ',</w>', 'detailed</w>', 'shoulders</w>', ',</w>', 'detailed</w>', 'bust</w>'] 37の トヌク ンに分解されたこずがわかりたす。',/w'に泚目しおください。これは、カンマ,です。カンマ,も トヌク ンの䞀぀にカりントされおいるこずがわかりたす。 僕が実隓した限り、カンマ,ありなしで、出力される結果に違いはありたせん。75個を超える トヌク ンは切り捚おられるこずを考えるず、カンマ,は呪文に含めないのが良いでしょう。 75個を超える トヌク ンは切り捚おられるのか それでは、本圓に「75個を超える トヌク ンは切り捚おられるのか」実隓しおみたしょう。 䞋蚘のようなちょうど75個の トヌク ンの呪文を甚意したす。 prompt = "illustration of a beautiful girl, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ," tokens = tokenizer.tokenize(prompt) print(len(tokens), tokens[0:tokenizer.model_max_length-2]) image = pipe(prompt)["sample"][0] image トヌク ン出力結果改行版 75 ['illustration</w>', 'of</w>', 'a</w>', 'beautiful</w>', 'girl</w>', ',</w>', 省略 ',</w>'] 確かに呪文は、75個の トヌク ンで構成されおいたすね。この呪文の最埌に以䞋の呪文を远加したしょう。75個を超える トヌク ンが切り捚おられるなら、結果に圱響はないはずです。 远加する呪文改行版 deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k トヌク ン出力結果改行版 109 ['illustration</w>', 'of</w>', 'a</w>', 'beautiful</w>', 'girl</w>', ',</w>', 省略 ',</w>'] 結果に圱響はなかったですね。75個を超える トヌク ンが切り捚おられるこずが確認できたした。 呪文のカンマを削っおも出力結果に圱響はないのか 今床は、呪文のカンマを削っおも出力結果に圱響がないのかを怜蚌しおみたしょう。 今回の呪文は、 矎少女を高確率で出す呪文線 で䜿った呪文の改良版です。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed mouth, detailed shoulders, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed perfect pupil of eyes, detailed mouth, detailed shoulders, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 改良したのは、detailed perfect pupil of eyesずdetailed shouldersの二箇所です。 むラストなら、前回の呪文でも倧䞈倫なのですが、写真で詊すず目や腕が倉になるこずがあったので改良したした。 目は、detailed beautiful eyesをdetailed perfect pupil of eyesに倉えたした。 腕は、detailed armsをdetailed shouldersに倉えたした。腕は倉になりやすいので、指定しないほうが無難なようです。肩を指定するこずで腕が出力される回数が枛りたした。 トヌク ン出力結果改行版 74 ['illustration</w>','of</w>','a</w>','beautiful</w>','girl</w>', ',</w>', 'detailed</w>','beautiful</w>','face</w>', ',</w>', 'detailed</w>','hair</w>', ',</w>', 'detailed</w>','perfect</w>','pupil</w>','of</w>','eyes</w>', ',</w>', 'detailed</w>','mouth</w>', ',</w>', 'detailed</w>','shoulders</w>', ',</w>', 'detailed</w>','bust</w>', ',</w>', 'looking</w>','far</w>','away</w>', ',</w>', 'shot</w>','diag', 'on', 'ally</w>', ',</w>', 'art','station</w>', ',</w>', 'deviantart</w>', ',</w>', 'concept</w>','art</w>', ',</w>', 'digital</w>','painting</w>', ',</w>', 'award</w>','-</w>','winning</w>', ',</w>', 'cinematic</w>','post','processing</w>', ',</w>', 'cinematic</w>','scene</w>', ',</w>', 'cinematic</w>','composition</w>', ',</w>', 'cinematic</w>','lighting</w>', ',</w>', 'ove', 'rex', 'pose</w>', ',</w>', 'ray</w>','tracing</w>', ',</w>', '8</w>','k</w>'] 画像出力結果 既に トヌク ンの数は74Max 75。これ以䞊、詳现な指定ができなくなるのは問題です。出力結果を芋ながら呪文を改良しおいきたしょう。 ',/w'は削れたすね。 a beautiful girlのaも削れたす。girlを芋れば単数であるこずがわかるからです。僕の詊した限りはtheも削るこずができたす。 diagonallyが、'diag', 'on', 'ally/w'ず3぀に分かれお認識されおいたす。これは、Stable Diffusionがdiagonallyずいう単語を認識できおいないこずを瀺しおいたす。 この結果を芋おdiagonallyが無効だず刀断するのは早蚈です。Stable Diffusionは、ワヌドでない/wが぀いおいない連続した トヌク ンを有効だず認識しおいるこずもあるからです。䟋えば、pixivは、'pi', 'xiv/w'ず別れおいたすが、pixivあり/なしで、出力結果は倉わっおきたす。぀たり、pixivの呪文は有効だずいうこずです。 ワヌドでない/wが぀いおいない連続した トヌク ンは、あり/なしで䜕床も詊したしょう。効果があるず確信できるずきだけ、呪文ずしお採甚したしょう。shot diagonally斜めに撮圱するは、䜕床も詊した結果効果が確信できなかったので、䞍採甚にしたした。 同様にワヌドでない/wが぀いおいない連続した トヌク ンの'ove', 'rex', 'pose/w'も䞍採甚にしたした。 award-winningは、'award/w', '-/w', 'winning/w'に分解されおいたので、真ん䞭の '-/w'は䞍芁ず刀断し、award winningにするこずにしたした。 改良版の呪文暪長、コピヌ&ペヌスト甚はこちらになりたす。 illustration of beautiful girl detailed beautiful face detailed hair detailed perfect pupil of eyes detailed mouth detailed shoulders detailed bust looking far away artstation deviantart concept art digital painting award winning cinematic postprocessing cinematic scene cinematic composition cinematic lighting ray tracing 8k 改良版の閲芧甚呪文改行版 illustration of beautiful girl detailed beautiful face detailed hair detailed perfect pupil of eyes detailed mouth detailed shoulders detailed bust looking far away artstation deviantart concept art digital painting award winning cinematic postprocessing cinematic scene cinematic composition cinematic lighting ray tracing 8k トヌク ン出力結果改行版 45 ['illustration</w>', 'of</w>', 'beautiful</w>', 'girl</w>', 'detailed</w>', 'beautiful</w>', 'face</w>', 'detailed</w>', 'hair</w>', 'detailed</w>', 'perfect</w>', 'pupil</w>', 'of</w>', 'eyes</w>', 'detailed</w>', 'mouth</w>', 'detailed</w>', 'shoulders</w>', 'detailed</w>', 'bust</w>', 'looking</w>', 'far</w>', 'away</w>', 'art', 'station</w>', 'deviantart</w>', 'concept</w>', 'art</w>', 'digital</w>', 'painting</w>', 'award</w>', 'winning</w>', 'cinematic</w>', 'post', 'processing</w>', 'cinematic</w>', 'scene</w>', 'cinematic</w>', 'composition</w>', 'cinematic</w>', 'lighting</w>', 'ray</w>', 'tracing</w>', '8</w>', 'k</w>'] 画像出力結果 トヌク ンの個数が74から45に圧瞮されたした。画像のクオリティは倉わっおいないこずが確認できるず思いたす。 たずめ 今回は、75個を超える トヌク ンは、切り捚おられるこずを確認したした。 さらに、呪文を圧瞮するテクニックずしお、カンマ、を削る、ワヌドでない/wが぀いおいない連続した トヌク ンが有効かどうかをチェックするこずを孊びたした。 次回は、 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ の山䞋です。 今回は、TypeScriptを䜿っお、gRPCのアプリケヌションを開発する際の方法に぀いお玹介したす。 gRPCずProtocol Buffers gRPCは Google の開発した様々な環境で動䜜する オヌプン゜ヌス のRPC フレヌムワヌク です。 gRPCは負荷分散、トレヌス、ヘルスチェック、認蚌などの機胜をサポヌトし、効率的な通信の仕組みを提䟛しおいたす。 gRPCは、Protocol Buffersずいうむンタヌフェヌス蚘述蚀語(IDL)を甚いおサヌビスを定矩しお利甚したす。このProtocol BuffersもgRPCず同じく Google が開発しおいたす。gRPCでアプリケヌションを開発する際は、たずProtocol Buffersから通信に関するプログラムを自動的に構築しお開発するこずになりたす。 Protocol Buffersは倚くの蚀語をサポヌトしおいたす。今回利甚するTypeScriptを盎接サポヌトはしおいたせんが、Node.jsをサポヌトしおいるので問題なく利甚できたす。 詳现な情報はgRPCの公匏サむトを参照しおください。 https://grpc.io/ Protocol Buffersに぀いおの詳现な情報は以䞋のURLを参照しおください。 https://developers.google.com/protocol-buffers この蚘事では、Node.jsのサポヌトを利甚しおTypeScriptのアプリケヌション開発の手順に぀いお解説したす。 gRPCの通信方匏 gRPCでは4皮類の通信方匏がある。 Unary RPC 1぀のリク ゚ス トに察しお䞀぀のレスポンスを返す䞀般的な通信です。 Server streaming RPC クラむアントから送られおきた䞀぀のリク ゚ス トに察しお、サヌバは耇数回に分けおレスポンスを返す通信方匏です。 Client streaming RPC クラむアントからリク ゚ス トを分割しお送る方匏でサヌバヌはすべおのリク ゚ス トを受け取っおからレスポンスを返す方匏です。 Bidirectional streaming RPC サヌバヌずクラむアントが䞀぀のコネクションを確立しお互いに任意のタむミングでリク ゚ス トずレスポンスを送りあう通信方匏です。 たた、gRPCでは、ブラりザで利甚するgRPC WebずHTTP/2を利甚しお通信を行うgRPC over HTTP/2の2皮類の通信方匏が存圚しおいたす。 gRPC over WEBはブラりザを䞭心に策定された仕様ずなっおいたす。このため珟圚は、Client streaming RPC、Bidirectional streaming RPCを行うこずが出来たせん。 この蚘事では、このうちHTTP/2を▌䜿ったUnary RPCの開発手順に぀いお玹介したす。 TypeScriptを甚いたgRPCの開発手順 TypeScriptを甚いたgRPCアプリケヌションは以䞋のような流れで開発したす。 Protocol Buffersの定矩を proto ファむルで行う protoc プログラムを甚いお proto ファむルから ゜ヌスコヌド を生成する 生成したプログラムにロゞックを远加しお完成させる ずいう流れになりたす。 ここでは、その流れを順番に远っおみたす。 Protocol Buffers でサヌビスずメッセヌゞを蚘述する Protocol Buffersではサヌビスずメ゜ッド(rpc名ず呌ぶ方が適切かもしれたせんが、本蚘事ではメ゜ッドで統䞀したす)を定矩したす。メ゜ッドが API の抂念に近いものずなり、メ゜ッドが通信でやりずりする内容をメッセヌゞずしお定矩するこずずなりたす。 Protocol Buffersの䟋を以䞋に瀺したす。なおProtocol Buffersにはバヌゞョンがあり本蚘事ではバヌゞョン3を想定しおいたす。 syntax = "proto3"; message HelloRequest { string name = 1; } message HelloResponse { string result =1; } service Hello { rpc hello(HelloRequest) returns (HelloResponse); } 䞊蚘の定矩では、 Hello ずいうサヌビスず hello メ゜ッド、 HelloRequest ず HelloResponse ずいうメッセヌゞが定矩されおいたす。 。 hello を呌びだす堎合には、 HelloRequest を匕数ずしお呌び出し、その返り倀ずしおは HelloResponse ずいうメッセヌゞが返っおくるこずを衚しおいたす。 なお、ここではProtocol Buffersの文法の詳现を述べたせん。詳现に぀いおは、公匏のドキュメントを参照しおください。 https://developers.google.com/protocol-buffers/docs/proto3 蚘茉する際は以䞋のスタむルガむドが参考になりたす。 https://developers.google.com/protocol-buffers/docs/style スタむルガむドには以䞋のようにサヌビス名、メッセヌゞ名ずフィヌルド名に぀いおの 呜名 の芏則が蚘茉されおいたす。 Use CamelCase (with an initial capital) for message names – for example, SongServerRequest. Use underscore_separated_names for field names (including oneof field and extension names) – for example, song_name. このガむドの内容に埓わなくおも問題はおきたせん。しかし、埓っおいない堎合は生成される ゜ヌスコヌド が䞍自然なものずなっおしたいたす。 䟋えば、フィヌルド名を userId のような名前を付けた堎合、これに察応するメ゜ッドやプロパティの名前は getUserid 、 setUserid ずいった圢になっおしたいたす。 䞀方で user_id ずいうフィヌルド名を甚いた堎合は getUserId 、 setUserId ずいう名前で生成されたす。コヌドの読みやすさなどの芳点からフィヌルド名にはスネヌクケヌスを甚いる方が良さそうですね。 Protocol Buffersの曎新に぀いお Protocol Buffersのprotoファむルを曎新しお、メッセヌゞのフォヌマットを倉曎する堎合には泚意が必芁ずなりたす。 特に、フィヌルド番号は安易に倉曎、削陀しおしたうず叀いプログラムず新しいプログラムでメッセヌゞのフォヌマットが䞀臎しなくなり通信できなくなっおしたうので泚意が必芁です。 極力新しいフィヌルドを远加しおいく圢で曎新しおいく事が望たしいです。 たた削陀も可胜であれば避け OBSOLETE_ ずいった プレフィックス を぀けお残しおおく事が望たしいです。 埌々誀っお削陀したフィヌルド番号が再利甚されおしたうずいったトラブルを回避するためです。 たた各皮メッセヌゞの皮類には互換性があり、同じフィヌルド番号でもメッセヌゞの皮類の倉曎は可胜な堎合がありたす。 その他の泚意点に぀いおは公匏のドキュメントを熟読し、慎重に曎新を行っおいく必芁があるので泚意しおください。 https://developers.google.com/protocol-buffers/docs/proto3#updating Protocol Buffersから ゜ヌスコヌド を生成する protocプログラムずそのオプションに぀いお Protocol Buffersからコヌドを生成するプログラム( protoc )は、オプションの蚘述方法に泚意が必芁です。 protoc を利甚する際は、 xxx_out=.... ずいうオプションが䞊ぶこずになりたす。 このオプションは、以䞋のように解釈したす。 --xxx_out は プラグむン ず出力先の指定を意味したす。これは、 proto-gen-xxx ずいう プラグむン 名の堎合は、 xxx_out ずいう察応関係になっおいたす。 proto-gen-go プラグむン なら --go_out 。 proto-gen-grpc-gateway プラグむン なら --grpc-gateway_out ずいう具合になっおいたす。 プラグむン 自䜓もオプションも同時に指定するこずが出来お、 --xxx_out=プラグむンのオプション:出力先 ずいう圢になりたす。 䟋えば、 --js_out=import_style=commonjs,binary:${PROTO_DEST} ず曞いおある堎合を考えたす。 これは、 js_out プラグむン に import_style=commonjs,binary(=true) ずいう匕数を枡すこずになりたす。そしお、その出力先は ${PROTO_DEST} ずいうこずです。 TypeScript甚のprotocに぀いお protoc は Node.js に察応しおいたすが、TypeScriptの型定矩などを盎接生成する機胜は持っおいたせん。 今回は、 grpc_tools_node_protoc_ts を甚いお protoc の生成した Node.js の ゜ヌスコヌド に型定矩を自動生成しお利甚したす。これは、 grpc-tools ずいうgRPC公匏に含たれおいる grpc_tools_node_protoc ずいうツヌルを拡匵したものです。 以䞋が公匏ドキュメントずその䜿い方です。 https://github.com/agreatfool/grpc_tools_node_protoc_ts#how-to-use # ゜ヌスコヌドの出力先 PROTO_DEST=./src/proto # protoファむルが眮いおあるディレクトリ PROTO_DIR=./proto # Protocol BuffersからnodeのgRPCコヌドを自動生成 grpc_tools_node_protoc \ --js_out=import_style=commonjs,binary:${PROTO_DEST} \ --grpc_out=${PROTO_DEST} \ --plugin=protoc-gen-grpc=$(which grpc_tools_node_protoc_plugin) \ -I ${PROTO_SRC} \ ${PROTO_SRC}/* # typescript甚の型定矩を䜜成 grpc_tools_node_protoc \ --plugin=protoc-gen-ts=$(yarn bin)/protoc-gen-ts \ --ts_out=${PROTO_DEST} \ -I ${PROTO_SRC} \ ${PROTO_SRC}/* もしくは以䞋のように䞀括で生成する方法もありたす。 # 定矩ず実装を同時に生成 yarn run grpc_tools_node_protoc \ --plugin=protoc-gen-ts=$(yarn bin)/protoc-gen-ts \ --ts_out=grpc_js:${PROTO_DEST} \ --js_out=import_style=commonjs,binary:${PROTO_DEST} \ --grpc_out=grpc_js:${PROTO_DEST} \ -I ${PROTO_DIR} \ ${PROTO_DIR}/*.proto 生成されたプログラムを利甚しおみる Hello サヌビスの簡単なサヌバ、クラむアントの実装を以䞋に瀺したす。 通信に関わる凊理は党おgRPC偎が行っおくれおいるため、実際に蚘述する郚分はロゞックに察応する郚分だけずなりたす。通信に甚いるメッセヌゞを組み立おる関数も自動生成されおいるので、それを利甚しお構築できたす。 // サヌバプログラム import * as grpc from '@grpc/grpc-js' ; import { sendUnaryData } from '@grpc/grpc-js/build/src/server-call' ; import { HelloRequest , HelloResponse } from '../proto/hello_pb' ; import { HelloService } from '../proto/hello_grpc_pb' ; const HelloServer = { hello: ( call: grpc.ServerUnaryCall < HelloRequest , HelloResponse >, callback: sendUnaryData < HelloResponse >) : void => { const request = call.request ; const response = new HelloResponse (); console .log ( "Message from client" ); response.setResult ( "Hello," + request.getName ()) callback ( null , response ); } } function serve () : void { const server = new grpc.Server (); server.addService ( HelloService , HelloServer ); server.bindAsync ( `localhost:6543` , grpc.ServerCredentials.createInsecure (), ( err , port ) => { if ( err ) { throw err ; } console .log ( `Listening on ${ port } ` ); server.start (); } ); } serve (); // クラむアントプログラム import * as grpc from '@grpc/grpc-js' ; import { HelloClient } from '../proto/hello_grpc_pb' ; import { HelloRequest , HelloResponse } from '../proto/hello_pb' ; function hello () : Promise < HelloResponse > { const client = new HelloClient ( `localhost:6543` , grpc.credentials.createInsecure (), ); // HelloRequestを䜜るためのクラス、メ゜ッドが甚意されおいるのでそれを甚いおメッセヌゞを䜜成する const request = new HelloRequest (); request.setName ( "ISID" ); // サヌバに察しおサヌビスの実行を芁求する return new Promise < HelloResponse >(( resolve , reject ) => { console .log ( "Send Hello Message" ); client.hello ( request , ( err , response ) => { if ( err ) { return reject ( err ); } // ここで結果を受け取っおいる console .log ( "Receive Message" ); return resolve ( response ); } ); } ); } (async () => { console .log ( "Client Start" ); const result = await hello (); console .log ( result.getResult ()); } )(); 実際のプロゞェクト構成ず動䜜䟋 ここでは、今回のサンプルで利甚したプロゞェクトの構成を玹介したす。 プロゞェクト構成䟋 ディレクト リの構成は以䞋のような構成です。 . ├── package.json ├── proto │   └── hello.proto ├── scripts │   └── build-protos.sh ├── src │   ├── client │   │   └── index.ts │   ├── proto │   └── server │   └── index.ts └── tsconfig.json たた、package. json の䞭身は以䞋のような内容です。 { " name ": " grpc-hello ", " version ": " 1.0.0 ", " main ": " index.js ", " license ": " MIT ", " dependencies ": { } , " scripts ": { " lint ": " yarn run eslint --fix --ext .ts src ", " clean ": " rm -rf ./dist && rm -rf ./src/proto && mkdir -p ./src/proto ", " build ": " sh ./scripts/build-protos.sh ./hello.proto ./src/proto && yarn run tsc; cp -r ./src/proto ./dist/src/proto " , } , " devDependencies ": { " @grpc/grpc-js ": " ^1.4.2 ", " @types/eslint ": " ^7.28.2 ", " @types/google-protobuf ": " ^3.15.5 ", " @types/node ": " ^16.11.7 ", " @typescript-eslint/eslint-plugin ": " ^5.3.0 ", " @typescript-eslint/parser ": " ^5.3.0 ", " eslint ": " ^8.1.0 ", " grpc-tools ": " ^1.11.2 ", " grpc_tools_node_protoc_ts ": " ^5.3.2 ", " ts-node ": " ^10.4.0 ", " tsconfig-paths ": " ^3.11.0 ", " typescript ": " ^4.4.4 " } } 動䜜確認 たず yarn build で Protocol Buffers からコヌド生成、TypeScriptから JavaScript ぞのトランスパむルを実行したす。 $ yarn $ yarn build サヌバの起動 $ node ./dist/src/server/ Listening on 6543 クラむアントの実行 $ node ./dist/src/client Client Start Send Hello Message Receive Message Hello,ISID サヌバヌ偎のログも確認するず Message from client ずいうようなログが出おいたす。 gRPCを䜿った通信プログラムが実装できおそうです。 たずめ 今回は、gRPCを甚いたアプリケヌション開発の方法やその泚意点に぀いお玹介したした。 gRPCは Protocol Buffers を定矩するだけで高品質な通信プログラムが実装できる玠晎しい技術ですね。 機䌚があれば積極的に利甚しおいきたいず思いたす。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @yamashita.tsuyoshi 、レビュヌ @handa.kenta  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ の山䞋です。 今回は、TypeScriptを䜿っお、gRPCのアプリケヌションを開発する際の方法に぀いお玹介したす。 gRPCずProtocol Buffers gRPCは Google の開発した様々な環境で動䜜する オヌプン゜ヌス のRPC フレヌムワヌク です。 gRPCは負荷分散、トレヌス、ヘルスチェック、認蚌などの機胜をサポヌトし、効率的な通信の仕組みを提䟛しおいたす。 gRPCは、Protocol Buffersずいうむンタヌフェヌス蚘述蚀語(IDL)を甚いおサヌビスを定矩しお利甚したす。このProtocol BuffersもgRPCず同じく Google が開発しおいたす。gRPCでアプリケヌションを開発する際は、たずProtocol Buffersから通信に関するプログラムを自動的に構築しお開発するこずになりたす。 Protocol Buffersは倚くの蚀語をサポヌトしおいたす。今回利甚するTypeScriptを盎接サポヌトはしおいたせんが、Node.jsをサポヌトしおいるので問題なく利甚できたす。 詳现な情報はgRPCの公匏サむトを参照しおください。 https://grpc.io/ Protocol Buffersに぀いおの詳现な情報は以䞋のURLを参照しおください。 https://developers.google.com/protocol-buffers この蚘事では、Node.jsのサポヌトを利甚しおTypeScriptのアプリケヌション開発の手順に぀いお解説したす。 gRPCの通信方匏 gRPCでは4皮類の通信方匏がある。 Unary RPC 1぀のリク ゚ス トに察しお䞀぀のレスポンスを返す䞀般的な通信です。 Server streaming RPC クラむアントから送られおきた䞀぀のリク ゚ス トに察しお、サヌバは耇数回に分けおレスポンスを返す通信方匏です。 Client streaming RPC クラむアントからリク ゚ス トを分割しお送る方匏でサヌバヌはすべおのリク ゚ス トを受け取っおからレスポンスを返す方匏です。 Bidirectional streaming RPC サヌバヌずクラむアントが䞀぀のコネクションを確立しお互いに任意のタむミングでリク ゚ス トずレスポンスを送りあう通信方匏です。 たた、gRPCでは、ブラりザで利甚するgRPC WebずHTTP/2を利甚しお通信を行うgRPC over HTTP/2の2皮類の通信方匏が存圚しおいたす。 gRPC over WEBはブラりザを䞭心に策定された仕様ずなっおいたす。このため珟圚は、Client streaming RPC、Bidirectional streaming RPCを行うこずが出来たせん。 この蚘事では、このうちHTTP/2を▌䜿ったUnary RPCの開発手順に぀いお玹介したす。 TypeScriptを甚いたgRPCの開発手順 TypeScriptを甚いたgRPCアプリケヌションは以䞋のような流れで開発したす。 Protocol Buffersの定矩を proto ファむルで行う protoc プログラムを甚いお proto ファむルから ゜ヌスコヌド を生成する 生成したプログラムにロゞックを远加しお完成させる ずいう流れになりたす。 ここでは、その流れを順番に远っおみたす。 Protocol Buffers でサヌビスずメッセヌゞを蚘述する Protocol Buffersではサヌビスずメ゜ッド(rpc名ず呌ぶ方が適切かもしれたせんが、本蚘事ではメ゜ッドで統䞀したす)を定矩したす。メ゜ッドが API の抂念に近いものずなり、メ゜ッドが通信でやりずりする内容をメッセヌゞずしお定矩するこずずなりたす。 Protocol Buffersの䟋を以䞋に瀺したす。なおProtocol Buffersにはバヌゞョンがあり本蚘事ではバヌゞョン3を想定しおいたす。 syntax = "proto3"; message HelloRequest { string name = 1; } message HelloResponse { string result =1; } service Hello { rpc hello(HelloRequest) returns (HelloResponse); } 䞊蚘の定矩では、 Hello ずいうサヌビスず hello メ゜ッド、 HelloRequest ず HelloResponse ずいうメッセヌゞが定矩されおいたす。 。 hello を呌びだす堎合には、 HelloRequest を匕数ずしお呌び出し、その返り倀ずしおは HelloResponse ずいうメッセヌゞが返っおくるこずを衚しおいたす。 なお、ここではProtocol Buffersの文法の詳现を述べたせん。詳现に぀いおは、公匏のドキュメントを参照しおください。 https://developers.google.com/protocol-buffers/docs/proto3 蚘茉する際は以䞋のスタむルガむドが参考になりたす。 https://developers.google.com/protocol-buffers/docs/style スタむルガむドには以䞋のようにサヌビス名、メッセヌゞ名ずフィヌルド名に぀いおの 呜名 の芏則が蚘茉されおいたす。 Use CamelCase (with an initial capital) for message names – for example, SongServerRequest. Use underscore_separated_names for field names (including oneof field and extension names) – for example, song_name. このガむドの内容に埓わなくおも問題はおきたせん。しかし、埓っおいない堎合は生成される ゜ヌスコヌド が䞍自然なものずなっおしたいたす。 䟋えば、フィヌルド名を userId のような名前を付けた堎合、これに察応するメ゜ッドやプロパティの名前は getUserid 、 setUserid ずいった圢になっおしたいたす。 䞀方で user_id ずいうフィヌルド名を甚いた堎合は getUserId 、 setUserId ずいう名前で生成されたす。コヌドの読みやすさなどの芳点からフィヌルド名にはスネヌクケヌスを甚いる方が良さそうですね。 Protocol Buffersの曎新に぀いお Protocol Buffersのprotoファむルを曎新しお、メッセヌゞのフォヌマットを倉曎する堎合には泚意が必芁ずなりたす。 特に、フィヌルド番号は安易に倉曎、削陀しおしたうず叀いプログラムず新しいプログラムでメッセヌゞのフォヌマットが䞀臎しなくなり通信できなくなっおしたうので泚意が必芁です。 極力新しいフィヌルドを远加しおいく圢で曎新しおいく事が望たしいです。 たた削陀も可胜であれば避け OBSOLETE_ ずいった プレフィックス を぀けお残しおおく事が望たしいです。 埌々誀っお削陀したフィヌルド番号が再利甚されおしたうずいったトラブルを回避するためです。 たた各皮メッセヌゞの皮類には互換性があり、同じフィヌルド番号でもメッセヌゞの皮類の倉曎は可胜な堎合がありたす。 その他の泚意点に぀いおは公匏のドキュメントを熟読し、慎重に曎新を行っおいく必芁があるので泚意しおください。 https://developers.google.com/protocol-buffers/docs/proto3#updating Protocol Buffersから ゜ヌスコヌド を生成する protocプログラムずそのオプションに぀いお Protocol Buffersからコヌドを生成するプログラム( protoc )は、オプションの蚘述方法に泚意が必芁です。 protoc を利甚する際は、 xxx_out=.... ずいうオプションが䞊ぶこずになりたす。 このオプションは、以䞋のように解釈したす。 --xxx_out は プラグむン ず出力先の指定を意味したす。これは、 proto-gen-xxx ずいう プラグむン 名の堎合は、 xxx_out ずいう察応関係になっおいたす。 proto-gen-go プラグむン なら --go_out 。 proto-gen-grpc-gateway プラグむン なら --grpc-gateway_out ずいう具合になっおいたす。 プラグむン 自䜓もオプションも同時に指定するこずが出来お、 --xxx_out=プラグむンのオプション:出力先 ずいう圢になりたす。 䟋えば、 --js_out=import_style=commonjs,binary:${PROTO_DEST} ず曞いおある堎合を考えたす。 これは、 js_out プラグむン に import_style=commonjs,binary(=true) ずいう匕数を枡すこずになりたす。そしお、その出力先は ${PROTO_DEST} ずいうこずです。 TypeScript甚のprotocに぀いお protoc は Node.js に察応しおいたすが、TypeScriptの型定矩などを盎接生成する機胜は持っおいたせん。 今回は、 grpc_tools_node_protoc_ts を甚いお protoc の生成した Node.js の ゜ヌスコヌド に型定矩を自動生成しお利甚したす。これは、 grpc-tools ずいうgRPC公匏に含たれおいる grpc_tools_node_protoc ずいうツヌルを拡匵したものです。 以䞋が公匏ドキュメントずその䜿い方です。 https://github.com/agreatfool/grpc_tools_node_protoc_ts#how-to-use # ゜ヌスコヌドの出力先 PROTO_DEST=./src/proto # protoファむルが眮いおあるディレクトリ PROTO_DIR=./proto # Protocol BuffersからnodeのgRPCコヌドを自動生成 grpc_tools_node_protoc \ --js_out=import_style=commonjs,binary:${PROTO_DEST} \ --grpc_out=${PROTO_DEST} \ --plugin=protoc-gen-grpc=$(which grpc_tools_node_protoc_plugin) \ -I ${PROTO_SRC} \ ${PROTO_SRC}/* # typescript甚の型定矩を䜜成 grpc_tools_node_protoc \ --plugin=protoc-gen-ts=$(yarn bin)/protoc-gen-ts \ --ts_out=${PROTO_DEST} \ -I ${PROTO_SRC} \ ${PROTO_SRC}/* もしくは以䞋のように䞀括で生成する方法もありたす。 # 定矩ず実装を同時に生成 yarn run grpc_tools_node_protoc \ --plugin=protoc-gen-ts=$(yarn bin)/protoc-gen-ts \ --ts_out=grpc_js:${PROTO_DEST} \ --js_out=import_style=commonjs,binary:${PROTO_DEST} \ --grpc_out=grpc_js:${PROTO_DEST} \ -I ${PROTO_DIR} \ ${PROTO_DIR}/*.proto 生成されたプログラムを利甚しおみる Hello サヌビスの簡単なサヌバ、クラむアントの実装を以䞋に瀺したす。 通信に関わる凊理は党おgRPC偎が行っおくれおいるため、実際に蚘述する郚分はロゞックに察応する郚分だけずなりたす。通信に甚いるメッセヌゞを組み立おる関数も自動生成されおいるので、それを利甚しお構築できたす。 // サヌバプログラム import * as grpc from '@grpc/grpc-js' ; import { sendUnaryData } from '@grpc/grpc-js/build/src/server-call' ; import { HelloRequest , HelloResponse } from '../proto/hello_pb' ; import { HelloService } from '../proto/hello_grpc_pb' ; const HelloServer = { hello: ( call: grpc.ServerUnaryCall < HelloRequest , HelloResponse >, callback: sendUnaryData < HelloResponse >) : void => { const request = call.request ; const response = new HelloResponse (); console .log ( "Message from client" ); response.setResult ( "Hello," + request.getName ()) callback ( null , response ); } } function serve () : void { const server = new grpc.Server (); server.addService ( HelloService , HelloServer ); server.bindAsync ( `localhost:6543` , grpc.ServerCredentials.createInsecure (), ( err , port ) => { if ( err ) { throw err ; } console .log ( `Listening on ${ port } ` ); server.start (); } ); } serve (); // クラむアントプログラム import * as grpc from '@grpc/grpc-js' ; import { HelloClient } from '../proto/hello_grpc_pb' ; import { HelloRequest , HelloResponse } from '../proto/hello_pb' ; function hello () : Promise < HelloResponse > { const client = new HelloClient ( `localhost:6543` , grpc.credentials.createInsecure (), ); // HelloRequestを䜜るためのクラス、メ゜ッドが甚意されおいるのでそれを甚いおメッセヌゞを䜜成する const request = new HelloRequest (); request.setName ( "ISID" ); // サヌバに察しおサヌビスの実行を芁求する return new Promise < HelloResponse >(( resolve , reject ) => { console .log ( "Send Hello Message" ); client.hello ( request , ( err , response ) => { if ( err ) { return reject ( err ); } // ここで結果を受け取っおいる console .log ( "Receive Message" ); return resolve ( response ); } ); } ); } (async () => { console .log ( "Client Start" ); const result = await hello (); console .log ( result.getResult ()); } )(); 実際のプロゞェクト構成ず動䜜䟋 ここでは、今回のサンプルで利甚したプロゞェクトの構成を玹介したす。 プロゞェクト構成䟋 ディレクト リの構成は以䞋のような構成です。 . ├── package.json ├── proto │   └── hello.proto ├── scripts │   └── build-protos.sh ├── src │   ├── client │   │   └── index.ts │   ├── proto │   └── server │   └── index.ts └── tsconfig.json たた、package. json の䞭身は以䞋のような内容です。 { " name ": " grpc-hello ", " version ": " 1.0.0 ", " main ": " index.js ", " license ": " MIT ", " dependencies ": { } , " scripts ": { " lint ": " yarn run eslint --fix --ext .ts src ", " clean ": " rm -rf ./dist && rm -rf ./src/proto && mkdir -p ./src/proto ", " build ": " sh ./scripts/build-protos.sh ./hello.proto ./src/proto && yarn run tsc; cp -r ./src/proto ./dist/src/proto " , } , " devDependencies ": { " @grpc/grpc-js ": " ^1.4.2 ", " @types/eslint ": " ^7.28.2 ", " @types/google-protobuf ": " ^3.15.5 ", " @types/node ": " ^16.11.7 ", " @typescript-eslint/eslint-plugin ": " ^5.3.0 ", " @typescript-eslint/parser ": " ^5.3.0 ", " eslint ": " ^8.1.0 ", " grpc-tools ": " ^1.11.2 ", " grpc_tools_node_protoc_ts ": " ^5.3.2 ", " ts-node ": " ^10.4.0 ", " tsconfig-paths ": " ^3.11.0 ", " typescript ": " ^4.4.4 " } } 動䜜確認 たず yarn build で Protocol Buffers からコヌド生成、TypeScriptから JavaScript ぞのトランスパむルを実行したす。 $ yarn $ yarn build サヌバの起動 $ node ./dist/src/server/ Listening on 6543 クラむアントの実行 $ node ./dist/src/client Client Start Send Hello Message Receive Message Hello,ISID サヌバヌ偎のログも確認するず Message from client ずいうようなログが出おいたす。 gRPCを䜿った通信プログラムが実装できおそうです。 たずめ 今回は、gRPCを甚いたアプリケヌション開発の方法やその泚意点に぀いお玹介したした。 gRPCは Protocol Buffers を定矩するだけで高品質な通信プログラムが実装できる玠晎しい技術ですね。 機䌚があれば積極的に利甚しおいきたいず思いたす。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @yamashita.tsuyoshi 、レビュヌ @handa.kenta  Shodo で執筆されたした 
はじめに ISID Xクロス むノベヌション 本郚 の䞉浊です。 筆者の関わっおる案件では、コンテナ利甚、 AWS Fargate利甚を進めおおりたす。 AWS Fargateのお手軜さは非垞に重宝しおおりたす。 しかし、そこで問題になっおくるのが、管理接続、螏み台系をどうするかです。 アプリケヌション本䜓をせっかく AWS Fargateでやっおいるので、管理系接続、螏み台的な䜜業もできるだけ非EC2でやりたいですよね ずいうこずで、 AWS FargateでECS Exec、session managerをどのように運甚に䜿っおいけるか玹介いたしたす。 目次 はじめに 目次 想定䜜業、目暙 基本のECS Exec実行 aws ssm start-session start-session with AWS-StartPortForwardingSession start-session with AWS-StartPortForwardingSessionToRemoteHost 番倖:ECS FargateでSSMセッションマネヌゞャヌのリモヌトホストのポヌトフォワヌド環境を構築する ECS Exec with 運甚スクリプト たずめ 想定䜜業、目暙 䞋蚘のような想定䜜業、目暙ずなりたす。 想定䜜業 RDSに接続し管理䜜業pgdump、pgrestore、レコヌドの状態確認 ECS Fagateが䜿っおるEFSのファむル配眮、ファむル取埗 トラブル時のECSの状態把握蚭定ファむル、 環境倉数 等 目暙 管理甚のEC2を建おたくない 筆者が関係しおいるアカりントは200アカりント以䞊あり、各アカりントに螏み台を立おるのも、集䞭管理螏み台で VPC ピアリングを考えるのも非垞にどちらも避けたい感芚ですずいうか今苊しんでたす 暩限管理を AWS のロヌルに寄せたい ec2環境では䜜業時にwinパスワヌド、 ssh キヌを払い出すような仕組みを実装しおいるのですがチケット管理ssm、トラブルが䞀定頻床で発生しおいたす。たた、利甚者ずしおも螏み台ぞの接続情報接続経路、IP、認蚌情報を意識するのは煩雑です。 監査ログを AWS に寄せたい ECS Execでメンテナンスコマンドの手打ちを蟞めたい ロヌカルから、ポヌト フォワ ヌド等で デバッグ 甚のセッションを匵りたい 基本のECS Exec実行 基本のECS Exec実行です。 工倫ずしおはタスクIDの取埗が煩雑なため、環境情報の取埗を自動取埗にしおいるだけです。本取埗条件は、1 クラスタ ヌに1ecsサヌビスずなっおいるので、ECS クラスタ ヌ、サヌビスの状況に応じ、適宜ク゚リ条件は線集しおください。 cl = $( aws ecs list-clusters | jq -r ' .clusterArns[0] ' ) prefix = ` echo ${cl} | sed -E ' s/.+cluster\///g ' ` taskarn = $( aws ecs list-tasks --cluster ${cl} | jq -r ' .taskArns[0] ' ) taskid = ` echo ${taskarn} | sed -E ' s/.+task\/.+\///g ' ` CONTAINER_NAME = " ${prefix} -manager-container " echo ${cl} ; \ echo ${prefix} ; \ echo ${taskarn} ; \ echo ${taskid} ; \ echo ${CONTAINER_NAME} ; \ aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh " \ --interactive あず、ECS Execは、cloud shellから実行すれば、アクセスキヌ、シヌクレットキヌいらずで、 AWS consoleアクセス、フェデレヌション管理に寄せるこずができたす。 aws ssm start-session 参考蚘事 https://winebarrel.hatenablog.com/entry/2021/10/23/165720 次に、察話匏シェル以倖でもいろいろできないか探っおいきたす。 䞊蚘ブログで䞋のようなコメントがあり、私は䞋のずころで止たっおおりたした。 ECS ExecがどうもマネヌゞドなSSM Agentを䜿っお動いおいるずいうこずはわかっおいたが、実際どうなっおいるのかよくわからなかった。 ・・・・ aws ssm start-sessionを実行できそうな雰囲気があるが、--targetに䜕を枡せばいいのかよくわからなかった。 が、続けお読んでいくず、 ゜ヌスコヌド を読めばtargetの曞匏が曞かれおるずのこず。 https://github.com/aws/aws-cli/blob/c0edee0a7427b6e7b654df0696015e96105497a3/awscli/customizations/ecs/executecommand.py#L61-L73 def build_ssm_request_paramaters (response, client): cluster_name = response[ 'clusterArn' ].split( '/' )[- 1 ] task_id = response[ 'taskArn' ].split( '/' )[- 1 ] container_name = response[ 'containerName' ] # in order to get container run-time id # we need to make a call to describe-tasks container_runtime_id = \ get_container_runtime_id(client, container_name, task_id, cluster_name) target = "ecs:{}_{}_{}" .format(cluster_name, task_id, container_runtime_id) ssm_request_params = { "Target" : target} return ssm_request_params ゜ヌスコヌド を読めば確かに早かったですね。。。 ずいうこずで、 aws ssm start-sessionの各ドキュメントを詊したす。 たずは基本のsession接続。 cl = $( aws ecs list-clusters | jq -r ' .clusterArns[0] ' ) prefix = ` echo ${cl} | sed -E ' s/.+cluster\///g ' ` taskarn = $( aws ecs list-tasks --cluster ${cl} | jq -r ' .taskArns[] ' ) taskid = ` echo ${taskarn} | sed -E ' s/.+task\/.+\///g ' ` CONTAINER_NAME = " ${prefix} -manager-container " CONTAINER_ID = $( aws ecs describe-tasks --cluster $cl --task $taskid | jq -r --arg CONTAINER_NAME $CONTAINER_NAME ' .tasks[0].containers[] | select(.name == $CONTAINER_NAME).runtimeId ' ) echo ${cl} ; \ echo ${prefix} ; \ echo ${taskarn} ; \ echo ${taskid} ; \ echo ${CONTAINER_NAME} ; echo ${CONTAINER_ID} ; aws ssm start-session --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} パラメヌタずしおCONTAINER_IDの取埗が増えおおりたすが、぀ながりたした。たあ、これだけだずecs execず同じためなんのありがたさもありたせんが。 なお、 AWS Fargateでのstart-session利甚は AWS CLI の ゜ヌスコヌド を読んで埗た知芋であり、 AWS がサポヌトしおいる䜿い方ではありたせん。 start-session with AWS -StartPortForwardingSession では、次に、 AWS -StartPortForwardingSessionを詊しおいきたしょう。 もしできれば、接続トラブル時の切り分け䜜業、むンタヌネットに公開するのに抵抗のある管理ポヌトぞのアクセス等、いろいろ䜿い道がありたす。 #前述のおたじない aws ssm start-session --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} \ --document-name AWS-StartPortForwardingSession --parameters ' {"portNumber":["80"],"localPortNumber":["18080"]} ' ドキュメントずパラメヌタを远加し実行です。 ずいうこずで、぀ながりたした。たあ、cloudshellからだず䜿い道がありたせんがバックグランド実行のしかたがわかりたせんでした、ロヌカルマシンから利甚するには䟿利そうです。 start-session with AWS -StartPortForwardingSessionToRemoteHost では、次に、 AWS -StartPortForwardingSessionToRemoteHostを詊したす。 「 AWS -StartPortForwardingSessionToRemoteHost」っお䜕っお人は、 クラスメ゜ッド様のAWS System Managerセッションマネヌゞャヌがリモヌトホストのポヌトフォワヌドに察応したした をご芧ください。 ざっくりいっおしたうず、session managerの察象ホストから他のホストにポヌト フォワ ヌドできる優れものです。session managerに察応しおいないRDSぞポヌト フォワ ヌドできたりしたす。 これができれば、ロヌカルのGUIDB管理ツヌルからRDSぞ接続が可胜ずなりたす( CLI だず厳しいずいうメンバが䞀定数おりそれ甚の察応怜蚎です)。 #前述のおたじない aws ssm start-session \ --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} \ --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters ' {"host":["RDS゚ンドポむント],"portNumber":["3306"], "localPortNumber":["3306"]} ' で、実斜結果ですが、、。 2022/07、2022/09で二回ほど詊しおおりたすが、珟行の AWS Fargateに入っおる゚ヌゞェントバヌゞョンが未察応ずのこず。圓面、ロヌカルからの盎接RDS接続はお預けです。 番倖:ECS FargateでSSMセッションマネヌゞャヌの リモヌトホスト のポヌト フォワ ヌド環境を構築する ECS FargateでSSMセッションマネヌゞャヌのリモヌトホストのポヌトフォワヌド環境を構築する にかかれおいるように、Fargate基盀の゚ヌゞェントを利甚するのではなく、ssm゚ヌゞェント蚭定したコンテナをfargateにデプロむすれば リモヌトホスト ぞのポヌト フォワ ヌド環境の構築は可胜です。 たた、䞊蚘の方法以倖にも、䞋蚘のような仕蟌みをするこずで察象コンテナぞのポヌト フォワ ヌドRDS接続はできそうです。 これでコンテナに[stone](https://www.gcd.org/sengoku/stone/Welcome.ja.html)でも入れおおけば、Fargateのタスクを螏み台にしおデヌタベヌスなどぞのアクセスができる。 参考蚘事: https://winebarrel.hatenablog.com/entry/2021/10/23/165720 ECS Exec with 運甹 スクリプト 前述たでの内容で、ポヌト フォワ ヌド、察話匏でいろいろな管理オペレヌションができそうずいうこずは芋えおきたした。 が、やはり、定型䜜業は単 玔化 しおいきたいので察話匏以倖でのメンテナンス方匏を考えおいきたす。 [アップデヌト] 実行䞭のコンテナに乗り蟌んでコマンドを実行できる「ECS Exec」が公開されたした で、䞊の蚘事を芋おるず䞋蚘のような気になる蚘述が。 aws の公匏ドキュメントをみおるず、 /bin/sh を呌ぶ䟋しか曞いおいないのですが、任意のコマンドで呌べるんですね。 ずいうこずで、運甚 スクリプト をコンテナ内に配眮し呌び出しおみたす。 #前述のおたじない #pgdump⇒s3アップロヌドをしおいる運甚スクリプトを呌び出しおいる䟋 aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh -c '/work/backup.sh backupComment' " \ --interactive #s3ダりンロヌド⇒pgrestoreをしおいる運甚スクリプトを呌び出しおいる䟋 aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh -c '/work/restore.sh my-dev_20220902-153423_backupComment.dump' " \ --interactive こんな感じで、運甚 スクリプト をECS Execから呌びだすこずができたすなお、重い運甚JOBの堎合は、専甚のタスクを起動した方がよいず考えおおりたす。 ずいうこずで、既存構成に倚少の手を加えるこずにより、ECS Execからメンテナンスをする仕組みが実装できたした。 ECS Execで呌び出せるように運甚 スクリプト を定矩しおおけば、今埌䞋蚘のようなこずもできそうです。 今たでどおりcloudshellから Ops が手動でECS Execにお運甚 スクリプト を起動する ChatOpsでECS Exec経由で運甚 スクリプト を起動する チケット管理ツヌルのワヌクフロヌからECS Exec経由で運甚 スクリプト を起動する䞀郚のssm run-commandはこの方匏で実斜しおいたす たずめ ずいうこずで、 AWS Fargate利甚時の運甚タスクの実行方法に぀いおご玹介しおみたした。 執筆 @miura.toshihiko  Shodo で執筆されたした 
はじめに ISID Xクロス むノベヌション 本郚 の䞉浊です。 筆者の関わっおる案件では、コンテナ利甚、 AWS Fargate利甚を進めおおりたす。 AWS Fargateのお手軜さは非垞に重宝しおおりたす。 しかし、そこで問題になっおくるのが、管理接続、螏み台系をどうするかです。 アプリケヌション本䜓をせっかく AWS Fargateでやっおいるので、管理系接続、螏み台的な䜜業もできるだけ非EC2でやりたいですよね ずいうこずで、 AWS FargateでECS Exec、session managerをどのように運甚に䜿っおいけるか玹介いたしたす。 目次 はじめに 目次 想定䜜業、目暙 基本のECS Exec実行 aws ssm start-session start-session with AWS-StartPortForwardingSession start-session with AWS-StartPortForwardingSessionToRemoteHost 番倖:ECS FargateでSSMセッションマネヌゞャヌのリモヌトホストのポヌトフォワヌド環境を構築する ECS Exec with 運甚スクリプト たずめ 想定䜜業、目暙 䞋蚘のような想定䜜業、目暙ずなりたす。 想定䜜業 RDSに接続し管理䜜業pgdump、pgrestore、レコヌドの状態確認 ECS Fagateが䜿っおるEFSのファむル配眮、ファむル取埗 トラブル時のECSの状態把握蚭定ファむル、 環境倉数 等 目暙 管理甚のEC2を建おたくない 筆者が関係しおいるアカりントは200アカりント以䞊あり、各アカりントに螏み台を立おるのも、集䞭管理螏み台で VPC ピアリングを考えるのも非垞にどちらも避けたい感芚ですずいうか今苊しんでたす 暩限管理を AWS のロヌルに寄せたい ec2環境では䜜業時にwinパスワヌド、 ssh キヌを払い出すような仕組みを実装しおいるのですがチケット管理ssm、トラブルが䞀定頻床で発生しおいたす。たた、利甚者ずしおも螏み台ぞの接続情報接続経路、IP、認蚌情報を意識するのは煩雑です。 監査ログを AWS に寄せたい ECS Execでメンテナンスコマンドの手打ちを蟞めたい ロヌカルから、ポヌト フォワ ヌド等で デバッグ 甚のセッションを匵りたい 基本のECS Exec実行 基本のECS Exec実行です。 工倫ずしおはタスクIDの取埗が煩雑なため、環境情報の取埗を自動取埗にしおいるだけです。本取埗条件は、1 クラスタ ヌに1ecsサヌビスずなっおいるので、ECS クラスタ ヌ、サヌビスの状況に応じ、適宜ク゚リ条件は線集しおください。 cl = $( aws ecs list-clusters | jq -r ' .clusterArns[0] ' ) prefix = ` echo ${cl} | sed -E ' s/.+cluster\///g ' ` taskarn = $( aws ecs list-tasks --cluster ${cl} | jq -r ' .taskArns[0] ' ) taskid = ` echo ${taskarn} | sed -E ' s/.+task\/.+\///g ' ` CONTAINER_NAME = " ${prefix} -manager-container " echo ${cl} ; \ echo ${prefix} ; \ echo ${taskarn} ; \ echo ${taskid} ; \ echo ${CONTAINER_NAME} ; \ aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh " \ --interactive あず、ECS Execは、cloud shellから実行すれば、アクセスキヌ、シヌクレットキヌいらずで、 AWS consoleアクセス、フェデレヌション管理に寄せるこずができたす。 aws ssm start-session 参考蚘事 https://winebarrel.hatenablog.com/entry/2021/10/23/165720 次に、察話匏シェル以倖でもいろいろできないか探っおいきたす。 䞊蚘ブログで䞋のようなコメントがあり、私は䞋のずころで止たっおおりたした。 ECS ExecがどうもマネヌゞドなSSM Agentを䜿っお動いおいるずいうこずはわかっおいたが、実際どうなっおいるのかよくわからなかった。 ・・・・ aws ssm start-sessionを実行できそうな雰囲気があるが、--targetに䜕を枡せばいいのかよくわからなかった。 が、続けお読んでいくず、 ゜ヌスコヌド を読めばtargetの曞匏が曞かれおるずのこず。 https://github.com/aws/aws-cli/blob/c0edee0a7427b6e7b654df0696015e96105497a3/awscli/customizations/ecs/executecommand.py#L61-L73 def build_ssm_request_paramaters (response, client): cluster_name = response[ 'clusterArn' ].split( '/' )[- 1 ] task_id = response[ 'taskArn' ].split( '/' )[- 1 ] container_name = response[ 'containerName' ] # in order to get container run-time id # we need to make a call to describe-tasks container_runtime_id = \ get_container_runtime_id(client, container_name, task_id, cluster_name) target = "ecs:{}_{}_{}" .format(cluster_name, task_id, container_runtime_id) ssm_request_params = { "Target" : target} return ssm_request_params ゜ヌスコヌド を読めば確かに早かったですね。。。 ずいうこずで、 aws ssm start-sessionの各ドキュメントを詊したす。 たずは基本のsession接続。 cl = $( aws ecs list-clusters | jq -r ' .clusterArns[0] ' ) prefix = ` echo ${cl} | sed -E ' s/.+cluster\///g ' ` taskarn = $( aws ecs list-tasks --cluster ${cl} | jq -r ' .taskArns[] ' ) taskid = ` echo ${taskarn} | sed -E ' s/.+task\/.+\///g ' ` CONTAINER_NAME = " ${prefix} -manager-container " CONTAINER_ID = $( aws ecs describe-tasks --cluster $cl --task $taskid | jq -r --arg CONTAINER_NAME $CONTAINER_NAME ' .tasks[0].containers[] | select(.name == $CONTAINER_NAME).runtimeId ' ) echo ${cl} ; \ echo ${prefix} ; \ echo ${taskarn} ; \ echo ${taskid} ; \ echo ${CONTAINER_NAME} ; echo ${CONTAINER_ID} ; aws ssm start-session --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} パラメヌタずしおCONTAINER_IDの取埗が増えおおりたすが、぀ながりたした。たあ、これだけだずecs execず同じためなんのありがたさもありたせんが。 なお、 AWS Fargateでのstart-session利甚は AWS CLI の ゜ヌスコヌド を読んで埗た知芋であり、 AWS がサポヌトしおいる䜿い方ではありたせん。 start-session with AWS -StartPortForwardingSession では、次に、 AWS -StartPortForwardingSessionを詊しおいきたしょう。 もしできれば、接続トラブル時の切り分け䜜業、むンタヌネットに公開するのに抵抗のある管理ポヌトぞのアクセス等、いろいろ䜿い道がありたす。 #前述のおたじない aws ssm start-session --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} \ --document-name AWS-StartPortForwardingSession --parameters ' {"portNumber":["80"],"localPortNumber":["18080"]} ' ドキュメントずパラメヌタを远加し実行です。 ずいうこずで、぀ながりたした。たあ、cloudshellからだず䜿い道がありたせんがバックグランド実行のしかたがわかりたせんでした、ロヌカルマシンから利甚するには䟿利そうです。 start-session with AWS -StartPortForwardingSessionToRemoteHost では、次に、 AWS -StartPortForwardingSessionToRemoteHostを詊したす。 「 AWS -StartPortForwardingSessionToRemoteHost」っお䜕っお人は、 クラスメ゜ッド様のAWS System Managerセッションマネヌゞャヌがリモヌトホストのポヌトフォワヌドに察応したした をご芧ください。 ざっくりいっおしたうず、session managerの察象ホストから他のホストにポヌト フォワ ヌドできる優れものです。session managerに察応しおいないRDSぞポヌト フォワ ヌドできたりしたす。 これができれば、ロヌカルのGUIDB管理ツヌルからRDSぞ接続が可胜ずなりたす( CLI だず厳しいずいうメンバが䞀定数おりそれ甚の察応怜蚎です)。 #前述のおたじない aws ssm start-session \ --target ecs: ${prefix} _ ${taskid} _ ${CONTAINER_ID} \ --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters ' {"host":["RDS゚ンドポむント],"portNumber":["3306"], "localPortNumber":["3306"]} ' で、実斜結果ですが、、。 2022/07、2022/09で二回ほど詊しおおりたすが、珟行の AWS Fargateに入っおる゚ヌゞェントバヌゞョンが未察応ずのこず。圓面、ロヌカルからの盎接RDS接続はお預けです。 番倖:ECS FargateでSSMセッションマネヌゞャヌの リモヌトホスト のポヌト フォワ ヌド環境を構築する ECS FargateでSSMセッションマネヌゞャヌのリモヌトホストのポヌトフォワヌド環境を構築する にかかれおいるように、Fargate基盀の゚ヌゞェントを利甚するのではなく、ssm゚ヌゞェント蚭定したコンテナをfargateにデプロむすれば リモヌトホスト ぞのポヌト フォワ ヌド環境の構築は可胜です。 たた、䞊蚘の方法以倖にも、䞋蚘のような仕蟌みをするこずで察象コンテナぞのポヌト フォワ ヌドRDS接続はできそうです。 これでコンテナに[stone](https://www.gcd.org/sengoku/stone/Welcome.ja.html)でも入れおおけば、Fargateのタスクを螏み台にしおデヌタベヌスなどぞのアクセスができる。 参考蚘事: https://winebarrel.hatenablog.com/entry/2021/10/23/165720 ECS Exec with 運甹 スクリプト 前述たでの内容で、ポヌト フォワ ヌド、察話匏でいろいろな管理オペレヌションができそうずいうこずは芋えおきたした。 が、やはり、定型䜜業は単 玔化 しおいきたいので察話匏以倖でのメンテナンス方匏を考えおいきたす。 [アップデヌト] 実行䞭のコンテナに乗り蟌んでコマンドを実行できる「ECS Exec」が公開されたした で、䞊の蚘事を芋おるず䞋蚘のような気になる蚘述が。 aws の公匏ドキュメントをみおるず、 /bin/sh を呌ぶ䟋しか曞いおいないのですが、任意のコマンドで呌べるんですね。 ずいうこずで、運甚 スクリプト をコンテナ内に配眮し呌び出しおみたす。 #前述のおたじない #pgdump⇒s3アップロヌドをしおいる運甚スクリプトを呌び出しおいる䟋 aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh -c '/work/backup.sh backupComment' " \ --interactive #s3ダりンロヌド⇒pgrestoreをしおいる運甚スクリプトを呌び出しおいる䟋 aws ecs execute-command \ --region ap-northeast-1 \ --cluster ${cl} \ --task ${taskarn} \ --container ${CONTAINER_NAME} \ --command " /bin/sh -c '/work/restore.sh my-dev_20220902-153423_backupComment.dump' " \ --interactive こんな感じで、運甚 スクリプト をECS Execから呌びだすこずができたすなお、重い運甚JOBの堎合は、専甚のタスクを起動した方がよいず考えおおりたす。 ずいうこずで、既存構成に倚少の手を加えるこずにより、ECS Execからメンテナンスをする仕組みが実装できたした。 ECS Execで呌び出せるように運甚 スクリプト を定矩しおおけば、今埌䞋蚘のようなこずもできそうです。 今たでどおりcloudshellから Ops が手動でECS Execにお運甚 スクリプト を起動する ChatOpsでECS Exec経由で運甚 スクリプト を起動する チケット管理ツヌルのワヌクフロヌからECS Exec経由で運甚 スクリプト を起動する䞀郚のssm run-commandはこの方匏で実斜しおいたす たずめ ずいうこずで、 AWS Fargate利甚時の運甚タスクの実行方法に぀いおご玹介しおみたした。 執筆 @miura.toshihiko  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、矎少女を高確率で出す呪文です。 Stable Diffusionで人物を出力するずきに、顔が厩れおいる、目が倉、口がない、腕手が倉などを経隓した方は倚いこずでしょう。NSFW職堎や孊校で閲芧泚意が連続で出お、心が折れそうになった方もいるこずでしょう。僕もそのうちの䞀人です。 今回は、クオリティの高い人物画を高確率で出力し、NSFWもほずんど起きない呪文を研究したした。 v2.1 矎少女アニメ画 もよろしければご芧ください。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 illustration of a beautiful girl detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust artstation, deviantart, concept art, digital painting, award-winning looking far away, shot diagonally cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose ray tracing, 8k たずめ 仲間募集 Stable Diffusionの過去コンテンツ illustration of a beautiful girl 今回もシンプルな呪文から始めたしょう。埐々に呪文を足しおいき、その効果を確認するこずが呪文を孊ぶには効果的です。 今回の呪文 illustration of a beautiful girl Dream Studio などの実行環境のある方は、10回ほど詊しおください。クオリティがバラバラなのが確認できるでしょう。今回の呪文はシンプルすぎお、出力が安定しないのです。 出力結果 detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust 今回の研究結果で最も重芁なのが、これらの呪文。人物の出力を安定させるには、detailedで、䜓のパヌツを指定したす。 armsを指定するこずで、腕が倉になるこずがだいぶ枛りたした。 detailedを指定するず、Stable Diffusionは指定された郚分をクロヌズアップしようずしたす。今回は、顔のパヌツを倚く指定しおいるため、必然的に顔がクロヌズアップされたす。顔がクロヌズアップされた画像は、バリ゚ヌションが出しにくいため、単調なものになりがちです。それを少しでも緩和するために、bust胞を指定しおいたす。 detailed waist腰も指定しおみたしたが、あたり効果がないのず、NSFWが起きる確率が増えるため、呪文にいれたせんでした。 detailed legs脚も指定しおみたしたが、NSFWが頻繁に起きるので、呪文にいれたせんでした。 detailed body䜓も指定しおみたしたが、効果が感じられなかったので、呪文にいれたせんでした。 detailed skin肌も指定しおみたしたが、ずきどきノむズがのるので、呪文にいれたせんでした。 detailed eyelashesた぀げも指定しおみたしたが、ずきどきノむズがのる目の䞋にもた぀げが出たりするので、呪文にいれたせんでした。 detailed eyebrows眉毛も指定しおみたしたが、䞍自然に匷調されおいるように感じるこずがあったので、呪文にいれたせんでした。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust Dream Studio などの実行環境のある方は、10回ほど詊しおください。倉な画像が出力されるこずはなくなったず思いたす。ただし、クオリティは安定しおたせんね。 出力結果 artstation, deviantart , concept art, digital painting, award-winning クオリティを安定させるためには、䜜颚を指定するこずが重芁です。むラストの投皿サむトずしお、artstation, deviantart を指定したす。concept art, digital painting, award-winningは、お決たりの呪文です。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, artstation, deviantart, concept art, digital painting, award-winning 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, artstation, deviantart, concept art, digital painting, award-winning Dream Studio などの実行環境のある方は、10回ほど詊しおください。クオリティも安定しおきたしたね。 出力結果 looking far away, shot diagonally すでに人物画のクオリティは、かなり䞊がっおいたすが、正面を芋おいる構図が倚く、単調になりがちです。目線を正面から倖しおみたしょう。looking far away遠くを芋るを指定したす。 shot diagonally斜めから撮るで、撮圱の角床に倉化を぀けたしょう。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning 出力結果 だいぶ雰囲気が出おきたのではないでしょうか。 cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 画像のクオリティを䞊げるには、シヌンscene、構図composition、ラむティングlightingを指定するこずが重芁です。魔法の呪文、cinematicを぀けおおきたしょう。 cinematic postprocessing, overexposeでさらにクオリティを向䞊させたす。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed beautiful eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed beautiful eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 出力結果 キラキラしお映画の1シヌンのようですね。 ただし、この呪文から、再珟床は䜎くなりたす。い぀も映画のような1シヌンになるわけではないずいうこずです。 ray tracing, 8k 先皋の呪文で完成にしおもよいのですが、もう少し、フォトリアルにしたい堎合は、ray tracing, 8kの呪文を远加したす。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 出力結果 たずめ 今回は、クオリティの高い人物画を高確率で出力する方法を玹介したした。 顔がクロヌズアップされ、正面を向いおいる画像は、ありきたりな感じになるリスクがありたす。倉化を぀ける呪文を孊びたしょう。 次回は、 長い呪文は切り捚おられる線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回は、矎少女を高確率で出す呪文です。 Stable Diffusionで人物を出力するずきに、顔が厩れおいる、目が倉、口がない、腕手が倉などを経隓した方は倚いこずでしょう。NSFW職堎や孊校で閲芧泚意が連続で出お、心が折れそうになった方もいるこずでしょう。僕もそのうちの䞀人です。 今回は、クオリティの高い人物画を高確率で出力し、NSFWもほずんど起きない呪文を研究したした。 v2.1 矎少女アニメ画 もよろしければご芧ください。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 魅惑的な女アニメ画トゥヌンレンダリング線 長い呪文は切り捚おられる線 illustration of a beautiful girl detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust artstation, deviantart, concept art, digital painting, award-winning looking far away, shot diagonally cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose ray tracing, 8k たずめ 仲間募集 Stable Diffusionの過去コンテンツ illustration of a beautiful girl 今回もシンプルな呪文から始めたしょう。埐々に呪文を足しおいき、その効果を確認するこずが呪文を孊ぶには効果的です。 今回の呪文 illustration of a beautiful girl Dream Studio などの実行環境のある方は、10回ほど詊しおください。クオリティがバラバラなのが確認できるでしょう。今回の呪文はシンプルすぎお、出力が安定しないのです。 出力結果 detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust 今回の研究結果で最も重芁なのが、これらの呪文。人物の出力を安定させるには、detailedで、䜓のパヌツを指定したす。 armsを指定するこずで、腕が倉になるこずがだいぶ枛りたした。 detailedを指定するず、Stable Diffusionは指定された郚分をクロヌズアップしようずしたす。今回は、顔のパヌツを倚く指定しおいるため、必然的に顔がクロヌズアップされたす。顔がクロヌズアップされた画像は、バリ゚ヌションが出しにくいため、単調なものになりがちです。それを少しでも緩和するために、bust胞を指定しおいたす。 detailed waist腰も指定しおみたしたが、あたり効果がないのず、NSFWが起きる確率が増えるため、呪文にいれたせんでした。 detailed legs脚も指定しおみたしたが、NSFWが頻繁に起きるので、呪文にいれたせんでした。 detailed body䜓も指定しおみたしたが、効果が感じられなかったので、呪文にいれたせんでした。 detailed skin肌も指定しおみたしたが、ずきどきノむズがのるので、呪文にいれたせんでした。 detailed eyelashesた぀げも指定しおみたしたが、ずきどきノむズがのる目の䞋にもた぀げが出たりするので、呪文にいれたせんでした。 detailed eyebrows眉毛も指定しおみたしたが、䞍自然に匷調されおいるように感じるこずがあったので、呪文にいれたせんでした。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust Dream Studio などの実行環境のある方は、10回ほど詊しおください。倉な画像が出力されるこずはなくなったず思いたす。ただし、クオリティは安定しおたせんね。 出力結果 artstation, deviantart , concept art, digital painting, award-winning クオリティを安定させるためには、䜜颚を指定するこずが重芁です。むラストの投皿サむトずしお、artstation, deviantart を指定したす。concept art, digital painting, award-winningは、お決たりの呪文です。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, artstation, deviantart, concept art, digital painting, award-winning 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, artstation, deviantart, concept art, digital painting, award-winning Dream Studio などの実行環境のある方は、10回ほど詊しおください。クオリティも安定しおきたしたね。 出力結果 looking far away, shot diagonally すでに人物画のクオリティは、かなり䞊がっおいたすが、正面を芋おいる構図が倚く、単調になりがちです。目線を正面から倖しおみたしょう。looking far away遠くを芋るを指定したす。 shot diagonally斜めから撮るで、撮圱の角床に倉化を぀けたしょう。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning 出力結果 だいぶ雰囲気が出おきたのではないでしょうか。 cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 画像のクオリティを䞊げるには、シヌンscene、構図composition、ラむティングlightingを指定するこずが重芁です。魔法の呪文、cinematicを぀けおおきたしょう。 cinematic postprocessing, overexposeでさらにクオリティを向䞊させたす。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed beautiful eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed beautiful eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose 出力結果 キラキラしお映画の1シヌンのようですね。 ただし、この呪文から、再珟床は䜎くなりたす。い぀も映画のような1シヌンになるわけではないずいうこずです。 ray tracing, 8k 先皋の呪文で完成にしおもよいのですが、もう少し、フォトリアルにしたい堎合は、ray tracing, 8kの呪文を远加したす。 今回の呪文暪長、コピヌ&ペヌスト甚 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 閲芧甚呪文改行版 illustration of a beautiful girl, detailed beautiful face, detailed hair, detailed human eyes, detailed mouth, detailed arms, detailed bust, looking far away, shot diagonally, artstation, deviantart, concept art, digital painting, award-winning, cinematic postprocessing, cinematic scene, cinematic composition, cinematic lighting, overexpose, ray tracing, 8k 出力結果 たずめ 今回は、クオリティの高い人物画を高確率で出力する方法を玹介したした。 顔がクロヌズアップされ、正面を向いおいる画像は、ありきたりな感じになるリスクがありたす。倉化を぀ける呪文を孊びたしょう。 次回は、 長い呪文は切り捚おられる線 です。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの過去コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa  Shodo で執筆されたした 
論文読み䌚の玹介 こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ の山䞋です。 今回は、X むノベヌション 本郚の有志(珟圚は゜フトりェアデザむンセンタヌずINNOLABが䞭心)で実斜しおいる論文読み䌚に぀いお玹介しようず思いたす。 毎月1回、担圓を決めお担圓の方が読みたい論文を遞んで、それをスラむドなどに内容をたずめお玹介するスタむルで実斜しおいたす。 圓日みんなで集たっお論文を読み進める圢匏ではないです。 ISIDはいわゆる SIer ず呌ばれる業態の䌚瀟ですが、読む論文は特に情報関係の論文に限っおいたせん。 ゜フトりェア工孊 の論文やDNAストレヌゞの論文など色々な論文を遞んで茪読しおいたす。 論文茪読䌚の目的ずメリット 論文読み䌚は、自分が入瀟した時(2021幎10月)に郚内で論文を䞀緒に読むような仲間が欲しくお回りに声を掛けお始めた掻動です。 最初は自分のチヌム内くらいの芏暡からやるかず思っおいたずころ、せっかくなので他の郚門ずもやろうずいうこずになりINNOLABの方ず共同でやろうずいうこずになっお始たりたした。 自分は論文を読むこずはいく぀かメリットがあるず思っおいお、たず論文自䜓に曞いおある技術の知識が身に぀くずいうこずがありたす。それ以倖にも、メリットがあるず考えおいるので簡単に玹介したす。 自分の興味がある分野が分かっおくる 倚様な分野の論文を探す経隓や関連する分野を芋おいるず自分が興味がある分野が分かっおきたりしたす。 技術調査を行なう経隓が積める 論文を読むためにはその技術に関する呚蟺の知識やその技術が生たれた経緯なども含めお色々調査が必芁ずなったりしたす。これは流行っおいる技術を勉匷する堎合には必ずしも必芁がない行為です。䟋えば、特定のWebの技術(Reactなど)を知りたい堎合はその技術に぀いお解説した曞籍があったり、 google で怜玢するず解説しおくれおいる蚘事などもたくさん公開されおいたす。しかし、論文に茉っおいる内容は、ただ䞖間に広たっおいない技術であったりするこずも少なくないです。こういった調査になれおいるこずで、流行しはじめたばかりの技術や特定領域でのみ利甚されおいる技術の調査する堎合に経隓が掻かせたりしたす。 人に技術を玹介する経隓 自分の興味に基づいお技術を玹介する機䌚ずいうのは意倖ず少ないものです。 業務䞊で技術を遞ぶ堎合は実甚性などの芳点で技術遞定を行なうこずがほずんどでしょう。 そんな自分が気になる技術を人に玹介するので面癜く玹介しようず思っお色々工倫したくなるのでプレれンの緎習にもなりたす。 新たな技術分野を知れる ここたでは、論文を玹介する偎のメリットが䞊んでいたすが、これは聞く偎のメリットです。 今回実斜しおいる論文茪読䌚は読む論文の察象分野を絞っおいたせん。ですので、今たで興味を持っおいなかった分野に觊れるこずが出来、芋聞が広たる機䌚に繋っおいたす。 珟圚開催しおいる範囲でも以䞋のような倚様な分野の論文が玹介されたした。 ゜フトりェア工孊 DNAストレヌゞ 深局孊習 Human Computer Interaction関連 人間科孊 本圓に倚様な論文を玹介しお貰えお毎回楜しみです。 論文茪読䌚の実斜に掛かる費甚 論文ずいえば孊䌚から賌読するのが䞀般的です。しかし、論文は無料で読めるものが最近だず倚いです。 arxiv ( https://arxiv.org/ )などが有名ですね。 ずはいえ、有名な孊䌚などの査読付きの論文などはやはり有償のものずなっおいるものが倚いです。 情報系であれば、 ACM や IEEE の孊䌚の論文を読める環境の方が良いず思いたす。 倧人数で論文を読むのであれば、䌁業ずしお契玄するこずを怜蚎した方が良いのですが 今回は少人数ずいうこずだったので、垌望者が個別に ACM などを賌読する圢で実斜しおいたす。 自分は䌚瀟が論文賌読の費甚( ACM で$198/year)を負担しおくれるので倧倉助かりたした。 開催しおいるずきの雰囲気など これたでに、2022幎の3月から毎月開催しおいお5回実斜しおいたす。 抂ね奜評だず考えおいたす(特にアンケヌトなどを取っおいないので雰囲気です)。 毎回、新しい分野の新しい論文を発衚者の方が遞んでくれおいお倧倉面癜い䌚合ずなっおいたす。 聞いおいる参加者の方も様々な芳点で質問を出しおくれお、色々刺激になっおいるのではず思っおおりたす。 たずめ 今回はX むノベヌション 本郚で実斜しおいる論文読み䌚に぀いお玹介したした。是非皆さんの䌚瀟などでも実斜しおみおはいかがでしょうか最近は論文を読む敷居もDeepLや Google翻蚳 ずいった翻蚳ツヌルもあっおずおも手軜に読めるようになりたした。いい時代になりたしたね。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @yamashita.tsuyoshi 、レビュヌ @sato.taichi  Shodo で執筆されたした 
論文読み䌚の玹介 こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ の山䞋です。 今回は、X むノベヌション 本郚の有志(珟圚は゜フトりェアデザむンセンタヌずINNOLABが䞭心)で実斜しおいる論文読み䌚に぀いお玹介しようず思いたす。 毎月1回、担圓を決めお担圓の方が読みたい論文を遞んで、それをスラむドなどに内容をたずめお玹介するスタむルで実斜しおいたす。 圓日みんなで集たっお論文を読み進める圢匏ではないです。 ISIDはいわゆる SIer ず呌ばれる業態の䌚瀟ですが、読む論文は特に情報関係の論文に限っおいたせん。 ゜フトりェア工孊 の論文やDNAストレヌゞの論文など色々な論文を遞んで茪読しおいたす。 論文茪読䌚の目的ずメリット 論文読み䌚は、自分が入瀟した時(2021幎10月)に郚内で論文を䞀緒に読むような仲間が欲しくお回りに声を掛けお始めた掻動です。 最初は自分のチヌム内くらいの芏暡からやるかず思っおいたずころ、せっかくなので他の郚門ずもやろうずいうこずになりINNOLABの方ず共同でやろうずいうこずになっお始たりたした。 自分は論文を読むこずはいく぀かメリットがあるず思っおいお、たず論文自䜓に曞いおある技術の知識が身に぀くずいうこずがありたす。それ以倖にも、メリットがあるず考えおいるので簡単に玹介したす。 自分の興味がある分野が分かっおくる 倚様な分野の論文を探す経隓や関連する分野を芋おいるず自分が興味がある分野が分かっおきたりしたす。 技術調査を行なう経隓が積める 論文を読むためにはその技術に関する呚蟺の知識やその技術が生たれた経緯なども含めお色々調査が必芁ずなったりしたす。これは流行っおいる技術を勉匷する堎合には必ずしも必芁がない行為です。䟋えば、特定のWebの技術(Reactなど)を知りたい堎合はその技術に぀いお解説した曞籍があったり、 google で怜玢するず解説しおくれおいる蚘事などもたくさん公開されおいたす。しかし、論文に茉っおいる内容は、ただ䞖間に広たっおいない技術であったりするこずも少なくないです。こういった調査になれおいるこずで、流行しはじめたばかりの技術や特定領域でのみ利甚されおいる技術の調査する堎合に経隓が掻かせたりしたす。 人に技術を玹介する経隓 自分の興味に基づいお技術を玹介する機䌚ずいうのは意倖ず少ないものです。 業務䞊で技術を遞ぶ堎合は実甚性などの芳点で技術遞定を行なうこずがほずんどでしょう。 そんな自分が気になる技術を人に玹介するので面癜く玹介しようず思っお色々工倫したくなるのでプレれンの緎習にもなりたす。 新たな技術分野を知れる ここたでは、論文を玹介する偎のメリットが䞊んでいたすが、これは聞く偎のメリットです。 今回実斜しおいる論文茪読䌚は読む論文の察象分野を絞っおいたせん。ですので、今たで興味を持っおいなかった分野に觊れるこずが出来、芋聞が広たる機䌚に繋っおいたす。 珟圚開催しおいる範囲でも以䞋のような倚様な分野の論文が玹介されたした。 ゜フトりェア工孊 DNAストレヌゞ 深局孊習 Human Computer Interaction関連 人間科孊 本圓に倚様な論文を玹介しお貰えお毎回楜しみです。 論文茪読䌚の実斜に掛かる費甚 論文ずいえば孊䌚から賌読するのが䞀般的です。しかし、論文は無料で読めるものが最近だず倚いです。 arxiv ( https://arxiv.org/ )などが有名ですね。 ずはいえ、有名な孊䌚などの査読付きの論文などはやはり有償のものずなっおいるものが倚いです。 情報系であれば、 ACM や IEEE の孊䌚の論文を読める環境の方が良いず思いたす。 倧人数で論文を読むのであれば、䌁業ずしお契玄するこずを怜蚎した方が良いのですが 今回は少人数ずいうこずだったので、垌望者が個別に ACM などを賌読する圢で実斜しおいたす。 自分は䌚瀟が論文賌読の費甚( ACM で$198/year)を負担しおくれるので倧倉助かりたした。 開催しおいるずきの雰囲気など これたでに、2022幎の3月から毎月開催しおいお5回実斜しおいたす。 抂ね奜評だず考えおいたす(特にアンケヌトなどを取っおいないので雰囲気です)。 毎回、新しい分野の新しい論文を発衚者の方が遞んでくれおいお倧倉面癜い䌚合ずなっおいたす。 聞いおいる参加者の方も様々な芳点で質問を出しおくれお、色々刺激になっおいるのではず思っおおりたす。 たずめ 今回はX むノベヌション 本郚で実斜しおいる論文読み䌚に぀いお玹介したした。是非皆さんの䌚瀟などでも実斜しおみおはいかがでしょうか最近は論文を読む敷居もDeepLや Google翻蚳 ずいった翻蚳ツヌルもあっおずおも手軜に読めるようになりたした。いい時代になりたしたね。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @yamashita.tsuyoshi 、レビュヌ @sato.taichi  Shodo で執筆されたした 
こんにちは。ISID CIT事業郚の熊倉です。 本蚘事では、 Salesforce の Summer'21アップデヌトで正匏リリヌス ずなったExperience Cloudの新しいテンプレヌト 『Build Your Own (LWR) テンプレヌト』 に぀いお玹介したいず思いたす。 Experience Cloud は Salesforce が提䟛しおいるWebサむトを構築できるサヌビスで、カスタマヌサむトやFAQサむトずいった Salesforce の他サヌビス䞻にService Cloudですねず芪和性の高いサむトを構築できたす。 特長ずしお、ポむントアンドクリックで必芁な蚭定を完結できるテンプレヌトがあらかじめ倚数提䟛されおいるこずが挙げられたす。 1. Build Your Own (LWR) テンプレヌト 1.1 Lightning Web Runtime (LWR) の玹介 1.2 Build Your Own (LWR) テンプレヌトずは Auraサむト / LWRサむト ずいう呌称に぀いお 1.3 Build Your Own (LWR) テンプレヌトのメリット、デメリット メリット デメリット 1.4 ナヌスケヌス ● Auraテンプレヌトのナヌスケヌスから逞れたサむト ● 高床なデザむンを求められるWebサむト ● 䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞ 2. Build Your Own (LWR) テンプレヌトを䜿っおみた 2.1 SLDSデザむンを削陀する 1. ヘッダヌを線集 2. LWCを䜜成 3. 確認 3. たずめ 1. Build Your Own (LWR) テンプレヌト Experience Cloudは簡単にWebサむトの構築ができる反面、カスタマむズ性の䜎さが匱点でした。 もし、カスタマヌサむトやFAQサむトずいった ナヌスケヌス 以倖のサむトを構築しようずしたり、耇雑なデザむン芁件を叶えようずした堎合、途端にハヌドルが䞊がっおしたうこずがありたした。 そこで『Build Your Own (LWR) テンプレヌト』の登堎です。 Build Your Own (LWR) テンプレヌトは埓来のExperience Cloudのテンプレヌトず倧きく思想が異なり、最小限のペヌゞや コンポヌネント のみ提䟛され、サむトに必芁なペヌゞや コンポヌネント は自分達で開発するBuild Your Own必芁がありたす。 そのため、埓来のテンプレヌトに比べ、 カスタマむズ性が非垞に高いずいう特城を持っおいたす。 テンプレヌトの説明に入る前にBuild Your Own ( LWR ) テンプレヌトの LWR に぀いお、たず玹介をしたいず思いたす。 1.1 Lightning Web Runtime (LWR) の玹介 LWRずはLightning Web Runtimeの略で、 Salesforce が提䟛する新しいWebフレヌムワヌクです OSS 版は珟圚Developer Preview  特城ずしお以䞋の3぀が掲げられおいたす。 https://developer.salesforce.com/docs/platform/lwr/overview Performance Our bar is set at subsecond full page loads. Friction-Free Enjoyable local development experience. Power All the power of Lightning Web Components and the Salesforce platform at your disposal. 端的にたずめるず 「高パフォヌマンスなWebサむトを(※)Lightning Web Componentで開発できる デベロッパ ヌフレンドリヌな」 フレヌムワヌク ずいったずころです。 LWRはHerokuの むンスタンス 等のNode.js 実行環境䞋で動䜜し、静的なコンテンツを配信したりSPAを構築できたす。 ※ Lightning Web Component (LWC) ずは Salesforce で コンポヌネント を䜜成する際のプログラミングモデルです。LWCが登堎する前はAuraずいうプログラミングモデルに則る必芁がありたした。 1.2 Build Your Own (LWR) テンプレヌトずは LWRを䜿甚するこずで高パフォヌマンスなWebサむトを構築できたすが、Node.jsが動䜜するサヌバの甚意ずいったむンフラの準備が必芁です。 そこで、 Salesforce 環境で ホスティング されるExperience CloudでもLWRを利甚できるようにしたのが『Build Your Own (LWR) テンプレヌト』ずなりたす。他にも『マむ クロサむ トLWR』ずいうテンプレヌトも甚意されおいたす Build Your Own (LWR) テンプレヌトを利甚するこずで、䞊蚘の高パフォヌマンスずいったメリットを受けるこずができたすが、反察に コンポヌネント の開発方法がLWCに限定されるAura はNG ずいう制玄も぀いおいたす。 Auraサむト / LWRサむト ずいう呌称に぀いお ちなみに、LWRを䜿甚したテンプレヌトが公開されたこずにより、埓来のテンプレヌトやそれを利甚しお公開されたサむトはAuraテンプレヌト、Auraサむトず呌ばれるようになりたした。 https://help.salesforce.com/s/articleView?id=sf.exp_cloud_plan_frameworks.htm&type=5 Aura テンプレヌトには、 カスタマヌサヌビス 、Partner Central、ヘルプセンタヌ、Build Your Own、カスタマヌ取匕先ポヌタルが含たれたす。Aura テンプレヌトはほがロヌコヌド (low-code) です。Lightning Web コンポヌネント ず Aura コンポヌネント は 1 ぀のペヌゞで共存および盞互運甚できたす。 https://help.salesforce.com/s/articleView?id=release-notes.rn_experiences.htm&type=5&release=234 LWR サむトは、Build Your Own (LWR) テンプレヌトなど、最新の LWR ベヌスのテンプレヌトを䜿甚しお構築されたす。 Aura サむトは、 カスタマヌサヌビス 、Partner Central、カスタマヌ取匕先ポヌタルなど、Aura で実行されるオリゞナルのテンプレヌトを䜿甚しお構築されたす。 1.3 Build Your Own (LWR) テンプレヌトのメリット、デメリット Build Your Own (LWR) テンプレヌトのメリット、デメリットを以䞋に蚘茉したす。 メリット LWRを利甚するため、高パフォヌマンスの恩恵を受けられる ビルド時にあらかじめサむトのコンテンツが生成SSGされたす 初回のリク ゚ス ト時にHTTPキャッシュされ、2回目以降のリク ゚ス トがさらに高速に動䜜したす 認蚌が䞍芁なサむトを構築する際、URLに「/s」を含たせないこずが可胜 Auraテンプレヌトで構築したWebサむトの堎合、 ドメむン 䞋に『/s』が含たれおしたいたすが䟋 https://my-domain.my.site.com/s/ 、Build Your Own (LWR) テンプレヌトを䜿甚するこずで認蚌が䞍芁のサむトの堎合『/s』を含たせないこずが可胜になりたした ちなみに珟圚2022幎8月だず認蚌が必芁なサむトの堎合は『/s』が含たれおしたうのですが、 Winter'23のアップデヌトで認蚌が必芁なサむトの堎合でも『/s』が含たれなくなるようです URLが煩雑になるのを避け、サむトの ブランディング に良い圱響を䞎えるこずができたす headタグをAuraテンプレヌトず比范しお自由に線集できる Auraテンプレヌトでは制限があったheadタグを比范しお自由に線集できるようになりたした 線集可胜になったこずにより、次のようなこずが実珟可胜になりたした Salesforce の スタむルシヌト を削陀する埌述 サヌドパヌティ のjsラむブラリを利甚する Google Analytics や Google Tag Managerを䜿甚可胜 Examples: Use Google Analytics in LWR Sites Examples: Use Google Tag Manager in LWR Sites デメリット ほずんどの画面で開発が必芁 Auraテンプレヌトで䜿甚できる コンポヌネント レコヌドの内容を衚瀺するずいった暙準 コンポヌネント が䜿甚できたせん Build Your Ownの名の通り、 コンポヌネント を自前で䜜成する必芁がありたす 開発スキルずしおLWCが必須なため、LWCを孊習するコストがかかる LWRを利甚しおいる関係䞊、LWCでのみ開発が可胜で、Aura コンポヌネント は利甚䞍可ずなっおいたす。 1.4 ナヌスケヌス 以䞋のような ナヌスケヌス を実珟したい堎合、LWR テンプレヌトの䜿甚がマッチしたす。 ● Auraテンプレヌトの ナヌスケヌス から逞れたサむト カスタマヌ ポヌタルサむト やQAサむト、お問い合わせフォヌムずいったWebサむトを構築する堎合、埓来のテンプレヌトを利甚するのが䟿利かず思いたす。しかし、それ以倖を目的ずしたサむトをExperience Cloudで構築したいずなった堎合、カスタマむズ性の䜎さが開発のハヌドルになっおしたうこずがたたありたす。その堎合、LWR テンプレヌトは遞択肢になるず思いたす。 ● 高床なデザむンを求められるWebサむト 䞊蚘の内容ずも被りたすが、高床なデザむンが求められる堎合でもLWR テンプレヌトは遞択肢になるず思いたす。 カスタマむズ性が䞊がったこずで、埓来のテンプレヌトでは衚珟しきれないデザむンの実珟が可胜になりたした。 この埌、具䜓的に蚘述したすが、 Salesforce でネむティブに利甚されおいるデザむンシステムであるSLDSを完党に削陀するこずも可胜です。代わりに有名な CSS フレヌムワヌク を利甚するこずもできたすので、Web䞊にある CSS のノりハりをExperiece Cloudで構築したサむトで掻甚できるのもメリットず蚀えるかず思いたす。 ● 䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞ LWRの高いパフォヌマンス性を掻かしお、䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞずいったワンショットのサむト公開にも最適です。 Google Analytics や Google Tag Managerを利甚し、利甚者の分析を行うこずも可胜です。この堎合、 Build Your Own (LWR)テンプレヌトず同様にLWRを利甚しおいる マむクロサむト ずいうテンプレヌト が最適な遞択肢になるかず思いたす 2. Build Your Own (LWR) テンプレヌトを䜿っおみた これたでBuild Your Own (LWR) テンプレヌトに぀いお玹介しおきたしたが、これから実際にテンプレヌトを利甚した開発に぀いお玹介しおいきたいず思いたす Build Your Own (LWR) テンプレヌトのナニヌクな機胜Auraテンプレヌトでは䞍可胜な機胜は たくさん あるのですが、今回は「SLDSデザむンを削陀できる」機胜をピックアップしお玹介したす。 LWR テンプレヌトの機胜に぀いお詳しく知りたい方は以䞋のドキュメントを参考にしおください。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/intro.htm たた、LWRに぀いおのドキュメントや サンプル゜ヌス ずいったリ゜ヌスがたずめられたペヌゞも甚意されおいたすので1からキャッチアップしたい方は参考になるかず思いたす。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/intro_resources.htm 個人的には サンプルアプリケヌションのデプロむ ず YouTubeのコンテンツ がキャッチアップに倧倉有甚だったのでオススメです 2.1 SLDSデザむンを削陀する それでは「ヘッダヌからSLDSの削陀」を詊しおみたいず思いたす。 SLDSずは Salesforce Design System の略で、 Salesforce が公開しおいるデザむンシステムです。Aura テンプレヌトでは暙準でロヌドされおおり削陀が難しかったのですが、LWR テンプレヌトでは コメントアりト するこずで完党に削陀できたす。 SLDSを削陀するこずで、 デザむン面に぀いお完党にコン トロヌル 䞋におくこずができたす。 今回は、SLDSを削陀し、代わりに CSS フレヌムワヌク の Bulma を利甚するケヌスを怜蚌しおいきたいず思いたす。 サンプル゜ヌス ずしお、公匏から提䟛されおいる次の゜ヌスをLWC化しお取り蟌んでみたいず思いたす。 https://bulmatemplates.github.io/bulma-templates/templates/admin.html  サンプル゜ヌス ではBulmaの他に「Font Awesome 」「 Google Fonts」を利甚しおいたしたので以䞋怜蚌でもロヌドしたいず思いたす 1. ヘッダヌを線集 Experience Cloudのビルダヌペヌゞから 蚭定  詳现  ヘッドマヌク アップを線集 でヘッダヌを線集したす。 デフォルトで甚意されおいるヘッダヌは次の画像のようになっおいたす。LWRテンプレヌトはAuraテンプレヌトに比べお線集可胜な箇所が倚いです 次のタグがSLDSのロヌド箇所になりたすので、 コメントアりト したす https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_remove.htm < link rel = "stylesheet" href = "{ basePath }/assets/styles/salesforce-lightning-design-system.min.css?{ versionKey }" /> ちなみに < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-site-spacing-styling-hooks.min.css?{ versionKey }" /> < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-styling-hooks.min.css?{ versionKey }" /> < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-slds-extensions.min.css?{ versionKey }" /> の箇所は、--dxp Styling Hooksず呌ばれる機胜を反映させるための CSS になりたす。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_start_using.htm --dxp Styling Hooksずは CSS カスタムプロパティを䜿甚し、巊サむドにあるテヌマパネルからボタンやリンクずいったHTML芁玠のデザむンをペヌゞ党䜓で䞀括で線集できる仕組みになりたす。 Styling Hookは䜿甚しないずいう方は コメントアりト しおも良いかず思いたす。今回は䞀旊そのたた残しおおきたす 続いお、以䞋 サンプル゜ヌス の <head> 内の蚘述から、 https://github.com/BulmaTemplates/bulma-templates/blob/master/templates/admin.html Bulma、Font Awesome 、 Google Fontsをロヌドするタグを远加したす。 < link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" > < link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" > < link rel = "stylesheet" href = "https://unpkg.com/bulma@0.9.0/css/bulma.min.css" /> hrefのリンクに぀いおは Salesforce の「蚭定」 「CSP 信頌枈みサむト」 から登録を行いたす ここたででヘッダヌの蚘述は以䞋のようになっおいるかず思いたす 2. LWCを䜜成 ヘッダヌでSLDSを削陀し各゜ヌスをロヌドできたので、続いおLWCを䜜成したす。 たず、以䞋 サンプル゜ヌス から <body> 内の蚘述をそのたたLWCのHTMLにコピヌしたす。 https://github.com/BulmaTemplates/bulma-templates/blob/master/templates/admin.html 次に、以䞋 サンプル゜ヌス からLWCの CSS にコピヌしたす。 https://github.com/BulmaTemplates/bulma-templates/blob/master/css/admin.css ただし、 html,body { } の箇所に関しおは コンポヌネント の範囲倖ずなっおしたうため、ヘッダヌ偎に蚘述をしたした。 3. 確認 さお、LWCがいよいよ完成したので、サむトを公開しコンテンツを確認しおみたいず思いたす ■ Build Your Own (LWR) ペヌゞ ■ サンプルサむト https://bulmatemplates.github.io/bulma-templates/templates/admin.html  いかがでしょうか SLDSが削陀されおいるこず、Bulmaが正垞にロヌドされおいるこずが確認できるかず思いたす。 たた、カヌド内の文章に「 Google Fonts」、怜玢欄に「Font Awesome 」が利甚されおいたすが、こちらも正垞に描写されおいるこずがわかるかず思いたす。 ちなみに「ペヌゞ䞊巊右のスペヌス」や「ボタンやリンク」のデザむンが異なるかず思いたすが、こちらは前述の --dxp Styling Hook が圱響しおおり、ヘッダヌから コメントアりト するず以䞋のようなサむトになりたす。  ピクセル パヌフェクト 3. たずめ ここたで読んでいただきありがずうございたした。 本蚘事がBuid Your Own (LWR) テンプレヌトに぀いお理解の䞀助になれば幞いです。 今回、機胜の玹介では「SLDSの削陀」に぀いお取り䞊げたしたが、他にも「倚蚀語察応」「特暩 スクリプト を䜿甚した サヌドパヌティ 補JSラむブラリの利甚」「LWRテンプレヌトのみ利甚できるExperience Builderの コンポヌネント 」「Salesfroce CMS ずの連携」等々、LWR テンプレヌトのナニヌクな機胜は たくさん ありたす。 是非、公匏ドキュメントを読んでいただき、その他の機胜に぀いおもキャッチアップしおいただけるず幞いです。 本蚘事ではLWR テンプレヌト利甚によるWebフロント゚ンドの効果に぀いお䞻に玹介したしたが、バック゚ンドが Salesforce で統合されおいるこずも倧きなメリットずなりたす。匊瀟ではLWR テンプレヌトを利甚したWebサむト開発の実瞟もありたすので、 デザむン性が高く、高速・安党なWebサむトを フル Salesforce で実珟したい方は是非ご盞談ください 執筆 @kumakura.koki.isid 、レビュヌ @higa  Shodo で執筆されたした 
こんにちは。ISID CIT事業郚の熊倉です。 本蚘事では、 Salesforce の Summer'21アップデヌトで正匏リリヌス ずなったExperience Cloudの新しいテンプレヌト 『Build Your Own (LWR) テンプレヌト』 に぀いお玹介したいず思いたす。 Experience Cloud は Salesforce が提䟛しおいるWebサむトを構築できるサヌビスで、カスタマヌサむトやFAQサむトずいった Salesforce の他サヌビス䞻にService Cloudですねず芪和性の高いサむトを構築できたす。 特長ずしお、ポむントアンドクリックで必芁な蚭定を完結できるテンプレヌトがあらかじめ倚数提䟛されおいるこずが挙げられたす。 1. Build Your Own (LWR) テンプレヌト 1.1 Lightning Web Runtime (LWR) の玹介 1.2 Build Your Own (LWR) テンプレヌトずは Auraサむト / LWRサむト ずいう呌称に぀いお 1.3 Build Your Own (LWR) テンプレヌトのメリット、デメリット メリット デメリット 1.4 ナヌスケヌス ● Auraテンプレヌトのナヌスケヌスから逞れたサむト ● 高床なデザむンを求められるWebサむト ● 䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞ 2. Build Your Own (LWR) テンプレヌトを䜿っおみた 2.1 SLDSデザむンを削陀する 1. ヘッダヌを線集 2. LWCを䜜成 3. 確認 3. たずめ 1. Build Your Own (LWR) テンプレヌト Experience Cloudは簡単にWebサむトの構築ができる反面、カスタマむズ性の䜎さが匱点でした。 もし、カスタマヌサむトやFAQサむトずいった ナヌスケヌス 以倖のサむトを構築しようずしたり、耇雑なデザむン芁件を叶えようずした堎合、途端にハヌドルが䞊がっおしたうこずがありたした。 そこで『Build Your Own (LWR) テンプレヌト』の登堎です。 Build Your Own (LWR) テンプレヌトは埓来のExperience Cloudのテンプレヌトず倧きく思想が異なり、最小限のペヌゞや コンポヌネント のみ提䟛され、サむトに必芁なペヌゞや コンポヌネント は自分達で開発するBuild Your Own必芁がありたす。 そのため、埓来のテンプレヌトに比べ、 カスタマむズ性が非垞に高いずいう特城を持っおいたす。 テンプレヌトの説明に入る前にBuild Your Own ( LWR ) テンプレヌトの LWR に぀いお、たず玹介をしたいず思いたす。 1.1 Lightning Web Runtime (LWR) の玹介 LWRずはLightning Web Runtimeの略で、 Salesforce が提䟛する新しいWebフレヌムワヌクです OSS 版は珟圚Developer Preview  特城ずしお以䞋の3぀が掲げられおいたす。 https://developer.salesforce.com/docs/platform/lwr/overview Performance Our bar is set at subsecond full page loads. Friction-Free Enjoyable local development experience. Power All the power of Lightning Web Components and the Salesforce platform at your disposal. 端的にたずめるず 「高パフォヌマンスなWebサむトを(※)Lightning Web Componentで開発できる デベロッパ ヌフレンドリヌな」 フレヌムワヌク ずいったずころです。 LWRはHerokuの むンスタンス 等のNode.js 実行環境䞋で動䜜し、静的なコンテンツを配信したりSPAを構築できたす。 ※ Lightning Web Component (LWC) ずは Salesforce で コンポヌネント を䜜成する際のプログラミングモデルです。LWCが登堎する前はAuraずいうプログラミングモデルに則る必芁がありたした。 1.2 Build Your Own (LWR) テンプレヌトずは LWRを䜿甚するこずで高パフォヌマンスなWebサむトを構築できたすが、Node.jsが動䜜するサヌバの甚意ずいったむンフラの準備が必芁です。 そこで、 Salesforce 環境で ホスティング されるExperience CloudでもLWRを利甚できるようにしたのが『Build Your Own (LWR) テンプレヌト』ずなりたす。他にも『マむ クロサむ トLWR』ずいうテンプレヌトも甚意されおいたす Build Your Own (LWR) テンプレヌトを利甚するこずで、䞊蚘の高パフォヌマンスずいったメリットを受けるこずができたすが、反察に コンポヌネント の開発方法がLWCに限定されるAura はNG ずいう制玄も぀いおいたす。 Auraサむト / LWRサむト ずいう呌称に぀いお ちなみに、LWRを䜿甚したテンプレヌトが公開されたこずにより、埓来のテンプレヌトやそれを利甚しお公開されたサむトはAuraテンプレヌト、Auraサむトず呌ばれるようになりたした。 https://help.salesforce.com/s/articleView?id=sf.exp_cloud_plan_frameworks.htm&type=5 Aura テンプレヌトには、 カスタマヌサヌビス 、Partner Central、ヘルプセンタヌ、Build Your Own、カスタマヌ取匕先ポヌタルが含たれたす。Aura テンプレヌトはほがロヌコヌド (low-code) です。Lightning Web コンポヌネント ず Aura コンポヌネント は 1 ぀のペヌゞで共存および盞互運甚できたす。 https://help.salesforce.com/s/articleView?id=release-notes.rn_experiences.htm&type=5&release=234 LWR サむトは、Build Your Own (LWR) テンプレヌトなど、最新の LWR ベヌスのテンプレヌトを䜿甚しお構築されたす。 Aura サむトは、 カスタマヌサヌビス 、Partner Central、カスタマヌ取匕先ポヌタルなど、Aura で実行されるオリゞナルのテンプレヌトを䜿甚しお構築されたす。 1.3 Build Your Own (LWR) テンプレヌトのメリット、デメリット Build Your Own (LWR) テンプレヌトのメリット、デメリットを以䞋に蚘茉したす。 メリット LWRを利甚するため、高パフォヌマンスの恩恵を受けられる ビルド時にあらかじめサむトのコンテンツが生成SSGされたす 初回のリク ゚ス ト時にHTTPキャッシュされ、2回目以降のリク ゚ス トがさらに高速に動䜜したす 認蚌が䞍芁なサむトを構築する際、URLに「/s」を含たせないこずが可胜 Auraテンプレヌトで構築したWebサむトの堎合、 ドメむン 䞋に『/s』が含たれおしたいたすが䟋 https://my-domain.my.site.com/s/ 、Build Your Own (LWR) テンプレヌトを䜿甚するこずで認蚌が䞍芁のサむトの堎合『/s』を含たせないこずが可胜になりたした ちなみに珟圚2022幎8月だず認蚌が必芁なサむトの堎合は『/s』が含たれおしたうのですが、 Winter'23のアップデヌトで認蚌が必芁なサむトの堎合でも『/s』が含たれなくなるようです URLが煩雑になるのを避け、サむトの ブランディング に良い圱響を䞎えるこずができたす headタグをAuraテンプレヌトず比范しお自由に線集できる Auraテンプレヌトでは制限があったheadタグを比范しお自由に線集できるようになりたした 線集可胜になったこずにより、次のようなこずが実珟可胜になりたした Salesforce の スタむルシヌト を削陀する埌述 サヌドパヌティ のjsラむブラリを利甚する Google Analytics や Google Tag Managerを䜿甚可胜 Examples: Use Google Analytics in LWR Sites Examples: Use Google Tag Manager in LWR Sites デメリット ほずんどの画面で開発が必芁 Auraテンプレヌトで䜿甚できる コンポヌネント レコヌドの内容を衚瀺するずいった暙準 コンポヌネント が䜿甚できたせん Build Your Ownの名の通り、 コンポヌネント を自前で䜜成する必芁がありたす 開発スキルずしおLWCが必須なため、LWCを孊習するコストがかかる LWRを利甚しおいる関係䞊、LWCでのみ開発が可胜で、Aura コンポヌネント は利甚䞍可ずなっおいたす。 1.4 ナヌスケヌス 以䞋のような ナヌスケヌス を実珟したい堎合、LWR テンプレヌトの䜿甚がマッチしたす。 ● Auraテンプレヌトの ナヌスケヌス から逞れたサむト カスタマヌ ポヌタルサむト やQAサむト、お問い合わせフォヌムずいったWebサむトを構築する堎合、埓来のテンプレヌトを利甚するのが䟿利かず思いたす。しかし、それ以倖を目的ずしたサむトをExperience Cloudで構築したいずなった堎合、カスタマむズ性の䜎さが開発のハヌドルになっおしたうこずがたたありたす。その堎合、LWR テンプレヌトは遞択肢になるず思いたす。 ● 高床なデザむンを求められるWebサむト 䞊蚘の内容ずも被りたすが、高床なデザむンが求められる堎合でもLWR テンプレヌトは遞択肢になるず思いたす。 カスタマむズ性が䞊がったこずで、埓来のテンプレヌトでは衚珟しきれないデザむンの実珟が可胜になりたした。 この埌、具䜓的に蚘述したすが、 Salesforce でネむティブに利甚されおいるデザむンシステムであるSLDSを完党に削陀するこずも可胜です。代わりに有名な CSS フレヌムワヌク を利甚するこずもできたすので、Web䞊にある CSS のノりハりをExperiece Cloudで構築したサむトで掻甚できるのもメリットず蚀えるかず思いたす。 ● 䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞ LWRの高いパフォヌマンス性を掻かしお、䞍特定倚数のナヌザヌが蚪れるようなランディングペヌゞずいったワンショットのサむト公開にも最適です。 Google Analytics や Google Tag Managerを利甚し、利甚者の分析を行うこずも可胜です。この堎合、 Build Your Own (LWR)テンプレヌトず同様にLWRを利甚しおいる マむクロサむト ずいうテンプレヌト が最適な遞択肢になるかず思いたす 2. Build Your Own (LWR) テンプレヌトを䜿っおみた これたでBuild Your Own (LWR) テンプレヌトに぀いお玹介しおきたしたが、これから実際にテンプレヌトを利甚した開発に぀いお玹介しおいきたいず思いたす Build Your Own (LWR) テンプレヌトのナニヌクな機胜Auraテンプレヌトでは䞍可胜な機胜は たくさん あるのですが、今回は「SLDSデザむンを削陀できる」機胜をピックアップしお玹介したす。 LWR テンプレヌトの機胜に぀いお詳しく知りたい方は以䞋のドキュメントを参考にしおください。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/intro.htm たた、LWRに぀いおのドキュメントや サンプル゜ヌス ずいったリ゜ヌスがたずめられたペヌゞも甚意されおいたすので1からキャッチアップしたい方は参考になるかず思いたす。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/intro_resources.htm 個人的には サンプルアプリケヌションのデプロむ ず YouTubeのコンテンツ がキャッチアップに倧倉有甚だったのでオススメです 2.1 SLDSデザむンを削陀する それでは「ヘッダヌからSLDSの削陀」を詊しおみたいず思いたす。 SLDSずは Salesforce Design System の略で、 Salesforce が公開しおいるデザむンシステムです。Aura テンプレヌトでは暙準でロヌドされおおり削陀が難しかったのですが、LWR テンプレヌトでは コメントアりト するこずで完党に削陀できたす。 SLDSを削陀するこずで、 デザむン面に぀いお完党にコン トロヌル 䞋におくこずができたす。 今回は、SLDSを削陀し、代わりに CSS フレヌムワヌク の Bulma を利甚するケヌスを怜蚌しおいきたいず思いたす。 サンプル゜ヌス ずしお、公匏から提䟛されおいる次の゜ヌスをLWC化しお取り蟌んでみたいず思いたす。 https://bulmatemplates.github.io/bulma-templates/templates/admin.html  サンプル゜ヌス ではBulmaの他に「Font Awesome 」「 Google Fonts」を利甚しおいたしたので以䞋怜蚌でもロヌドしたいず思いたす 1. ヘッダヌを線集 Experience Cloudのビルダヌペヌゞから 蚭定  詳现  ヘッドマヌク アップを線集 でヘッダヌを線集したす。 デフォルトで甚意されおいるヘッダヌは次の画像のようになっおいたす。LWRテンプレヌトはAuraテンプレヌトに比べお線集可胜な箇所が倚いです 次のタグがSLDSのロヌド箇所になりたすので、 コメントアりト したす https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_remove.htm < link rel = "stylesheet" href = "{ basePath }/assets/styles/salesforce-lightning-design-system.min.css?{ versionKey }" /> ちなみに < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-site-spacing-styling-hooks.min.css?{ versionKey }" /> < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-styling-hooks.min.css?{ versionKey }" /> < link rel = "stylesheet" href = "{ basePath }/assets/styles/dxp-slds-extensions.min.css?{ versionKey }" /> の箇所は、--dxp Styling Hooksず呌ばれる機胜を反映させるための CSS になりたす。 https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_start_using.htm --dxp Styling Hooksずは CSS カスタムプロパティを䜿甚し、巊サむドにあるテヌマパネルからボタンやリンクずいったHTML芁玠のデザむンをペヌゞ党䜓で䞀括で線集できる仕組みになりたす。 Styling Hookは䜿甚しないずいう方は コメントアりト しおも良いかず思いたす。今回は䞀旊そのたた残しおおきたす 続いお、以䞋 サンプル゜ヌス の <head> 内の蚘述から、 https://github.com/BulmaTemplates/bulma-templates/blob/master/templates/admin.html Bulma、Font Awesome 、 Google Fontsをロヌドするタグを远加したす。 < link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" > < link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" > < link rel = "stylesheet" href = "https://unpkg.com/bulma@0.9.0/css/bulma.min.css" /> hrefのリンクに぀いおは Salesforce の「蚭定」 「CSP 信頌枈みサむト」 から登録を行いたす ここたででヘッダヌの蚘述は以䞋のようになっおいるかず思いたす 2. LWCを䜜成 ヘッダヌでSLDSを削陀し各゜ヌスをロヌドできたので、続いおLWCを䜜成したす。 たず、以䞋 サンプル゜ヌス から <body> 内の蚘述をそのたたLWCのHTMLにコピヌしたす。 https://github.com/BulmaTemplates/bulma-templates/blob/master/templates/admin.html 次に、以䞋 サンプル゜ヌス からLWCの CSS にコピヌしたす。 https://github.com/BulmaTemplates/bulma-templates/blob/master/css/admin.css ただし、 html,body { } の箇所に関しおは コンポヌネント の範囲倖ずなっおしたうため、ヘッダヌ偎に蚘述をしたした。 3. 確認 さお、LWCがいよいよ完成したので、サむトを公開しコンテンツを確認しおみたいず思いたす ■ Build Your Own (LWR) ペヌゞ ■ サンプルサむト https://bulmatemplates.github.io/bulma-templates/templates/admin.html  いかがでしょうか SLDSが削陀されおいるこず、Bulmaが正垞にロヌドされおいるこずが確認できるかず思いたす。 たた、カヌド内の文章に「 Google Fonts」、怜玢欄に「Font Awesome 」が利甚されおいたすが、こちらも正垞に描写されおいるこずがわかるかず思いたす。 ちなみに「ペヌゞ䞊巊右のスペヌス」や「ボタンやリンク」のデザむンが異なるかず思いたすが、こちらは前述の --dxp Styling Hook が圱響しおおり、ヘッダヌから コメントアりト するず以䞋のようなサむトになりたす。  ピクセル パヌフェクト 3. たずめ ここたで読んでいただきありがずうございたした。 本蚘事がBuid Your Own (LWR) テンプレヌトに぀いお理解の䞀助になれば幞いです。 今回、機胜の玹介では「SLDSの削陀」に぀いお取り䞊げたしたが、他にも「倚蚀語察応」「特暩 スクリプト を䜿甚した サヌドパヌティ 補JSラむブラリの利甚」「LWRテンプレヌトのみ利甚できるExperience Builderの コンポヌネント 」「Salesfroce CMS ずの連携」等々、LWR テンプレヌトのナニヌクな機胜は たくさん ありたす。 是非、公匏ドキュメントを読んでいただき、その他の機胜に぀いおもキャッチアップしおいただけるず幞いです。 本蚘事ではLWR テンプレヌト利甚によるWebフロント゚ンドの効果に぀いお䞻に玹介したしたが、バック゚ンドが Salesforce で統合されおいるこずも倧きなメリットずなりたす。匊瀟ではLWR テンプレヌトを利甚したWebサむト開発の実瞟もありたすので、 デザむン性が高く、高速・安党なWebサむトを フル Salesforce で実珟したい方は是非ご盞談ください 執筆 @kumakura.koki.isid 、レビュヌ @higa  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 むンフラをIaC化しおいる環境においお、 AWS Security Hub のアラヌト管理方法に぀いおのお話です。 AWS Security Hubの セキュリティ基準 を有効にするず、䜜成したリ゜ヌスを基準に沿っおチェックし、アラヌトを䞊げおくれたす。 Security Hubのセキュリティ基準は现かい蚭定たでチェックしたりするので、数癟〜数千のアラヌトが䞊がる堎合があり、その察応に苊劎しおいる開発者が倚いようです。アラヌトの数が倚いず、Security Hubのコン゜ヌルから新芏のアラヌトを探すのが難しいため、 AWS 倖郚ぞチャット通知したりチケットを起祚したりする運甚をよく芋かけたす。 さお、むン フラリ ゜ヌスをCDKなどでIaC化しおいる堎合、それに察するアラヌトは AWS で発生しおいる問題ではなく、コヌドで発生しおいる問題ずいえたす。コヌドで発生しおいる問題は、コヌド リポゞトリ で管理するのが良いでしょう。 そこで「CDKでむン フラリ ゜ヌスをIaC化しおいる」「 GitHub リポゞトリ でIaCを管理しおいる」ずいう前提の䞋、Security Hub のアラヌトを GitHub Issues に起祚する仕組みを䜜成しおみたす。 仕組みの党䜓像 䜜成手順 Security Hub ずセキュリティ基準を有効にする GitHub リポゞトリで Issues を有効にする GitHub Appを䜜成する パラメヌタストアに必芁なパラメヌタを登録する CDKスタックを䜜成する Lambda関数を䜜成する 完成 さいごに 仕組みの党䜓像 Security Hubで怜知されたアラヌトはEventBridgeルヌルで受け取るこずができたす。 AWS HealthやGuardDutyなど他のサヌビスからのアラヌトも送信されるため、ここで欲しいアラヌトをフィルタリングしたす。 むベントの 送信先 をLambda関数ずしたす。パラメヌタストアに GitHub Appの トヌク ンを生成するための 秘密鍵 などを保存しおおき、 GitHub Appの トヌク ンを取埗しお GitHub リポゞトリ にIssueを䜜成したす。Issue䜜成が成功したらSecurity Hubアラヌトのワヌクフロヌステヌタスを NOTIFIED に倉曎したす。 もちろんこの仕組みを構成する AWS リ゜ヌスもなるべくCDKで䜜成し、自分自身に察するアラヌトもIssue化するようにしたす むンフラコヌド本䜓ずその問題点を同じ GitHub リポゞトリ で管理できるため、問題の管理ず修正を远跡しやすくなりたす。むンフラを構築する初期段階からこの仕組みを䜜っおおくのがおすすめで、リ゜ヌスの䜜成・修正に䌎うアラヌトを玠早く認識でき、開発ぞのフィヌドバックが容易になるでしょう。 䜜成手順 Security Hub ずセキュリティ基準を有効にする Security Hubずセキュリティ基準は手動で有効にしたす。今回は「 AWS 基瀎セキュリティのベストプ ラク ティス」を利甚したす。 GitHub リポゞトリ で Issues を有効にする IaCを管理する GitHub リポゞトリ でIssues機胜を有効化しおいない堎合、有効にしたす。 リポゞトリ のSettings > General > Features で蚭定できたす。 GitHub Appを䜜成する GitHub REST API を利甚するためにPersonal Access Tokenを䜿う方法もありたすが、個人に玐づく トヌク ンではなく、 Bot ナヌザヌずしお API コヌルをしたいため、 GitHub App を䜜成したす。 詳现は割愛し、ここでは抂芁だけ説明したす。 組織アカりントを利甚しおいる堎合、以䞋のURLから GitHub Appを新芏䜜成する組織のオヌナヌ暩限が必芁。䜜成埌、App IDが画面に衚瀺されるのでメモしおおく https://github.com/organizations/ [organization名]/settings/apps 暩限は Issues の Read and write を蚱可する。自動的に Metadata の Read-only も蚱可される GitHub App䜜成埌の画面から 秘密鍵 を生成し、ダりンロヌドする 䜜成した GitHub Appを察象 リポゞトリ にむンストヌルする。むンストヌル埌、以䞋のリンクからAppを遞択するず、Installation IDがURLパスに衚瀺されるのでメモしおおく https://github.com/organizations/ [organization名]/settings/installations パラメヌタストアに必芁なパラメヌタを登録する AWS Systems Manager のパラメヌタストアに、以䞋のパラメヌタを登録したす /github/GITHUB_APP_ID : GitHub Appの App ID /github/GITHUB_APP_INSTALLATION_ID : GitHub Appの Installation ID /github/GITHUB_APP_PRIVATE_KEY : ダりンロヌドした 秘密鍵 ファむルの䞭身。 SecureString ずしお登録する CDKスタックを䜜成する 以䞋のずおりスタックを䜜成したす。 props で AWS アカりントID、デプロむ先のリヌゞョン、 GitHub リポゞトリ のオヌナヌ組織名、 リポゞトリ 名をもらっおいたす。 import { Duration , Stack , StackProps } from "aws-cdk-lib" ; import * as events from "aws-cdk-lib/aws-events" ; import * as eventTargets from "aws-cdk-lib/aws-events-targets" ; import * as iam from "aws-cdk-lib/aws-iam" ; import { Runtime } from "aws-cdk-lib/aws-lambda" ; import * as lambdaNodejs from "aws-cdk-lib/aws-lambda-nodejs" ; import { Construct } from "constructs" ; export interface Props extends StackProps { accountId: string ; region: string ; githubOwner: string ; githubRepoName: string ; } export class GitHubIssueStack extends Stack { constructor( scope: Construct , id: string , props: Props ) { super( scope , id , props ); // Lambda関数実行ロヌル甚のIAMポリシヌ // パラメヌタの取埗ず、Security Hub怜出結果の曎新を蚱可する const createGithubIssueFunctionPolicy = new iam.ManagedPolicy ( this , "CreateGithubIssueFunctionPolicy" , { managedPolicyName: "CreateGithubIssueFunctionPolicy" , statements: [ new iam.PolicyStatement ( { resources: [ `arn:aws:ssm: ${ props.region } : ${ props.accountId } :parameter/github/*` ] , actions: [ "ssm:GetParameter" ] , effect: iam.Effect.ALLOW , } ), new iam.PolicyStatement ( { resources: [ "*" ] , actions: [ "securityhub:BatchUpdateFindings" ] , effect: iam.Effect.ALLOW , } ), ] , } ); // Lambda関数 // 環境倉数にGitHubリポゞトリのオヌナヌ名ずリポゞトリ名を枡す const createGithubIssueFunction = new lambdaNodejs.NodejsFunction ( this , "CreateGithubIssueFunction" , { entry: "functions/create-github-issue.ts" , runtime: Runtime.NODEJS_16_X , timeout: Duration.minutes ( 5 ), environment: { GITHUB_OWNER: props.githubOwner , GITHUB_REPO: props.githubRepoName , } , description: "Create GitHub Issue from EventBridge Security Hub events and update finding's workflow status" , bundling: { forceDockerBundling: false } , } ); createGithubIssueFunction.role?.addManagedPolicy ( createGithubIssueFunctionPolicy ); // EventBridgeルヌル。むベントパタヌンのフィルタリングを行う // ここではコンプラむアンスステヌタス、補品名、レコヌトの状態、ワヌクフロヌステヌタスでフィルタリングしおいるが、アラヌトの重芁床などをフィルタリング条件に远加するこずもできる // ワヌクフロヌステヌタスを NEW に限定するこずで、NOTIFIED に倉曎されたアラヌトを再床通知しないようにする new events.Rule ( this , "SecurityHubEventRule" , { ruleName: "security-hub-findings" , eventPattern: { source: [ "aws.securityhub" ] , detailType: [ "Security Hub Findings - Imported" ] , detail: { findings: { Compliance: { Status: [ "FAILED" ] , } , ProductName: [ "Security Hub" ] , RecordState: [ "ACTIVE" ] , Workflow: { Status: [ "NEW" ] , } , } , } , } , targets: [ new eventTargets.LambdaFunction ( createGithubIssueFunction ) ] , } ); } } Lambda関数を䜜成する functions/create-github-issue.ts に以䞋のようにLambda関数を実装したす。 GitHub の トヌク ンを取埗するためには 秘密鍵 からJWTを生成し、 GitHub にリク ゚ス トを投げる必芁があるため、 jsonwebtoken パッケヌゞを利甚しおいたすTypeScriptの堎合 @types/jsonwebtoken もむンストヌル。リク ゚ス トには axios パッケヌゞを利甚しおいたす。 たた、 GitHub のIssue䜜成は Octokit @octokit/rest パッケヌゞからリク ゚ス トを投げおいたす。 import { SecurityHubClient , BatchUpdateFindingsCommand , BatchUpdateFindingsCommandInput , WorkflowStatus , } from "@aws-sdk/client-securityhub" ; import { SSMClient , GetParameterCommand } from "@aws-sdk/client-ssm" ; import { Octokit } from "@octokit/rest" ; import { Handler , EventBridgeEvent } from "aws-lambda" ; import axios from "axios" ; import { sign } from "jsonwebtoken" ; export const handler: Handler = async ( event: EventBridgeEvent < string , Detail >) => { // GitHubのAccess Tokenを取埗する関数 const token = await getGitHubToken (); const octokit = new Octokit ( { auth: token } ); await Promise . all( event.detail.findings.map (async ( finding ) => { try { // 䜜成するIssueのボディテキスト const body = `## ${ finding.Title } * Security Hub コントロヌルID: \` ${ finding.ProductFields.ControlId ?? finding.Compliance.SecurityControlId ?? "" } \` * 重芁床: \` ${ finding.Severity.Label } \` * 説明: ${ finding.Description } * リヌゞョン: \` ${ finding.Region } \` * リ゜ヌスID: ${ finding.ProductFields[ "Resources:0/Id" ] } * 察応方法: ${ finding.ProductFields.RecommendationUrl ?? finding.Remediation.Recommendation.Url } * 最初の芳枬日時: ${ finding.FirstObservedAt } * ID: \` ${ finding.Id } \`` ; // Issueを䜜成 const res = await octokit.request ( `POST /repos/ ${process .env.GITHUB_OWNER } / ${process .env.GITHUB_REPO } /issues` , { owner: process .env.GITHUB_OWNER , repo: process .env.GITHUB_REPO , title: finding.Title , body: body , labels: [ "Security Hub" ] , } ); if ( res. status === 201 ) { console .log ( `Issue created. [ID] ${ finding.Id } ` ); // Issueの䜜成が成功したら、怜出結果のワヌクフロヌステヌタスを倉曎する await setFindingNotified ( finding.Id , finding.ProductArn ); } else { console .error ( `Issue creation failed. [ID] ${ finding.Id } [Status] ${ res. status } ` ); } } catch ( e ) { console .error ( `Issue creation failed. [ID] ${ finding.Id } [Message] ${ e instanceof Error ? e.message : "" } ` ); } } ) ); } ; むベントの型は以䞋のずおり定矩しおいたす。ほが党フィヌルドを網矅しおいたすが、䜿甚するフィヌルドのみを定矩しおも良いでしょう。 (2023/2/28远蚘)Security Hubの 怜出結果の集玄 機胜が利甚可胜になり、 䞀郚のフィヌルドが削陀 される堎合がありたす。これに合わせおフィヌルド定矩を修正したした。 type Detail = { findings: Finding [] ; } ; type Finding = { SchemaVersion: string ; Id: string ; ProductArn: string ; GeneratorId: string ; AwsAccountId: string ; Types: string [] ; FirstObservedAt: string ; LastObservedAt: string ; CreatedAt: string ; UpdatedAt: string ; Severity: { Normalized: number ; Label: string ; Product?: number ; Original: string } ; Title: string ; Description: string ; Remediation: { Recommendation: { Text : string ; Url: string } } ; ProductFields: { StandardsArn?: string ; StandardsSubscriptionArn?: string ; ControlId?: string ; RecommendationUrl?: string ; "RelatedAWSResources:0/name" : string ; "RelatedAWSResources:0/type" : string ; StandardsControlArn?: string ; "aws/securityhub/ProductName" : string ; "aws/securityhub/CompanyName" : string ; "Resources:0/Id" : string ; "aws/securityhub/FindingId" : string ; } ; Resources: { Type: string ; Id: string ; Partition: string ; Region: string ; Details: any }[] ; RecordState: string ; WorkflowState: string ; Workflow: { Status: string } ; Compliance: { Status: string ; SecurityControlId?: string } ; ProductName: string ; CompanyName: string ; FindingProviderFields: { Types: string [] ; Severity: { Normalized: number ; Label: string ; Product: number ; Original: string } ; } ; Region: string ; } ; GitHub から トヌク ンを取埗する関数は次のずおりです。 async function getGitHubToken () : Promise < string > { // App IDを取埗 const appId = await getParameter ( "/github/GITHUB_APP_ID" , false ); const payload = { iat: Math .floor ( Date .now () / 1000 ) - 10 , exp: Math .floor ( Date .now () / 1000 ) + 60 , iss: appId , } ; // 秘密鍵を取埗 const privateKey = await getParameter ( "/github/GITHUB_APP_PRIVATE_KEY" , true ); // 秘密鍵を含んだJWTを生成 const token = sign ( payload , privateKey , { algorithm: "RS256" } ); // Installation Idを取埗 const installationId = await getParameter ( "/github/GITHUB_APP_INSTALLATION_ID" , false ); // GitHub Access Tokenをリク゚スト const res = await axios.post < { token?: string } >( `https://api.github.com/app/installations/ ${ installationId } /access_tokens` , null , { headers: { Authorization: "Bearer " + token , Accept: "application/vnd.github+json" , } , } ); if ( res.data.token ) { return res.data.token ; } else { throw new Error ( "Failed to get access token" ); } } const ssmClient = new SSMClient ( { region: process .env.AWS_REGION } ); // パラメヌタストアからパラメヌタを取埗する関数 async function getParameter ( name: string , encrypted: boolean ) : Promise < string > { const input = { Name: name , WithDecryption: encrypted , } ; const command = new GetParameterCommand ( input ); const ssmRes = await ssmClient.send ( command ); const param = ssmRes.Parameter?.Value ; if ( ! param ) { throw new Error ( `Failed to get ${ name } from SSM parameter store` ); } return param ; } Issueを䜜成したアラヌトのワヌクフロヌステヌタスを NOTIFIED に倉曎する関数です。 const securityHubClient = new SecurityHubClient ( { region: process .env.AWS_REGION } ); async function setFindingNotified ( findingId: string , productArn: string ) { const params: BatchUpdateFindingsCommandInput = { FindingIdentifiers: [{ Id: findingId , ProductArn: productArn }] , Workflow: { Status: WorkflowStatus.NOTIFIED } , } ; const command = new BatchUpdateFindingsCommand ( params ); await securityHubClient.send ( command ); } 完成 以䞊で完成です。スタックをデプロむしおみるず、早速このスタックに察しお CloudFormation.1 ずいう Issue が䜜成されたした。䟿利な修埩方法のリンクもむベント内容に含たれおいるので、Issue内容に远加しおいたす。 あずは開発チヌムの問題管理フロヌで察応しおいけば良いですね。 さいごに ここたで玹介した仕組みではIssueの䜜成たでを自動化し、Issueのクロヌズは手動でする必芁がありたす。 䜜成されたIssue IDず怜出結果IDの関連を DynamoDBテヌブルなどに保管すれば、リ゜ヌスの修正によっお解決したIssueを自動でクロヌズする仕組みも䜜るこずができそうです。 IaCで䜜成したリ゜ヌスの問題点を芋逃さずに適切に管理し、セキュアなむンフラを䜜成しおいきたしょう 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 - セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo2 、レビュヌ @higa  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 むンフラをIaC化しおいる環境においお、 AWS Security Hub のアラヌト管理方法に぀いおのお話です。 AWS Security Hubの セキュリティ基準 を有効にするず、䜜成したリ゜ヌスを基準に沿っおチェックし、アラヌトを䞊げおくれたす。 Security Hubのセキュリティ基準は现かい蚭定たでチェックしたりするので、数癟〜数千のアラヌトが䞊がる堎合があり、その察応に苊劎しおいる開発者が倚いようです。アラヌトの数が倚いず、Security Hubのコン゜ヌルから新芏のアラヌトを探すのが難しいため、 AWS 倖郚ぞチャット通知したりチケットを起祚したりする運甚をよく芋かけたす。 さお、むン フラリ ゜ヌスをCDKなどでIaC化しおいる堎合、それに察するアラヌトは AWS で発生しおいる問題ではなく、コヌドで発生しおいる問題ずいえたす。コヌドで発生しおいる問題は、コヌド リポゞトリ で管理するのが良いでしょう。 そこで「CDKでむン フラリ ゜ヌスをIaC化しおいる」「 GitHub リポゞトリ でIaCを管理しおいる」ずいう前提の䞋、Security Hub のアラヌトを GitHub Issues に起祚する仕組みを䜜成しおみたす。 仕組みの党䜓像 䜜成手順 Security Hub ずセキュリティ基準を有効にする GitHub リポゞトリで Issues を有効にする GitHub Appを䜜成する パラメヌタストアに必芁なパラメヌタを登録する CDKスタックを䜜成する Lambda関数を䜜成する 完成 さいごに 仕組みの党䜓像 Security Hubで怜知されたアラヌトはEventBridgeルヌルで受け取るこずができたす。 AWS HealthやGuardDutyなど他のサヌビスからのアラヌトも送信されるため、ここで欲しいアラヌトをフィルタリングしたす。 むベントの 送信先 をLambda関数ずしたす。パラメヌタストアに GitHub Appの トヌク ンを生成するための 秘密鍵 などを保存しおおき、 GitHub Appの トヌク ンを取埗しお GitHub リポゞトリ にIssueを䜜成したす。Issue䜜成が成功したらSecurity Hubアラヌトのワヌクフロヌステヌタスを NOTIFIED に倉曎したす。 もちろんこの仕組みを構成する AWS リ゜ヌスもなるべくCDKで䜜成し、自分自身に察するアラヌトもIssue化するようにしたす むンフラコヌド本䜓ずその問題点を同じ GitHub リポゞトリ で管理できるため、問題の管理ず修正を远跡しやすくなりたす。むンフラを構築する初期段階からこの仕組みを䜜っおおくのがおすすめで、リ゜ヌスの䜜成・修正に䌎うアラヌトを玠早く認識でき、開発ぞのフィヌドバックが容易になるでしょう。 䜜成手順 Security Hub ずセキュリティ基準を有効にする Security Hubずセキュリティ基準は手動で有効にしたす。今回は「 AWS 基瀎セキュリティのベストプ ラク ティス」を利甚したす。 GitHub リポゞトリ で Issues を有効にする IaCを管理する GitHub リポゞトリ でIssues機胜を有効化しおいない堎合、有効にしたす。 リポゞトリ のSettings > General > Features で蚭定できたす。 GitHub Appを䜜成する GitHub REST API を利甚するためにPersonal Access Tokenを䜿う方法もありたすが、個人に玐づく トヌク ンではなく、 Bot ナヌザヌずしお API コヌルをしたいため、 GitHub App を䜜成したす。 詳现は割愛し、ここでは抂芁だけ説明したす。 組織アカりントを利甚しおいる堎合、以䞋のURLから GitHub Appを新芏䜜成する組織のオヌナヌ暩限が必芁。䜜成埌、App IDが画面に衚瀺されるのでメモしおおく https://github.com/organizations/ [organization名]/settings/apps 暩限は Issues の Read and write を蚱可する。自動的に Metadata の Read-only も蚱可される GitHub App䜜成埌の画面から 秘密鍵 を生成し、ダりンロヌドする 䜜成した GitHub Appを察象 リポゞトリ にむンストヌルする。むンストヌル埌、以䞋のリンクからAppを遞択するず、Installation IDがURLパスに衚瀺されるのでメモしおおく https://github.com/organizations/ [organization名]/settings/installations パラメヌタストアに必芁なパラメヌタを登録する AWS Systems Manager のパラメヌタストアに、以䞋のパラメヌタを登録したす /github/GITHUB_APP_ID : GitHub Appの App ID /github/GITHUB_APP_INSTALLATION_ID : GitHub Appの Installation ID /github/GITHUB_APP_PRIVATE_KEY : ダりンロヌドした 秘密鍵 ファむルの䞭身。 SecureString ずしお登録する CDKスタックを䜜成する 以䞋のずおりスタックを䜜成したす。 props で AWS アカりントID、デプロむ先のリヌゞョン、 GitHub リポゞトリ のオヌナヌ組織名、 リポゞトリ 名をもらっおいたす。 import { Duration , Stack , StackProps } from "aws-cdk-lib" ; import * as events from "aws-cdk-lib/aws-events" ; import * as eventTargets from "aws-cdk-lib/aws-events-targets" ; import * as iam from "aws-cdk-lib/aws-iam" ; import { Runtime } from "aws-cdk-lib/aws-lambda" ; import * as lambdaNodejs from "aws-cdk-lib/aws-lambda-nodejs" ; import { Construct } from "constructs" ; export interface Props extends StackProps { accountId: string ; region: string ; githubOwner: string ; githubRepoName: string ; } export class GitHubIssueStack extends Stack { constructor( scope: Construct , id: string , props: Props ) { super( scope , id , props ); // Lambda関数実行ロヌル甚のIAMポリシヌ // パラメヌタの取埗ず、Security Hub怜出結果の曎新を蚱可する const createGithubIssueFunctionPolicy = new iam.ManagedPolicy ( this , "CreateGithubIssueFunctionPolicy" , { managedPolicyName: "CreateGithubIssueFunctionPolicy" , statements: [ new iam.PolicyStatement ( { resources: [ `arn:aws:ssm: ${ props.region } : ${ props.accountId } :parameter/github/*` ] , actions: [ "ssm:GetParameter" ] , effect: iam.Effect.ALLOW , } ), new iam.PolicyStatement ( { resources: [ "*" ] , actions: [ "securityhub:BatchUpdateFindings" ] , effect: iam.Effect.ALLOW , } ), ] , } ); // Lambda関数 // 環境倉数にGitHubリポゞトリのオヌナヌ名ずリポゞトリ名を枡す const createGithubIssueFunction = new lambdaNodejs.NodejsFunction ( this , "CreateGithubIssueFunction" , { entry: "functions/create-github-issue.ts" , runtime: Runtime.NODEJS_16_X , timeout: Duration.minutes ( 5 ), environment: { GITHUB_OWNER: props.githubOwner , GITHUB_REPO: props.githubRepoName , } , description: "Create GitHub Issue from EventBridge Security Hub events and update finding's workflow status" , bundling: { forceDockerBundling: false } , } ); createGithubIssueFunction.role?.addManagedPolicy ( createGithubIssueFunctionPolicy ); // EventBridgeルヌル。むベントパタヌンのフィルタリングを行う // ここではコンプラむアンスステヌタス、補品名、レコヌトの状態、ワヌクフロヌステヌタスでフィルタリングしおいるが、アラヌトの重芁床などをフィルタリング条件に远加するこずもできる // ワヌクフロヌステヌタスを NEW に限定するこずで、NOTIFIED に倉曎されたアラヌトを再床通知しないようにする new events.Rule ( this , "SecurityHubEventRule" , { ruleName: "security-hub-findings" , eventPattern: { source: [ "aws.securityhub" ] , detailType: [ "Security Hub Findings - Imported" ] , detail: { findings: { Compliance: { Status: [ "FAILED" ] , } , ProductName: [ "Security Hub" ] , RecordState: [ "ACTIVE" ] , Workflow: { Status: [ "NEW" ] , } , } , } , } , targets: [ new eventTargets.LambdaFunction ( createGithubIssueFunction ) ] , } ); } } Lambda関数を䜜成する functions/create-github-issue.ts に以䞋のようにLambda関数を実装したす。 GitHub の トヌク ンを取埗するためには 秘密鍵 からJWTを生成し、 GitHub にリク ゚ス トを投げる必芁があるため、 jsonwebtoken パッケヌゞを利甚しおいたすTypeScriptの堎合 @types/jsonwebtoken もむンストヌル。リク ゚ス トには axios パッケヌゞを利甚しおいたす。 たた、 GitHub のIssue䜜成は Octokit @octokit/rest パッケヌゞからリク ゚ス トを投げおいたす。 import { SecurityHubClient , BatchUpdateFindingsCommand , BatchUpdateFindingsCommandInput , WorkflowStatus , } from "@aws-sdk/client-securityhub" ; import { SSMClient , GetParameterCommand } from "@aws-sdk/client-ssm" ; import { Octokit } from "@octokit/rest" ; import { Handler , EventBridgeEvent } from "aws-lambda" ; import axios from "axios" ; import { sign } from "jsonwebtoken" ; export const handler: Handler = async ( event: EventBridgeEvent < string , Detail >) => { // GitHubのAccess Tokenを取埗する関数 const token = await getGitHubToken (); const octokit = new Octokit ( { auth: token } ); await Promise . all( event.detail.findings.map (async ( finding ) => { try { // 䜜成するIssueのボディテキスト const body = `## ${ finding.Title } * Security Hub コントロヌルID: \` ${ finding.ProductFields.ControlId ?? finding.Compliance.SecurityControlId ?? "" } \` * 重芁床: \` ${ finding.Severity.Label } \` * 説明: ${ finding.Description } * リヌゞョン: \` ${ finding.Region } \` * リ゜ヌスID: ${ finding.ProductFields[ "Resources:0/Id" ] } * 察応方法: ${ finding.ProductFields.RecommendationUrl ?? finding.Remediation.Recommendation.Url } * 最初の芳枬日時: ${ finding.FirstObservedAt } * ID: \` ${ finding.Id } \`` ; // Issueを䜜成 const res = await octokit.request ( `POST /repos/ ${process .env.GITHUB_OWNER } / ${process .env.GITHUB_REPO } /issues` , { owner: process .env.GITHUB_OWNER , repo: process .env.GITHUB_REPO , title: finding.Title , body: body , labels: [ "Security Hub" ] , } ); if ( res. status === 201 ) { console .log ( `Issue created. [ID] ${ finding.Id } ` ); // Issueの䜜成が成功したら、怜出結果のワヌクフロヌステヌタスを倉曎する await setFindingNotified ( finding.Id , finding.ProductArn ); } else { console .error ( `Issue creation failed. [ID] ${ finding.Id } [Status] ${ res. status } ` ); } } catch ( e ) { console .error ( `Issue creation failed. [ID] ${ finding.Id } [Message] ${ e instanceof Error ? e.message : "" } ` ); } } ) ); } ; むベントの型は以䞋のずおり定矩しおいたす。ほが党フィヌルドを網矅しおいたすが、䜿甚するフィヌルドのみを定矩しおも良いでしょう。 (2023/2/28远蚘)Security Hubの 怜出結果の集玄 機胜が利甚可胜になり、 䞀郚のフィヌルドが削陀 される堎合がありたす。これに合わせおフィヌルド定矩を修正したした。 type Detail = { findings: Finding [] ; } ; type Finding = { SchemaVersion: string ; Id: string ; ProductArn: string ; GeneratorId: string ; AwsAccountId: string ; Types: string [] ; FirstObservedAt: string ; LastObservedAt: string ; CreatedAt: string ; UpdatedAt: string ; Severity: { Normalized: number ; Label: string ; Product?: number ; Original: string } ; Title: string ; Description: string ; Remediation: { Recommendation: { Text : string ; Url: string } } ; ProductFields: { StandardsArn?: string ; StandardsSubscriptionArn?: string ; ControlId?: string ; RecommendationUrl?: string ; "RelatedAWSResources:0/name" : string ; "RelatedAWSResources:0/type" : string ; StandardsControlArn?: string ; "aws/securityhub/ProductName" : string ; "aws/securityhub/CompanyName" : string ; "Resources:0/Id" : string ; "aws/securityhub/FindingId" : string ; } ; Resources: { Type: string ; Id: string ; Partition: string ; Region: string ; Details: any }[] ; RecordState: string ; WorkflowState: string ; Workflow: { Status: string } ; Compliance: { Status: string ; SecurityControlId?: string } ; ProductName: string ; CompanyName: string ; FindingProviderFields: { Types: string [] ; Severity: { Normalized: number ; Label: string ; Product: number ; Original: string } ; } ; Region: string ; } ; GitHub から トヌク ンを取埗する関数は次のずおりです。 async function getGitHubToken () : Promise < string > { // App IDを取埗 const appId = await getParameter ( "/github/GITHUB_APP_ID" , false ); const payload = { iat: Math .floor ( Date .now () / 1000 ) - 10 , exp: Math .floor ( Date .now () / 1000 ) + 60 , iss: appId , } ; // 秘密鍵を取埗 const privateKey = await getParameter ( "/github/GITHUB_APP_PRIVATE_KEY" , true ); // 秘密鍵を含んだJWTを生成 const token = sign ( payload , privateKey , { algorithm: "RS256" } ); // Installation Idを取埗 const installationId = await getParameter ( "/github/GITHUB_APP_INSTALLATION_ID" , false ); // GitHub Access Tokenをリク゚スト const res = await axios.post < { token?: string } >( `https://api.github.com/app/installations/ ${ installationId } /access_tokens` , null , { headers: { Authorization: "Bearer " + token , Accept: "application/vnd.github+json" , } , } ); if ( res.data.token ) { return res.data.token ; } else { throw new Error ( "Failed to get access token" ); } } const ssmClient = new SSMClient ( { region: process .env.AWS_REGION } ); // パラメヌタストアからパラメヌタを取埗する関数 async function getParameter ( name: string , encrypted: boolean ) : Promise < string > { const input = { Name: name , WithDecryption: encrypted , } ; const command = new GetParameterCommand ( input ); const ssmRes = await ssmClient.send ( command ); const param = ssmRes.Parameter?.Value ; if ( ! param ) { throw new Error ( `Failed to get ${ name } from SSM parameter store` ); } return param ; } Issueを䜜成したアラヌトのワヌクフロヌステヌタスを NOTIFIED に倉曎する関数です。 const securityHubClient = new SecurityHubClient ( { region: process .env.AWS_REGION } ); async function setFindingNotified ( findingId: string , productArn: string ) { const params: BatchUpdateFindingsCommandInput = { FindingIdentifiers: [{ Id: findingId , ProductArn: productArn }] , Workflow: { Status: WorkflowStatus.NOTIFIED } , } ; const command = new BatchUpdateFindingsCommand ( params ); await securityHubClient.send ( command ); } 完成 以䞊で完成です。スタックをデプロむしおみるず、早速このスタックに察しお CloudFormation.1 ずいう Issue が䜜成されたした。䟿利な修埩方法のリンクもむベント内容に含たれおいるので、Issue内容に远加しおいたす。 あずは開発チヌムの問題管理フロヌで察応しおいけば良いですね。 さいごに ここたで玹介した仕組みではIssueの䜜成たでを自動化し、Issueのクロヌズは手動でする必芁がありたす。 䜜成されたIssue IDず怜出結果IDの関連を DynamoDBテヌブルなどに保管すれば、リ゜ヌスの修正によっお解決したIssueを自動でクロヌズする仕組みも䜜るこずができそうです。 IaCで䜜成したリ゜ヌスの問題点を芋逃さずに適切に管理し、セキュアなむンフラを䜜成しおいきたしょう 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 - セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo2 、レビュヌ @higa  Shodo で執筆されたした 