みなさんこんにちは! ISID 金融ソリューション事業部の松崎です。 前回 の記事では、フォトグラメトリを用いた3Dモデル作成手法を紹介しました。まだご覧になっていない方は、是非読んでいただけると嬉しいです! 今回からは、2回に分けて フォトグラメトリを用いた3Dモデル作成のワークフロー を紹介していきます。 この記事は前編です。 はじめに まず初めに、フォトグラメトリについて概要を説明します。 フォトグラメトリとは、被写体をさまざまなアングルから撮影し、そのデジタル画像を解析・統合して写実的な3Dモデルを作成する技術です。3Dスキャナのような特殊な機器が不要で、通常の写真だけで生成できることが特徴です。 被写体の大きさや求める3Dモデルのクオリティにもよりますが、およそ数十枚~数百枚のデジタル画像を用いて3Dモデルを生成します。 LIDERなどセンサーを用いた手法と比較した場合、フォトグラメトリの強みとしては写真からハイクオリティなテクスチャを抽出できることが挙げられます。 (画像:被写体(車)に対してフォトグラメトリ用の写真を撮影するイメージ) ワークフロー一覧 フォトグラメトリによる3Dモデル作成のワークフローは、大きく分けて以下に分けられます。 機材の準備 被写体の確認、撮影環境のロケハン 被写体の撮影 撮影画像のRAW現像 メッシュモデル作成 テクスチャ貼り付け・ローポリ化 前編では、1~3についてご紹介します。 1.機材の準備 フォトグラメトリを行うにあたって、必要となる機材を紹介します。 本記事で紹介する機材一覧を以下に示します。 カメラ PC 三脚/一脚 コンパクトカメラ (+ 伸縮ロッド) ドローン 回転台 (+ 背景布/グリーンバック) 照明 露出計/カラーチェッカー 偏光フィルター 1-1.カメラ フォトグラメトリ用の写真を撮影する際、重要になるポイントを2つ紹介します。 また、参考として私たちが使用しているカメラを紹介します。 1-1-1.画質 フォトグラメトリは、写真から3Dモデルを作成するという特性上、写真の画質が3Dモデルのクオリティに直結します。 その為、よりリアルな3Dモデルを作成したい場合は高画 素数 のカメラを使うことが望ましいです。 一方、高画 素数 カメラは一つ一つの受光素子が小さくなる関係で、「ノイズや手振れが起こりやすくなり、暗所にも弱い」というデメリットが存在します。 「とりあえず高画 素数 のカメラを使う」のではなく、自分が求めるクオリティと撮影環境(明るさ確保や手振れ対策が可能か等)を照らし合わせて選定することが望ましいです。 (画像:低画素と高画素の受光素子イメージ) 1-1-2.画角 フォトグラメトリのワークフローにおいて、大きく手間がかかる部分は写真の「撮影」と「処理」になります。 被写体が小さい場合はそこまで手間もないですが、部屋や建物を対象とする場合は、数百~数千の写真を撮影・処理することになります。その為、「撮影枚数をいかに減らすか」といった部分がとても重要になります。 通常のズームレンズの 焦点距離 は35~50mmが一般的ですが、広角レンズ( 焦点距離 14~20mm程度)を用いることで、画角を1.5~2倍程広くできます。この場合、単純概算で写真枚数を0.5~0.7倍程に減らせることになりますので、可能な限り広角レンズを使うことが望ましいです。 (画像:レンズの 焦点距離 と画角の変化) 一方、広角レンズを用いると写真の端部分を中心に歪みが発生するといったデメリットが存在します。 フォトグラメトリソフトウェアによっては広角写真を補正する機能(RealityCaptureにて確認済)がありますので、各種機能を駆使しながら、できる限りの広角レンズを使用することが望ましいです。 1-1-3.カメラ紹介(参考) 私たちが使用しているカメラ・レンズを紹介します。 カメラやレンズ選定のご参考にしていただければと思います。 Sony α7R IV 約6100万画素、35mmフルサイズセンサーのデジタル一眼ミラーレ スカメ ラ 高解像度・高感度・低ノイズ性能が特徴です。 Sony Vario-Tessar T* FE 16-35mm F4 ZA OSS (SEL1635Z) 35mmフルサイズ イメージセンサー とマッチする、 焦点距離 16~35mmの広角ズームレンズ 非球面レンズ 5枚とEDガラス3枚が使用されており、画面端の高解像度化や歪曲収差が低減される点が特徴的です。 1-2.PC PCは主にフォトグラメトリソフトウェアを動かす為に使用します。 私たちのチームでは、フォトグラメトリソフトウェアとして RealiyCapture を使用しておりますが、その要求スペックは以下のとおりです。( 出典元 ) PC:64bit PC/ ワークステーション OS:64bit Microsoft Windows version 7 / 8 / 8.1 / 10 / 11 または Windows Server version 2008+ CPU:SSE4.2(Streaming SIMD Extensions 4.2)以降 RAM(メモリ):8GB以上 GPU : NVIDIA graphics card with CUDA 3.0+ capabilities で 、VRAMが1GB以上 DRIVER:CUDA Toolkit 10.2, minimal driver version 441.22. また、推奨スペックは以下になります。 RAM:16GB以上 CPU:4コア以上 CUDAコア数:1024以上 GPU : NVIDIA グラフィックカード ( NVIDIA 以外の グラフィックカード では、テクスチャ・3Dモデルを作成できません) 前回の記事にて紹介した通り、RealiyCaptureは「アライメント ⇒ メッシュ作成 ⇒ テクスチャ作成」の順で処理を行います。この内、メッシュ作成はCPU・ GPU の両方が使われていますが、アライメントとテクスチャ作成はCPUのみで行われます。その為、処理時間を短縮したい場合はCPU性能から向上させることが望ましいです。 また上記出典元では、RAMに関して「数千枚の高画質写真(30~80MP)を扱うには16GBで十分」と記載されています。 数千枚より多くの写真を用いる場合や、100MPを超えるような超高画質写真を使用する場合は32GB以上のRAMを検討しましょう。 こちらも参考までに、私たちが使用しているPCスペックを紹介します。 私たちの場合は、RealityCapture側のアップデート(1億ポリゴン対応等)に備え、推奨より高いスペックにて構成しています。 OS: Windows 11 Pro 64bit CPU: Intel Core i9 -13900KF CPUコア数:24 RAM:64GB GPU : NVIDIA GeForce RTX 4090 CUDAコア数:16384 グラフィックメモリ:24GB 1-3.その他 フォトグラメトリを行う上で必須となる機材はカメラ・PCですが、それ以外にも「あったら便利」な機材がいくつか存在します。私たちのチームで検討中の機材も含め、そんな便利機材を紹介していきます。 1-3-1.三脚/一脚 フォトグラメトリにおいて「手振れ」は3Dモデルのクオリティ劣化に直結します。最近のカメラは手振れ補正機能が充実していますが、それでも激しく揺れた場合はブレが発生してしまいます。 また、同じ高さを維持して撮影したい時や、 シャッタースピード を落として撮影したい時にも三脚/一脚が便利です。 1-3-2.コンパクトカメラ (+ 伸縮ロッド) 5m~10mの高所から撮影する場合、コンパクトカメラ等の小型・軽量カメラがあると便利です。 数枚程度の高所撮影であれば通常サイズのカメラで問題ないと思いますが、数十~数百枚の高所撮影をするときは軽いカメラが役立ちます。 1-3-3.ドローン 10m以上の高所から撮影する必要がある場合は、ドローンでの空撮が選択肢に入ります。 ただし、2023年6月現在はドローン使用に関する規制が厳しく、場所によってはドローン空撮が許可されない場合もあります。また、人が歩いている上空で行う「レベル4」の飛行には、国家資格「一等 無人 航空機操縦士」が必要になります。 その為、ドローンを用いた空撮は非常に難易度の高い要件と言えます。 (画像: ドローンとは何か ) 1-3-4.回転台 (+ 背景布/グリーンバック) 単体の物体、かつ回転台に乗る大きさの物体を被写体とする場合は、回転台を使用すると撮影の手間が省けます。 フォトグラメトリでは360°すべての角度から撮影する必要がありますが、回転台を用いることで、カメラを固定したまま一周分撮影することが出来ます。 注意点としては、被写体以外の背景部分が回転しないことです。この場合、被写体と背景部分の特徴点変化が釣り合わず、特徴点抽出が正常に働きません。 その為、グリーンバック等を用いて一色に統一し、背景部分をマスク処理等で除去できるようにする必要があります。 1-3-5.照明 屋内撮影にて単物体を被写体とする場合は、照明を用いることで光量を調節することが出来ます。 フォトグラメトリの特性上、物体に当たっている光量は直接テクスチャへ影響します。 カメラ側での露出設定や現像後処理にて調整することも可能ですが、最初から目的の光量に統一して撮影すると、細かい調整作業を省くことが出来ます。 また、設置式の定常光が置ける場合は問題ないですが、空間的制約などによって設置できない場合はストロボを使用することも検討します。 1-3-6.露出計/カラーチェッカー 露出計は、その場の光の強度を測定し、カメラの露出設定を導出する機械です。 フォトグラメトリでは対象を様々な角度から撮影する為、カメラの露出設定を一定にしている場合、角度によって露出が変化してしまいます。 適正露出を保つためには、露出計を用いて角度毎に露出設定を変更することが望ましいです。 また、ホワイトバランスの調整としてはカラーチェッカーがあると便利です。 1-3-7.偏光フィルター 偏光フィルター(PLフィルター)は、反射光を調整するフィルターです。 晴れの日の屋外で撮影する時など、物体からの反射光が強く出てしまうときに使用すると、物体本来の色彩を捉えやすくなります。 (画像: PL(偏光)フィルターの効果と使い方、使用例、選び方、特徴 ) 2.被写体の確認、撮影環境のロケハン ここからは被写体の大きさや屋内/屋外の条件ごとに、撮影前に必要となるロケハン内容を紹介します。 2-1.単体の物体 単体の物体を被写体とする際は、 その物体を全方位から撮影できるだけの空間が必要 になります。 コップや花瓶のような小物体の場合は机の上に置いて撮影できますが、大きなデスク等を被写体とする際は、周囲にそれなりの空間が要求されます。(被写体全体を写すには、ある程度離れる必要がある為) 全方位から撮影できる空間が取れない場合は、被写体を広い部屋に移動させて撮影することが望ましいです。 (画像:部屋の大きさに対して物体が大きい例) その他の点として、光量を一定に保ちたい場合は照明を用いて調整しましょう。 また被写体が回転台に乗る大きさであれば、上記で紹介した「回転台 + グリーンバック」の機材で撮影を効率化できますので、これらの設置可否を検討しましょう。 2-2.部屋内観(屋内) 部屋全体を撮影する際に重要なポイントは、 可能な限り部屋内の物体を減らすこと です。 小さな物体がいくつかある程度であればよいですが、大きな物体があると撮影時に影部分(部屋全体を撮った写真内に映らない部屋の壁・床など)が増えてしまい、細かく何か所も撮影する必要が出てしまいます。 また、詳細は3章にて説明しますが、「部屋全体を撮影した写真」と「影部分となった箇所を個別に撮影した写真」をフォトグラメトリ上で1つのモデルとして繋げるには、それぞれの写真の間となる写真も必要になります。(RealityCaptureの場合は前後の写真にて最低60%の重なりを維持する必要あり) その為、「影部分」は可能な限り作らないようにすることが最重要です。 3Dモデル化した後の利用を考えた際にも「既に物体が置かれている部屋」というのは扱いづらいですので、「部屋」と「内部にある物体」は別々にモデル化する方式が望ましいです。 (画像:部屋中央に物体がある際に発生する「影部分」) また、 GSD(地上解像度)の計算 を行うことで、作成する3Dモデルのテクスチャ解像度を事前に想定することが出来ます。 GSDは「センサー幅」「 焦点距離 」「高さ」「画像幅(pixel)」「画像高さ(pixel)」を元に地上面における解像度を導出するものですが、「高さ」部分を「部屋内の最も遠い部分までの距離」とすることで、作成テクスチャ内の最も低い解像度箇所が導出できます。 テクスチャで担保したい解像度ラインがある場合は、あらかじめGSDを計算しておくと安心です。 参考: PIX4D TOOLS - GSD calculator その他のポイントとしては、以下が挙げられます。 ガラス面や白一色の壁はフォトグラメトリで再現不可(特徴点として認識できない為)。 対象箇所は新聞紙などでマスキング を施しておく(後続フローにて手作業の修正が必要)。 撮影時の移動経路をあらかじめ想定し、目印としてマステなどを貼っておく。 移動経路は一筆書きの動きでイメージ し、写真同士が連続するように組む 撮影の「始まりの写真」と「終わりの写真」がきちんと連続するように、 撮影開始地点は特徴点の多い場所 に定める。 部屋の高さを確認し、場合によっては伸縮ロッドやコンパクトカメラの利用を検討する。 2-3.建物外観(屋外) 屋外にて建物外観を撮影する際のポイントは、 太陽光と人払い です。 屋内と異なり、屋外では太陽光の影響を取り除くことが出来ません。 時間による太陽の位置変化や、雲から出た/隠れた際の日照量変化によって露出が変わってしまいます。 その為、屋外で撮影を行う際はあらかじめ移動ルートを確立しておき、 曇りの日に短時間で 撮影を完了させることが望ましいです。 また、写真は後処理で明るくすることが出来ます。(逆に暗くするのは難しいです) 黒潰れしない範囲で全体的に暗めに撮影しておき、後処理で明るくして全体の調整を行いましょう。 2点目は人払いです。 こちらは公共の屋内(美術館など)でも関係する話ですが、屋外での撮影は基本的に公共の場所・建築物の撮影になります。 フォトグラメトリ用の写真では、途中で人が入り込んでしまうと写真の連続性が維持できなくなってしまう為、公共の場所であっても人(その他の動く物体含む)が映らないよう配慮する必要があります。 上記のような場所を長時間に渡って占有する(他の人を近づけさせない)場合、大抵は管理者の許可が必要です。 占有自体が禁止されている場合もありますので、撮影対象に関するルールは事前に確認しておきましょう。 また、高所を撮影する際にドローンを使いたくなりますが、2023年6月現在ドローン使用に関する法規制はかなり厳しいです。(場合によっては国家資格も求められます) その為、高所撮影は基本的に「小型カメラ+伸縮ロッド(1~10m程)」での実施を検討しましょう。 3.被写体の撮影 被写体の撮影時に注意するポイントを、場面ごとに紹介していきます。 3-1.共通 まず初めに、全場面に共通するポイントを紹介します。 3-1-1.前後の写真で70%以上の重なりを維持する RealityCaptureに取り込んでアライメントを行う場合、最低60%(可能なら70%)の重なりが必要です。 ただし実際に「70%」を感覚的に行うのは難しいと思いますので、私なりのやり方を紹介します。 フォトグラメトリ用の写真撮影では、カメラの向きと垂直方向への移動(動きとしては横移動)が基本になります。 その為、まずは1撮影ごとの横移動可能な距離を感覚的に把握する必要があります。 カメラの向きを変えないまま横移動する場合、移動距離がそのまま写真に反映されるので、写真の横幅1/3程度(約30%)分移動できることになります。 (画像:カメラと垂直方向への移動イメージ) 実際に移動できる距離はカメラの広角性能によりますので、試しに何回か横移動しながら写真を撮り、 「写真上で横幅1/3分移動する自分の歩幅」を確認しましょう。 3-1-2.カメラの向きを変える際は、細かく移動(撮影)しながら変える カメラの向きを変える際に、一点に留まって向きだけを変えると重なりのバランスが悪くなってしまいます。 向きを変える際は、細かめに移動しながら少しずつ向きを変えましょう。 (画像:方向転換方法による重なりの違い) 3-1-3.全体が鮮明な写真を撮影する(被写体深度を深くする) フォトグラメトリにおいて、ボケ感のある写真は望ましくありません。 ポートレート のような被写体深度の浅い写真ではなく、全体がクッキリと映った写真を撮影しましょう。 具体的な設定方法としては、 F値 (絞り)を大きくします。 設定値はカメラの性能や周囲の明るさによりますが、低くても4以上が望ましいです。(可能であれば11や14など) (画像:被写体深度によるピンボケの違い) 3-1-4.ノイズや手振れを発生させない 前項と関係する話になりますが、 F値 を上げるためにレンズを絞ると、レンズから入る光の量が減少してしまいます。 そのままだと暗い写真になってしまう場合、 ISO感度 と シャッタースピード を調整して明るくする必要があります。 しかし、 ISO感度 は上げすぎるとノイズが発生してしまい、 シャッタースピード は遅くすると手振れが発生しやすくなります。 両方をバランスよく調整して、ノイズや手振れを発生させないようにしましょう。 また、どうしてもノイズや手振れが発生してしまう場合は、「 F値 を下げる」または「三脚を使用する」ことを検討しましょう。 (画像:ノイズや手振れの発生例) 3-1-5.動く物体を撮影しない 上述した通り、フォトグラメトリでは画像の重なりがとても重要です。 人間などの動く物体が映り込んでいると写真間の重なりが正しく判定されなくなる恐れがあるので、静止した物体のみを撮影するようにしましょう。 また、撮影の途中で物体の向きや場所を変えるのも厳禁です。 撮影の開始と終了時で、撮影範囲内のすべての物体が変化しないようにしましょう。 ※グリーンバックなどを用いて背景をマスク処理する場合は例外です (画像:動物の映り込みが発生した例) 3-1-6.黒つぶれや白飛びを発生させない 黒つぶれや白飛びは現像段階にて調整することが出来ない為、撮影段階で発生させないようにしましょう。 最近のカメラは撮影時や再生時に ヒストグラム (輝度分布)が表示されますので、黒つぶれ・白飛びが見られる場合は露出補正をかけて対処します。 なお、蛍光灯のように常に白飛びしてしまう部分や、テクスチャのクオリティを求めない黒い部分などは適宜妥協しましょう。 (画像:黒つぶれ・白飛びの発生例) 3-1-7.写真間の「明暗」・「色調」に大きな差を出さない 写真間の「明暗」・「色調」が異なる場合、テクスチャの色合いが場所ごとに変わってしまいます。 現像段階にて調整することも可能ですが、可能な限り撮影時に揃えておくことが望ましいです。 露出変化が激しい場所での撮影では、適宜露出計を用いての調整も検討しましょう。 (画像:撮影中に明暗が変化した例) 3-2.屋内空間(部屋全体など) 次に、屋内空間を撮影する時に意識するポイントを紹介します。 3-2-1.カメラの向きと垂直方向へ移動しながら撮影する 3-1-1で記載した通り、フォトグラメトリではカメラの向きと垂直方向への移動(横移動)が基本です。 屋内の場合、壁面の地上解像度が求めるクオリティに収まる範囲で壁面から距離を取り、そこから横移動して撮影します。 1セットで足りない場合は、壁面からの距離を変えて横移動の撮影を繰り返しましょう。 (画像:横移動のイメージ) 3-2-2.撮影開始地点と終了地点は特徴点の多い場所を選ぶ 1セットの開始地点と終了地点を特徴点の多い場所にすると、他セットの写真と接続しやすくなります。 部屋内に特徴点の多い場所が一点しかない場合は、常にその一点に行き着くようにセットを組みましょう。 注意点として、ある程度特徴点の多い場所であっても、部屋内に同じような場所が存在する場合は候補から外しましょう。 ※この場合横移動だけでは撮影できない部分が出てきますので、適宜方向転換も行いながらの撮影になります。 (画像:特徴点の多い場所・少ない場所) 3-2-3.写真は「低い位置からの斜め上目線」と「高い位置からの斜め下目線」で撮影する カメラの位置と向きに関しては、「低い位置からの斜め上目線」と「高い位置からの斜め下目線」の2パターンで撮影します。 理由としては、この目線が最も広範囲に部屋内を撮影できるからです。 「低い位置」は床付近、「高い位置」は可能な限り天井に近い場所になります。(適宜三脚などを利用しましょう) なお、天井が高く上記の視点では天井・床に対して必要な地上解像度が得られない場合は、別の高さでの撮影も行う必要があります。 (画像:屋内撮影時のカメラ視点イメージ) 3-3.屋外 最後に、屋外での撮影時に気を付けるポイントを紹介します。 3-3-1.曇りの日に撮影する 3-1-7で記載した通り、写真間の「明暗」・「色調」は撮影段階で揃えておくことが望ましいです。 晴れの日など、短時間の日射量変化が激しい日は撮影に適しません。 また、快晴の日は晴れほど日射量変化は激しくないですが、後述するフレア・ゴーストが発生しやすくなります。 その為、曇りで日射量の少ない日が撮影に適しています。 (画像:理想の天気状況と、晴れた日の影響例) 3-3-2.逆光による光条・ゴーストを発生させない 逆光状態で撮影を行うと、光条やゴーストが発生してしまいます。 これはテクスチャに影響にしてしまうので、撮影角度や撮影時間を変えて、可能な限り発生させないようにします。 どうしても発生してしまう場合は、その写真をアライメントのみに利用し、テクスチャ作成時には取り除きましょう。 (画像:光条・ゴーストの発生例) 3-3-3無風状態のときに撮影する 3-1-5で記載した通り、フォトグラメトリでは撮影物体を静止させる必要があります。 屋外で撮影する場合、風の影響で木や葉が揺れてしまいますので、無風状態を狙って撮影しましょう。 無風状態で撮影できない場合は、別日での撮影を検討します。 (画像:撮影毎に木の枝が動いてしまった例) おわりに 本記事では、フォトグラメトリワークフローの前編として、機材選定に関する部分と撮影前・撮影時の注意ポイントについて紹介しました。 これからフォトグラメトリを始める方で、「どんな機材を揃えたらいいんだろう?」「撮影前や撮影時に何を意識すればいいんだろう?」という悩みを持つ方の一助となれば幸いです。 後編 ではRealityCaptureに取り込む前の現像処理や、RealityCaptureを用いてのモデル作成部分を紹介していきますので、こちらも御一読いただければ幸いです。 現在ISIDは web3領域のグループ横断組織 を立ち上げ、Web3および メタバース 領域のR&Dを行っております(カテゴリー「3DCG」の記事は こちら )。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください! 私たちと同じチームで働いてくれる仲間を、是非お待ちしております! ISID採用ページ 参考資料 ・ 日本写真印刷コミュニケーションズ株式会社:「フォトグラメトリ」とはどういうもの? ・ フジヤカメラ:カメラの画素数は多ければいいの!?画素数と画質の関係 高画素のメリット・デメリット ・ フジヤカメラ:PL(偏光)フィルターの効果と使い方、使用例、選び方、特徴 ・ 姫野ばら園:カメラコラム「レンズの焦点距離と画角の変化」 ・ EpicGames:OS and hardware requirements ・ DRONE NAVIGATOR:ドローンとは何か ・ PIX4D:TOOLS - GSD calculator ・ STUDIO DUCKBILL 広域・環境フォトグラメトリの世界 執筆: @matsuzaki.shota 、レビュー: @yamashita.yuki ( Shodo で執筆されました )
ISID X(クロス) イノベーション 本部 デジタルエンゲージメントセンター の 根本康平 です。 今回は「Teamsを日ごろ利用している・面倒な作業は嫌・作業を自動化させたい・PowerAutomateは良く知らない」という方に向けて、PowerAutomateで何ができるのかをご紹介する記事です。 本記事の前半では、1から簡単な自動化処理を作り「PowerAutomate」についての理解を深めます。 記事の後半では、PowerAutomateで使える機能や「テンプレート」に触れ、簡単に複雑な自動化処理を作ることができることを知っていただければと思います。 PowerAutomateとは フローを作って自動でTeamsのチャネルにメッセージを投稿する 複雑な自動化機能も簡単に作れる PowerAutomateとは 先ほどから数回登場していた「PowerAutomate」は、 Microsoft が提供している業務効率化を目的としたツールです。 自動ワークフローを作ることで、面倒な定型作業や繰り返し作業を人の代わりにやってくれます。 具体的には、「メールを受信したらTeamsに通知が来るようにする」「メールに添付されているファイルをOneDriveに自動保存する」「 Excel データを定期的に加工する」などの作業を自動でやってくれます。 時間の削減はもちろん、単純な作業ミスなども減らすことが可能です。 フローを作って自動でTeamsのチャネルにメッセージを投稿する ここから、15分で出来るTeams自動投稿フローの作り方を紹介します。 なお、PowerAutomateが利用できる環境/ユーザであることを前提とした説明です。 完成するフローで出来ることは次のとおりです。 毎週金曜日 18:00 に特定のTeamsチャネルに自動でメッセージを投稿 自分と上司Aに対してメンション 以下の流れでフローを作成します。 毎週金曜日 18:00 に起動する新しいフローを作る メンションするユーザを決めるアクションを作る メッセージ内容を決め、Teamsに投稿するアクションを作る 動作をテストする それでは、いよいよフロー作成の手順を紹介します。 Teamsアプリを開く 「アプリ」をクリック 「Power Automate」をクリック 「ウェブサイトを表示する」をクリック 「マイフロー」をクリック 「新しいフロー」をクリック 「スケジュール済み クラウド フロー」をクリック フロー名を入力、開始日に任意の日付と時間を入力、繰り返し間隔を1週間、金曜を選択し「作成」をクリック Recurrence をクリック 「詳細オプションを表示する」をクリック 設定時刻(時間)に18、設定時刻(分)に0を入力(これで毎週金曜日の18:00にこのフローが実行されます) 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「ユーザーの@mention トーク ンを取得する」をクリック ユーザーの@mention トーク ンを取得する文字の横、 三点リーダ ーをクリックし名前を「自分へのメンション」と変更 ユーザーの欄に自分のユーザ プリンシパル ネーム(基本的にはメールアドレス)を入力 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「ユーザーの@mention トーク ンを取得する」をクリック ユーザーの@mention トーク ンを取得するの文字横、 三点リーダ ーをクリックし名前を「上司へのメンション」と変更 ユーザーの欄に上司Aのユーザ プリンシパル ネーム(基本的にはメールアドレス)を入力 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「チャットまたはチャネルでメッセージを投稿する」をクリック 投稿者で「フローボット」を選択 投稿先で「Channel」を選択 Teamで[投稿したいTeam]を選択 Channelで[投稿したいChannel]を選択 Messageの Add message をクリック、動的なコンテンツから[上司へのメンション@mention]と[自分へのメンション @mention]をクリック 改行し、投稿に書きたいメッセージを記入 画面右上の「保存」をクリック 画面右上の「テスト」をクリック 「手動」を選択し、「テスト」をクリック 「フローの実行」をクリック(*実際に動作をテストするものです。本当に自分と上司Aをメンションして投稿がされますのでご注意ください!) 「フロー実行ページ」をクリック 開始時間をクリック、フローがどのように実行されたか確認できます。 テストで実際に指定したChannelにメンション付きの投稿がされたかを確認 「マイフロー」をクリック 今回作成したフローをクリック 「オフにする」をクリック(これを忘れると、毎週金曜日18:00に投稿されてしまうので注意してください!) 15分で出来るTeams自動投稿フロー作成の説明は以上です。 複雑な自動化機能も簡単に作れる 上のハンズオンでは「 ユーザーの@mention トーク ンを取得する 」「 チャットまたはチャネルにメッセージを投稿する 」の2つのアクションしか使用していませんが、他にも様々なアクションが可能です。ご自身で触れる方は、色々と試してみてください。 例えば、「変数」と入力すれば「 変数の設定 」や「 配列変数に追加 」が出来たり、「 条件分岐 」や「 繰り返し 」、「 Excel の情報を取得・更新・削除 」も可能です。「 メールの送信 」や「 AIモデルの構築 」も出来ます。 とはいえ、複雑なフローを作ろうとしたら、時間がかかり途中で挫折してしまうかもしれません。 ですが、様々なフローが「 テンプレート 」として用意されているので、これを使うと楽にフローを作ることができます。 例えば、 Microsoft Formsでアンケートを提出するとメール通知され Sharepoint リストに回答内容が保存されるフロー、ボタンを押したら10分後にTeamsで通知されるフローなど、様々なテンプレートが用意されています。 これらのテンプレートを使いながら、自分流にフローをカスタマイズして利用できます。 面倒な承認作業や勤怠管理などもPowerAutomateを使って効率化できそうですね! 私の所属しているユニットや部署では、PowerAutomateを使って次のようなことをしています。 毎日の勤怠管理:特定の時間までに勤務開始のアクションがない社員に対して、勤務開始しているかを確認するTeamsメッセージ投稿を自動で行う ポータルサイト のアクションを通知:ユニット内で活用している ポータルサイト に新しい記事が投稿されたりアクションが行われた場合に、特定のTeamsチャネルにメッセージを投稿する 定期的に Excel データの確認と推移グラフの作成:毎月特定の Excel ファイル内のデータを確認し、月ごとにデータがどのように推移したかを表すグラフを作成する 私の所属するユニットでは「作業を効率化するにはどうすればよいか」「メンバー間のコミュニケーションを活発にするためにどうすればよいか」などを定期的に社員同士で話し合い、PowerAutomateをはじめ様々なツールを活用して課題を解決しています。 今回はPowerAutomateを紹介いたしました。他にも、PowerAppsという簡単にアプリを作成できるツールもあったりします。PowerAppsの使い方を紹介するような記事も書くかもしれないので、また見ていただけると嬉しいです! ISID X(クロス) イノベーション 本部 デジタルエンゲージメントセンター では、 Microsoft Power Platform 、 Dynamics 365 、 Salesforce を用いたDX推進 などをしております。全社的なDX推進や顧客接点の最適化、エンゲージメントの強化などのお困り事がございましたらお気軽にお問合せください。 ISID顧客接点DXソリューションサイトはこちら 私たちは一緒に働いてくれる仲間を募集しています! 【全社集約】CRMソリューションコンサルタント IT業界に興味のある就活生の皆さま、ぜひご応募ください! 【新卒採用】ISID リクルートサイト 執筆: @nemoto.kouhei 、レビュー: @fukutake.hiroaki ( Shodo で執筆されました )
ISID X(クロス) イノベーション 本部 デジタルエンゲージメントセンター の 根本康平 です。 今回は「Teamsを日ごろ利用している・面倒な作業は嫌・作業を自動化させたい・PowerAutomateは良く知らない」という方に向けて、PowerAutomateで何ができるのかをご紹介する記事です。 本記事の前半では、1から簡単な自動化処理を作り「PowerAutomate」についての理解を深めます。 記事の後半では、PowerAutomateで使える機能や「テンプレート」に触れ、簡単に複雑な自動化処理を作ることができることを知っていただければと思います。 PowerAutomateとは フローを作って自動でTeamsのチャネルにメッセージを投稿する 複雑な自動化機能も簡単に作れる PowerAutomateとは 先ほどから数回登場していた「PowerAutomate」は、 Microsoft が提供している業務効率化を目的としたツールです。 自動ワークフローを作ることで、面倒な定型作業や繰り返し作業を人の代わりにやってくれます。 具体的には、「メールを受信したらTeamsに通知が来るようにする」「メールに添付されているファイルをOneDriveに自動保存する」「 Excel データを定期的に加工する」などの作業を自動でやってくれます。 時間の削減はもちろん、単純な作業ミスなども減らすことが可能です。 フローを作って自動でTeamsのチャネルにメッセージを投稿する ここから、15分で出来るTeams自動投稿フローの作り方を紹介します。 なお、PowerAutomateが利用できる環境/ユーザであることを前提とした説明です。 完成するフローで出来ることは次のとおりです。 毎週金曜日 18:00 に特定のTeamsチャネルに自動でメッセージを投稿 自分と上司Aに対してメンション 以下の流れでフローを作成します。 毎週金曜日 18:00 に起動する新しいフローを作る メンションするユーザを決めるアクションを作る メッセージ内容を決め、Teamsに投稿するアクションを作る 動作をテストする それでは、いよいよフロー作成の手順を紹介します。 Teamsアプリを開く 「アプリ」をクリック 「Power Automate」をクリック 「ウェブサイトを表示する」をクリック 「マイフロー」をクリック 「新しいフロー」をクリック 「スケジュール済み クラウド フロー」をクリック フロー名を入力、開始日に任意の日付と時間を入力、繰り返し間隔を1週間、金曜を選択し「作成」をクリック Recurrence をクリック 「詳細オプションを表示する」をクリック 設定時刻(時間)に18、設定時刻(分)に0を入力(これで毎週金曜日の18:00にこのフローが実行されます) 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「ユーザーの@mention トーク ンを取得する」をクリック ユーザーの@mention トーク ンを取得する文字の横、 三点リーダ ーをクリックし名前を「自分へのメンション」と変更 ユーザーの欄に自分のユーザ プリンシパル ネーム(基本的にはメールアドレス)を入力 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「ユーザーの@mention トーク ンを取得する」をクリック ユーザーの@mention トーク ンを取得するの文字横、 三点リーダ ーをクリックし名前を「上司へのメンション」と変更 ユーザーの欄に上司Aのユーザ プリンシパル ネーム(基本的にはメールアドレス)を入力 「新しいステップ」をクリック コネクタとアクションを検索する 欄に Teams と入力し、「チャットまたはチャネルでメッセージを投稿する」をクリック 投稿者で「フローボット」を選択 投稿先で「Channel」を選択 Teamで[投稿したいTeam]を選択 Channelで[投稿したいChannel]を選択 Messageの Add message をクリック、動的なコンテンツから[上司へのメンション@mention]と[自分へのメンション @mention]をクリック 改行し、投稿に書きたいメッセージを記入 画面右上の「保存」をクリック 画面右上の「テスト」をクリック 「手動」を選択し、「テスト」をクリック 「フローの実行」をクリック(*実際に動作をテストするものです。本当に自分と上司Aをメンションして投稿がされますのでご注意ください!) 「フロー実行ページ」をクリック 開始時間をクリック、フローがどのように実行されたか確認できます。 テストで実際に指定したChannelにメンション付きの投稿がされたかを確認 「マイフロー」をクリック 今回作成したフローをクリック 「オフにする」をクリック(これを忘れると、毎週金曜日18:00に投稿されてしまうので注意してください!) 15分で出来るTeams自動投稿フロー作成の説明は以上です。 複雑な自動化機能も簡単に作れる 上のハンズオンでは「 ユーザーの@mention トーク ンを取得する 」「 チャットまたはチャネルにメッセージを投稿する 」の2つのアクションしか使用していませんが、他にも様々なアクションが可能です。ご自身で触れる方は、色々と試してみてください。 例えば、「変数」と入力すれば「 変数の設定 」や「 配列変数に追加 」が出来たり、「 条件分岐 」や「 繰り返し 」、「 Excel の情報を取得・更新・削除 」も可能です。「 メールの送信 」や「 AIモデルの構築 」も出来ます。 とはいえ、複雑なフローを作ろうとしたら、時間がかかり途中で挫折してしまうかもしれません。 ですが、様々なフローが「 テンプレート 」として用意されているので、これを使うと楽にフローを作ることができます。 例えば、 Microsoft Formsでアンケートを提出するとメール通知され Sharepoint リストに回答内容が保存されるフロー、ボタンを押したら10分後にTeamsで通知されるフローなど、様々なテンプレートが用意されています。 これらのテンプレートを使いながら、自分流にフローをカスタマイズして利用できます。 面倒な承認作業や勤怠管理などもPowerAutomateを使って効率化できそうですね! 私の所属しているユニットや部署では、PowerAutomateを使って次のようなことをしています。 毎日の勤怠管理:特定の時間までに勤務開始のアクションがない社員に対して、勤務開始しているかを確認するTeamsメッセージ投稿を自動で行う ポータルサイト のアクションを通知:ユニット内で活用している ポータルサイト に新しい記事が投稿されたりアクションが行われた場合に、特定のTeamsチャネルにメッセージを投稿する 定期的に Excel データの確認と推移グラフの作成:毎月特定の Excel ファイル内のデータを確認し、月ごとにデータがどのように推移したかを表すグラフを作成する 私の所属するユニットでは「作業を効率化するにはどうすればよいか」「メンバー間のコミュニケーションを活発にするためにどうすればよいか」などを定期的に社員同士で話し合い、PowerAutomateをはじめ様々なツールを活用して課題を解決しています。 今回はPowerAutomateを紹介いたしました。他にも、PowerAppsという簡単にアプリを作成できるツールもあったりします。PowerAppsの使い方を紹介するような記事も書くかもしれないので、また見ていただけると嬉しいです! ISID X(クロス) イノベーション 本部 デジタルエンゲージメントセンター では、 Microsoft Power Platform 、 Dynamics 365 、 Salesforce を用いたDX推進 などをしております。全社的なDX推進や顧客接点の最適化、エンゲージメントの強化などのお困り事がございましたらお気軽にお問合せください。 ISID顧客接点DXソリューションサイトはこちら 私たちは一緒に働いてくれる仲間を募集しています! 【全社集約】CRMソリューションコンサルタント IT業界に興味のある就活生の皆さま、ぜひご応募ください! 【新卒採用】ISID リクルートサイト 執筆: @nemoto.kouhei 、レビュー: @fukutake.hiroaki ( Shodo で執筆されました )
テックブログ編集部の山下です。 今回は自分が登壇するイベントを紹介します。詳細およびお申込みはリンク先サイトを参照してください。 https://techplay.jp/event/913881 参加登録のお願い この発表を行う山下です。 近年リモート開発環境がいくつか台頭してきつつあります。 AWS Codecatalyst、 Google Workstations、 GitHub Codespacesといったものです。 このイベントでは、 GitHub Codespacesと Visual Studio Code のDev Containerを紹介します。 これらの技術を用いることで柔軟で安定した開発環境の構築が可能になります、イベントではこれらの技術のメリット、デメリットや基本的な仕組みについて紹介します。 御興味があるかたは是非登録してみてください。 基本情報 タイトル:乱立する環境、リソースの制約、環境構築にはもう悩まされない!-ストレスフリーな開発を実現する GitHub Codespaces- 日時:2023/09/06(水) 19:00 〜 20:15 形態:オンライン開催 概要 今、ベストな環境で開発に挑めていますか? テレワークが新たな常態となった今、開発環境におけるあらゆる課題に頭を抱える方も多く、 Yesと答えることのできた方は多くないのではないでしょうか。 コードレビューや デバッグ を行う度に乱立する環境 ローカル環境のセットアップやメンテナンス、バックアップ作業 マシンスペックに左右されて安定しない処理速度 などさまざまな課題の影響により、 開発に割く時間よりも多くの時間を環境整備に費やしているといった方も少なくありません。 開発をスムーズに進めるための最重要事項は、効率的な作業環境で開発者のストレスを軽減することです。 ISIDではストレスフリーな開発環境を作り出すべく、 ソリューションのひとつとして「 GitHub Codespaces」の導入に挑戦。 早速社内プロジェクトで検証を行い、 ・ロケーション違い(社内/社外)での開発や異なるマシンでの作業に合わせた環境構築が不要になった ・環境構築手順が煩雑、不明瞭な場合でも、機能を組み合わせることで手軽に環境を再現できた といったような成果が得られ、今後の利用拡大にも期待が高まっています。 本イベントでは、「 GitHub Codespaces」を採用した理由から導入における挑戦、得られた成果など実例を交えて共有します。 「 GitHub Codespaces」活用から見る、健康的なソフトウェア開発のためのヒント満載な1時間15分をお楽しみに! 執筆: @yamashita.tsuyoshi 、レビュー: @sato.taichi ( Shodo で執筆されました )
テックブログ編集部の山下です。 今回は自分が登壇するイベントを紹介します。詳細およびお申込みはリンク先サイトを参照してください。 https://techplay.jp/event/913881 参加登録のお願い この発表を行う山下です。 近年リモート開発環境がいくつか台頭してきつつあります。 AWS Codecatalyst、 Google Workstations、 GitHub Codespacesといったものです。 このイベントでは、 GitHub Codespacesと Visual Studio Code のDev Containerを紹介します。 これらの技術を用いることで柔軟で安定した開発環境の構築が可能になります、イベントではこれらの技術のメリット、デメリットや基本的な仕組みについて紹介します。 御興味があるかたは是非登録してみてください。 基本情報 タイトル:乱立する環境、リソースの制約、環境構築にはもう悩まされない!-ストレスフリーな開発を実現する GitHub Codespaces- 日時:2023/09/06(水) 19:00 〜 20:15 形態:オンライン開催 概要 今、ベストな環境で開発に挑めていますか? テレワークが新たな常態となった今、開発環境におけるあらゆる課題に頭を抱える方も多く、 Yesと答えることのできた方は多くないのではないでしょうか。 コードレビューや デバッグ を行う度に乱立する環境 ローカル環境のセットアップやメンテナンス、バックアップ作業 マシンスペックに左右されて安定しない処理速度 などさまざまな課題の影響により、 開発に割く時間よりも多くの時間を環境整備に費やしているといった方も少なくありません。 開発をスムーズに進めるための最重要事項は、効率的な作業環境で開発者のストレスを軽減することです。 ISIDではストレスフリーな開発環境を作り出すべく、 ソリューションのひとつとして「 GitHub Codespaces」の導入に挑戦。 早速社内プロジェクトで検証を行い、 ・ロケーション違い(社内/社外)での開発や異なるマシンでの作業に合わせた環境構築が不要になった ・環境構築手順が煩雑、不明瞭な場合でも、機能を組み合わせることで手軽に環境を再現できた といったような成果が得られ、今後の利用拡大にも期待が高まっています。 本イベントでは、「 GitHub Codespaces」を採用した理由から導入における挑戦、得られた成果など実例を交えて共有します。 「 GitHub Codespaces」活用から見る、健康的なソフトウェア開発のためのヒント満載な1時間15分をお楽しみに! 執筆: @yamashita.tsuyoshi 、レビュー: @sato.taichi ( Shodo で執筆されました )
こんにちは、ISID 金融ソリューション事業部の岡崎です。 今回は前回に引き続き、 UE5でパフォーマンスを担保するために必要な、プロファイリングのワークフローCPU編の説明を行います。 UEでは、制作したプロジェクトの性能を測るためにプロファイリングという作業を行います。 プロファイリングは、主にパフォーマンス改善を目的として実施します。例えばコマンドや専用のアプリケーションを使用して、描画に遅延が起こっていないか、不要な処理をしているBlueprintがないか、などを調べます。 前回の記事(プロファイリングのワークフローGPU編)はこちら になります。 検証環境/ツール OS: Windows 11 pro GPU : NVIDIA GeForce RTX 4070 Ti Game Engine: Unreal Engine 5.2.0 実装手順 「stat unit」コマンドの実施 Gamesの処理が重い場合の対処方法 2-1. Unreal Insightsの使い方 2-2. Session Frontendの使い方 2-3. 遅延原因の特定方法 1. 「stat unit」コマンドの実施 前回に引き続き、「stat unit」コマンドについて説明します。 前回の記事(プロファイリングのワークフローGPU編) に詳しい「stat unit」の紹介があるのでそちらも参考にしてください。 GPU 編でも紹介しましたが、「stat unit」の主要な項目は下記になります。 Frame : 画面を描画するのにかかった処理時間。60FPSのゲームを作成する場合は、16.6ms以下になるように調整しないといけない Game : リアルタイムで動作するゲームのロジックやアニメーションにかかるCPUの処理時間 Draw : 何を描画するか、選択や計算をするためにかかるCPUの処理時間 GPU Time : メッシュや各マテリアルの描画や、ライティングなどにかかる GPU の処理時間 Draws : 描画する必要のあるメッシュの個数。 GPU Timeに影響を与える 対象オブジェクトを整理したり、Naniteを利用してメッシュ数の調整を行うことで、 GPU に関連する値を下げることはできましたが、依然として「Game」の値が高いので、調査、修正を行っていきます。 2. Gamesの処理が重い場合の対処方法 Gameの処理が重い場合は2つの事象が考えられます。 カリングやLODなどを使用してレベル内のどのオブジェクトを描画するか、事前に計算するためにCPUを使用している ゲームプレイ中のキャ ラク ターの動作や、アクター、その他のBlueprintの処理や計算をするためにCPUを使用している 今回はゲームプレイ中のBlueprintの挙動について、プロファイリング方法を紹介します。 カリングやLODに関しては、本記事では割愛いたします。 2-1. Unreal Insightsの使い方 Unreal Insightsは、 Unreal Engine に標準で搭載されているプロファイリングシステムのことで、 データの収集、分析、および視覚化を行ってくれます。 今回はこのシステムを使用して、アプリの ボトルネック を探しパフォーマンスを向上させていきます。 まず Unreal Insightsを開いていきます。 UEをダウンロードする際に同時にダウンロードされているので、下記画像のように UE > Engine > Binaries > Win64 の中にある「UnrealInsights.exe」を開きます。 アプリケーションが開きますが、今は一旦このまま置いておきます。 (下の画像ではいくつかデータが入っていますが、初めて開いた場合はデータには何も入っていません。) 次にゲーム起動時にプロファイリング用のデータを作成する設定を行います。 UEのエディタの環境設定から、プレイ > 追加の起動パラメータ の欄に下記コマンドを追加します。 -trace=cpu,frame,bookmark,log -statnamedevents このコマンドにより、 スタンドアロン モードでゲームを開始した時、ログとしてプロファイリング用のデータが Unreal Insightsで参照可能な形式で作成されます。 スタンドアロン モードでゲームを起動中に Unreal Insightsを開くとデータが「LIVE」で作成されているのを確認できます。 起動後10秒くらいしたらゲームを終了し、作成されたデータを Unreal Insightsで確認します。 今回はゲームを起動するためのプロファイリングではなく、通常ゲーム時のプロファイリングを行いたいので、 下の画像右側の、安定し始めた部分のデータを調査します。 右側の部分をクローズアップした画像がこちらです。 上段のピンクと黄緑の帯でFEngineLoopと書かれている部分があります。 これが1フレームの処理になり、今回の場合だと180msほどかかってしまっています。 (60FPSのゲームを目指す場合は16.6ms以下を目指さないといけない) 次にもう少し細かく見ていきます。 1フレームの処理の中で時間のかかっていそうな処理を調べていきます。 このデータの見方は、上から順に処理が細かくなっていき、各処理の流れは右方向に進んでいきます。 何度もプロファイリングを行っている人なら、パッと見ただけでどこら辺がおかしいのかわかるのかもしれないですが、 自分はまだ初学者なので少しずつ解読します。 細分化されている下の方の処理で、明らかに長い時間がかかってしまっている処理が、紫色の帯のFunctionという部分になります。 1フレーム全体で180msほどかかっているのに対し、このFunctionで177.9msもの時間を使っているようなので、ほぼこの処理のせいで遅くなっているように見えます。 このFunctionの親を見てみるとBlueprint Timeと書かれた帯があるので、ここではBlueprintに問題があるのかな、くらいまでわかります。 Unreal Insightsは、処理全体の流れや、どこら辺で問題が起きているかなどを見るために使います。 しかし、Blueprintのひとつひとつまで詳しくみることはできないので、次は別のプロファイリングシステムを使ってもう少し深ぼっていきます。 2-2. Session Frontendの使い方 Session Frontendも、 Unreal Insightsと同様、 Unreal Engine に標準で搭載されているプロファイリングシステムのことで、 データの収集、分析、および視覚化を行ってくれます。 Unreal Insightとの違いは、Session Frontendの方が、より詳しくファンクションの中身を見ていくことができますが、一方で Unreal Insightsほど可視性がよくないです。 そのため、 Unreal Insightsで大体の処理の流れと問題点のあたりをつけ、Session Frontendで詳しく見ていく流れが良いと思います。 Session Frontendを使うためにも専用のセッションデータが必要になるので、コマンドでデータを作成します。 UEのゲームを開始した上で、画面下部のアウトプットログタブから、コマンド入力欄に「stat startfile」と入力します。 コマンドを入力するとゲーム画面上にプロファイリング中の文字が表示されます。 こちらも同じく10秒ほど待機してから、コマンド入力欄に「stat stopfile」と入力します。 これでデータが取得できました。 画面上部のツールタブからセッションフロントエンドを選択し、画面を表示させます。 プロファイラのタブへ移動し、画面中央上部のファイルをロードボタンを押下します。 ファイル選択画面になるので、最新のフォルダを選択します。 (初めて行う際は一つしかフォルダが表示されないはずです。) フォルダを選択するとプロファイラ画面にデータが表示されます。 今回使用するのは右下のイベント名と書かれた部分になります。 通常ゲーム時のプロファイリングを行いたい場合は、イベント名から「GameThread」を選択します。 その後は、 Unreal Insightsで表示があった「FrameTime」を選択し、処理時間がかかっているタブをどんどん開いていきます。 今回の場合は、最終的にファンクション名まで行き着きました。 Function/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C.MeanlessFunction 「BP_ThirdPersonCharacter」の「MeanlessFunction」というファンクションに時間がかかってしまっているようなので、検証します。 2-3. 遅延原因の特定方法 Unreal InsightsとSession Frontendを利用して、遅延の原因になっていそうなファンクションを特定したので、実際にUE画面から調査してみます。 BP_ThirdPersonCharacterのファイルを開き、Blueprintを確認します。 ファイル内に「Meanless Function」というファンクションが「イベントTick」につながっており、毎フレームごとに呼ばれてしまっていることがわかります。 ファンクションの内部に移動すると、文字通り、意味のない処理をFor文で2万回も行っていました。 1フレームごとに2万回、print stringをしていると考えると恐ろしいバグです。 (もちろん仕込みです。すみません。) この「Meanless Function」を削除し、もう一度ゲームを開始してみます。 見事「Game」の数値が改善され「Frame」も60FPSに対応できる数値まで改善できました。 念の為 Unreal InsightsやSession Frontendも確認しましたが、修正前と比べ異常な処理時間がかかっている部分がなくなっているのを確認できました。 おわりに 今回は、前回に引き続き、UE5を利用してプロファイリングの方法を説明してきました。 今回学習した、 GPU で問題になっている箇所を探して対策を行い、その次にCPUで問題になっている箇所を探すフローは、 今後の実際の現場でも使っていけるのではないかと感じています。 もちろん実際のプロジェクトでは、より複雑に原因が入り組んでいることが想像できるので、 基礎の勉強をしつつ、実際のプロファイリングもどんどん行っていきたいです。 まだ 前回の記事(プロファイリングのワークフローGPU編) をご覧になっていない方は、そちらも是非読んでいただけると嬉しいです。 現在ISIDは web3領域のグループ横断組織 を立ち上げ、Web3および メタバース 領域のR&Dを行っております(カテゴリー「3DCG」の記事は こちら )。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください! 私たちと同じチームで働いてくれる仲間を、是非お待ちしております! ISID採用ページ(Web3/メタバース/AI) 参考 https://qiita.com/donbutsu17/items/159dfaacfac6a4b1392d https://docs.unrealengine.com/4.27/ja/TestingAndOptimization/PerformanceAndProfiling/UnrealInsights/ https://hub.vive.com/storage/docs/en-us/UnrealPlugin/UnrealProfiler.html 執筆: @okazaki.wataru 、レビュー: @yamada.y ( Shodo で執筆されました )
こんにちは、ISID 金融ソリューション事業部の岡崎です。 今回は前回に引き続き、 UE5でパフォーマンスを担保するために必要な、プロファイリングのワークフローCPU編の説明を行います。 UEでは、制作したプロジェクトの性能を測るためにプロファイリングという作業を行います。 プロファイリングは、主にパフォーマンス改善を目的として実施します。例えばコマンドや専用のアプリケーションを使用して、描画に遅延が起こっていないか、不要な処理をしているBlueprintがないか、などを調べます。 前回の記事(プロファイリングのワークフローGPU編)はこちら になります。 検証環境/ツール OS: Windows 11 pro GPU : NVIDIA GeForce RTX 4070 Ti Game Engine: Unreal Engine 5.2.0 実装手順 「stat unit」コマンドの実施 Gamesの処理が重い場合の対処方法 2-1. Unreal Insightsの使い方 2-2. Session Frontendの使い方 2-3. 遅延原因の特定方法 1. 「stat unit」コマンドの実施 前回に引き続き、「stat unit」コマンドについて説明します。 前回の記事(プロファイリングのワークフローGPU編) に詳しい「stat unit」の紹介があるのでそちらも参考にしてください。 GPU 編でも紹介しましたが、「stat unit」の主要な項目は下記になります。 Frame : 画面を描画するのにかかった処理時間。60FPSのゲームを作成する場合は、16.6ms以下になるように調整しないといけない Game : リアルタイムで動作するゲームのロジックやアニメーションにかかるCPUの処理時間 Draw : 何を描画するか、選択や計算をするためにかかるCPUの処理時間 GPU Time : メッシュや各マテリアルの描画や、ライティングなどにかかる GPU の処理時間 Draws : 描画する必要のあるメッシュの個数。 GPU Timeに影響を与える 対象オブジェクトを整理したり、Naniteを利用してメッシュ数の調整を行うことで、 GPU に関連する値を下げることはできましたが、依然として「Game」の値が高いので、調査、修正を行っていきます。 2. Gamesの処理が重い場合の対処方法 Gameの処理が重い場合は2つの事象が考えられます。 カリングやLODなどを使用してレベル内のどのオブジェクトを描画するか、事前に計算するためにCPUを使用している ゲームプレイ中のキャ ラク ターの動作や、アクター、その他のBlueprintの処理や計算をするためにCPUを使用している 今回はゲームプレイ中のBlueprintの挙動について、プロファイリング方法を紹介します。 カリングやLODに関しては、本記事では割愛いたします。 2-1. Unreal Insightsの使い方 Unreal Insightsは、 Unreal Engine に標準で搭載されているプロファイリングシステムのことで、 データの収集、分析、および視覚化を行ってくれます。 今回はこのシステムを使用して、アプリの ボトルネック を探しパフォーマンスを向上させていきます。 まず Unreal Insightsを開いていきます。 UEをダウンロードする際に同時にダウンロードされているので、下記画像のように UE > Engine > Binaries > Win64 の中にある「UnrealInsights.exe」を開きます。 アプリケーションが開きますが、今は一旦このまま置いておきます。 (下の画像ではいくつかデータが入っていますが、初めて開いた場合はデータには何も入っていません。) 次にゲーム起動時にプロファイリング用のデータを作成する設定を行います。 UEのエディタの環境設定から、プレイ > 追加の起動パラメータ の欄に下記コマンドを追加します。 -trace=cpu,frame,bookmark,log -statnamedevents このコマンドにより、 スタンドアロン モードでゲームを開始した時、ログとしてプロファイリング用のデータが Unreal Insightsで参照可能な形式で作成されます。 スタンドアロン モードでゲームを起動中に Unreal Insightsを開くとデータが「LIVE」で作成されているのを確認できます。 起動後10秒くらいしたらゲームを終了し、作成されたデータを Unreal Insightsで確認します。 今回はゲームを起動するためのプロファイリングではなく、通常ゲーム時のプロファイリングを行いたいので、 下の画像右側の、安定し始めた部分のデータを調査します。 右側の部分をクローズアップした画像がこちらです。 上段のピンクと黄緑の帯でFEngineLoopと書かれている部分があります。 これが1フレームの処理になり、今回の場合だと180msほどかかってしまっています。 (60FPSのゲームを目指す場合は16.6ms以下を目指さないといけない) 次にもう少し細かく見ていきます。 1フレームの処理の中で時間のかかっていそうな処理を調べていきます。 このデータの見方は、上から順に処理が細かくなっていき、各処理の流れは右方向に進んでいきます。 何度もプロファイリングを行っている人なら、パッと見ただけでどこら辺がおかしいのかわかるのかもしれないですが、 自分はまだ初学者なので少しずつ解読します。 細分化されている下の方の処理で、明らかに長い時間がかかってしまっている処理が、紫色の帯のFunctionという部分になります。 1フレーム全体で180msほどかかっているのに対し、このFunctionで177.9msもの時間を使っているようなので、ほぼこの処理のせいで遅くなっているように見えます。 このFunctionの親を見てみるとBlueprint Timeと書かれた帯があるので、ここではBlueprintに問題があるのかな、くらいまでわかります。 Unreal Insightsは、処理全体の流れや、どこら辺で問題が起きているかなどを見るために使います。 しかし、Blueprintのひとつひとつまで詳しくみることはできないので、次は別のプロファイリングシステムを使ってもう少し深ぼっていきます。 2-2. Session Frontendの使い方 Session Frontendも、 Unreal Insightsと同様、 Unreal Engine に標準で搭載されているプロファイリングシステムのことで、 データの収集、分析、および視覚化を行ってくれます。 Unreal Insightとの違いは、Session Frontendの方が、より詳しくファンクションの中身を見ていくことができますが、一方で Unreal Insightsほど可視性がよくないです。 そのため、 Unreal Insightsで大体の処理の流れと問題点のあたりをつけ、Session Frontendで詳しく見ていく流れが良いと思います。 Session Frontendを使うためにも専用のセッションデータが必要になるので、コマンドでデータを作成します。 UEのゲームを開始した上で、画面下部のアウトプットログタブから、コマンド入力欄に「stat startfile」と入力します。 コマンドを入力するとゲーム画面上にプロファイリング中の文字が表示されます。 こちらも同じく10秒ほど待機してから、コマンド入力欄に「stat stopfile」と入力します。 これでデータが取得できました。 画面上部のツールタブからセッションフロントエンドを選択し、画面を表示させます。 プロファイラのタブへ移動し、画面中央上部のファイルをロードボタンを押下します。 ファイル選択画面になるので、最新のフォルダを選択します。 (初めて行う際は一つしかフォルダが表示されないはずです。) フォルダを選択するとプロファイラ画面にデータが表示されます。 今回使用するのは右下のイベント名と書かれた部分になります。 通常ゲーム時のプロファイリングを行いたい場合は、イベント名から「GameThread」を選択します。 その後は、 Unreal Insightsで表示があった「FrameTime」を選択し、処理時間がかかっているタブをどんどん開いていきます。 今回の場合は、最終的にファンクション名まで行き着きました。 Function/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C.MeanlessFunction 「BP_ThirdPersonCharacter」の「MeanlessFunction」というファンクションに時間がかかってしまっているようなので、検証します。 2-3. 遅延原因の特定方法 Unreal InsightsとSession Frontendを利用して、遅延の原因になっていそうなファンクションを特定したので、実際にUE画面から調査してみます。 BP_ThirdPersonCharacterのファイルを開き、Blueprintを確認します。 ファイル内に「Meanless Function」というファンクションが「イベントTick」につながっており、毎フレームごとに呼ばれてしまっていることがわかります。 ファンクションの内部に移動すると、文字通り、意味のない処理をFor文で2万回も行っていました。 1フレームごとに2万回、print stringをしていると考えると恐ろしいバグです。 (もちろん仕込みです。すみません。) この「Meanless Function」を削除し、もう一度ゲームを開始してみます。 見事「Game」の数値が改善され「Frame」も60FPSに対応できる数値まで改善できました。 念の為 Unreal InsightsやSession Frontendも確認しましたが、修正前と比べ異常な処理時間がかかっている部分がなくなっているのを確認できました。 おわりに 今回は、前回に引き続き、UE5を利用してプロファイリングの方法を説明してきました。 今回学習した、 GPU で問題になっている箇所を探して対策を行い、その次にCPUで問題になっている箇所を探すフローは、 今後の実際の現場でも使っていけるのではないかと感じています。 もちろん実際のプロジェクトでは、より複雑に原因が入り組んでいることが想像できるので、 基礎の勉強をしつつ、実際のプロファイリングもどんどん行っていきたいです。 まだ 前回の記事(プロファイリングのワークフローGPU編) をご覧になっていない方は、そちらも是非読んでいただけると嬉しいです。 現在ISIDは web3領域のグループ横断組織 を立ち上げ、Web3および メタバース 領域のR&Dを行っております(カテゴリー「3DCG」の記事は こちら )。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください! 私たちと同じチームで働いてくれる仲間を、是非お待ちしております! ISID採用ページ(Web3/メタバース/AI) 参考 https://qiita.com/donbutsu17/items/159dfaacfac6a4b1392d https://docs.unrealengine.com/4.27/ja/TestingAndOptimization/PerformanceAndProfiling/UnrealInsights/ https://hub.vive.com/storage/docs/en-us/UnrealPlugin/UnrealProfiler.html 執筆: @okazaki.wataru 、レビュー: @yamada.y ( Shodo で執筆されました )
こんにちは、X(クロス) イノベーション 本部 ソフトウェアデザインセンター セキュリティグループの大西です。現在、TypeScriptとReactを使ってWebアプリを開発していますが、フロントエンドの実装を任された際に Linkify と MUI(Material UI) を合わせて使う場面がありました。LinkifyとMUIのコラボ実装はあまり記事がなかったので記事を書いてみました。 Linkifyとは? MUI(Material UI)とは? LinkifyとMUIを一緒に使う まとめ Linkifyとは? Reactでテキスト内のURLをリンクにしたい場面があったとします。こんな感じですね。 Linkifyとは、文字列にURLが含まれているときに自動でリンク化する際に使えるライブラリです。 このように自動でリンク化する方法を探すと、Linkifyを入れて3つほど方法がありました。 Linkifyを使う react-string-replace を使う 自前で実装する 2のreact-string-replaceは1のLinkifyに比べ GitHub のFork数やstar数が少なく、3の自前実装は、 dangerouslySetInnerHTML という関数を使わなければいけなかったため今回はLinkifyを使うことにしました。Linkifyは ドキュメント もしっかり整備されていて、 XSS(クロスサイトスクリプティング)攻撃に対して脆弱にならないような方法 も示されていたのでとても良かったです。 MUI(Material UI)とは? MUIはReactアプリケーションを構築するのに使えるUI コンポーネント の巨大なライブラリです。基礎的なUI要素から高度なUI要素までそろっており、カスタマイズ可能なライブラリが備わっています。基本的に無料で利用できますが、一部有料のライブラリもあります。MUIを使うと、例えば 表(テーブル) や プログレスバー にしても、自分で一から実装するより簡単に実現できます。 MUIを使用して作った表↓ MUIを使用して作った プログレスバー ↓ LinkifyとMUIを一緒に使う Reactアプリを開発している中で、LinkifyとMUIを同時に使いたい場面が出てきました。例えばMUIの Linkコンポーネント とLinkifyを同時に使いたい場合です。LinkifyはもちろんLink コンポーネント を使わなくても以下のように書くと文字列をリンク化できます。 < Linkify > { props.content } < /Linkify > しかし、チーム内であらかじめ統一して作っておいたカスタムリンク コンポーネント (今回は「CustomLink」というカスタムリンク コンポーネント があったとします)を使いたい場合は少し工夫が必要で、 renderオプション が必要です。renderオプションを用いると、リンク要素の生成方法をオーバーライドできます。ターゲットリンクの中間表現(IntermediateRepresentation。タグ名、属性、テキストコンテンツ等を含むオブジェクト)を受け入れる関数を指定し、戻り値は、文字列、HTML 要素、または インターフェイス 固有のエンティティにします。render関数は、結果 (属性、コンテンツなど)を引数として他のすべてのオプションが計算された後に実行されます。実装すると以下のようになります。 チーム内で統一して定義したカスタムリンク コンポーネント ↓ import { Link , LinkProps } from "@mui/material" ; export const CustomLink = ( props: LinkProps ) : JSX. Element => { const { href , children , ...other } = props ; return ( < Link { ...other } href = { href } target = "_blank" rel = "noopener noreferrer" color = "#FF0000" ...などチーム内で設定したオプション > { children } < /Link > ); } ; 上記のカスタムリンク コンポーネント を使えるように新しい コンポーネント を作成する↓ import { IntermediateRepresentation } from "linkifyjs" ; import { CustomLink } from "CustomLinkを定義したファイル" ; export const renderLink = ( ir: IntermediateRepresentation ) : JSX. Element => { return < CustomLink { ...ir.attributes } > { ir.content } < /CustomLink >; } ; そして、CustomLinkをリンク化したいコンテンツを表示する tsx ファイルに持っていき、renderオプションに渡す↓ < Linkify options = {{ render: renderLink }} > { props.content } < /Linkify > としてやれば、チーム内で統一して使っているカスタムリンク コンポーネント を使って、文字列内のURLをリンク化できます!IntermediateRepresentationについて補足ですが、 ・ir.attributes 内に href プロパティなどaタグの属性が渡ってくる ・ir.content はリンクの表記が渡ってくる という仕様になっています。 ちなみにLink コンポーネント を扱う際に target="_blank" をつける場合は、 rel="noopener" と rel="noreferrer" オプションをつけてあげると安心です。target="_blank"をつけるとリンクをクリックしたときに別タブでリンク先のページが開きますが、開いた先のページが悪意ある者によって作成されたページであった場合、 リンク元 のページを操作される危険があります。しかしrel="noopener noreferrer"をつけてあげることで、 リンク元 のページが操作されるのを防いだり、 リンク元 の情報を渡さないようにできます。 まとめ このように、LinkifyとMUIを一緒に使うことで、チーム内で統一して使っているカスタムリンク コンポーネント を使って文字列内のURLをリンク化できます。LinkifyはURLだけでなく、メールアドレスもリンク化できますし、 プラグイン を使用すれば Twitter の ハッシュタグ やメンション、 IPアドレス 、また自分が指定したキーワードも検出してリンク化できてしまいます!便利な オプション もそろっているので、ぜひ使ってみてください! 私たちは同じチームで働いてくれる仲間を大募集しています!たくさんのご応募をお待ちしています。 セキュリティエンジニア 執筆: @onishi.mayu 、レビュー: @kano.nanami ( Shodo で執筆されました )
こんにちは、X(クロス) イノベーション 本部 ソフトウェアデザインセンター セキュリティグループの大西です。現在、TypeScriptとReactを使ってWebアプリを開発していますが、フロントエンドの実装を任された際に Linkify と MUI(Material UI) を合わせて使う場面がありました。LinkifyとMUIのコラボ実装はあまり記事がなかったので記事を書いてみました。 Linkifyとは? MUI(Material UI)とは? LinkifyとMUIを一緒に使う まとめ Linkifyとは? Reactでテキスト内のURLをリンクにしたい場面があったとします。こんな感じですね。 Linkifyとは、文字列にURLが含まれているときに自動でリンク化する際に使えるライブラリです。 このように自動でリンク化する方法を探すと、Linkifyを入れて3つほど方法がありました。 Linkifyを使う react-string-replace を使う 自前で実装する 2のreact-string-replaceは1のLinkifyに比べ GitHub のFork数やstar数が少なく、3の自前実装は、 dangerouslySetInnerHTML という関数を使わなければいけなかったため今回はLinkifyを使うことにしました。Linkifyは ドキュメント もしっかり整備されていて、 XSS(クロスサイトスクリプティング)攻撃に対して脆弱にならないような方法 も示されていたのでとても良かったです。 MUI(Material UI)とは? MUIはReactアプリケーションを構築するのに使えるUI コンポーネント の巨大なライブラリです。基礎的なUI要素から高度なUI要素までそろっており、カスタマイズ可能なライブラリが備わっています。基本的に無料で利用できますが、一部有料のライブラリもあります。MUIを使うと、例えば 表(テーブル) や プログレスバー にしても、自分で一から実装するより簡単に実現できます。 MUIを使用して作った表↓ MUIを使用して作った プログレスバー ↓ LinkifyとMUIを一緒に使う Reactアプリを開発している中で、LinkifyとMUIを同時に使いたい場面が出てきました。例えばMUIの Linkコンポーネント とLinkifyを同時に使いたい場合です。LinkifyはもちろんLink コンポーネント を使わなくても以下のように書くと文字列をリンク化できます。 < Linkify > { props.content } < /Linkify > しかし、チーム内であらかじめ統一して作っておいたカスタムリンク コンポーネント (今回は「CustomLink」というカスタムリンク コンポーネント があったとします)を使いたい場合は少し工夫が必要で、 renderオプション が必要です。renderオプションを用いると、リンク要素の生成方法をオーバーライドできます。ターゲットリンクの中間表現(IntermediateRepresentation。タグ名、属性、テキストコンテンツ等を含むオブジェクト)を受け入れる関数を指定し、戻り値は、文字列、HTML 要素、または インターフェイス 固有のエンティティにします。render関数は、結果 (属性、コンテンツなど)を引数として他のすべてのオプションが計算された後に実行されます。実装すると以下のようになります。 チーム内で統一して定義したカスタムリンク コンポーネント ↓ import { Link , LinkProps } from "@mui/material" ; export const CustomLink = ( props: LinkProps ) : JSX. Element => { const { href , children , ...other } = props ; return ( < Link { ...other } href = { href } target = "_blank" rel = "noopener noreferrer" color = "#FF0000" ...などチーム内で設定したオプション > { children } < /Link > ); } ; 上記のカスタムリンク コンポーネント を使えるように新しい コンポーネント を作成する↓ import { IntermediateRepresentation } from "linkifyjs" ; import { CustomLink } from "CustomLinkを定義したファイル" ; export const renderLink = ( ir: IntermediateRepresentation ) : JSX. Element => { return < CustomLink { ...ir.attributes } > { ir.content } < /CustomLink >; } ; そして、CustomLinkをリンク化したいコンテンツを表示する tsx ファイルに持っていき、renderオプションに渡す↓ < Linkify options = {{ render: renderLink }} > { props.content } < /Linkify > としてやれば、チーム内で統一して使っているカスタムリンク コンポーネント を使って、文字列内のURLをリンク化できます!IntermediateRepresentationについて補足ですが、 ・ir.attributes 内に href プロパティなどaタグの属性が渡ってくる ・ir.content はリンクの表記が渡ってくる という仕様になっています。 ちなみにLink コンポーネント を扱う際に target="_blank" をつける場合は、 rel="noopener" と rel="noreferrer" オプションをつけてあげると安心です。target="_blank"をつけるとリンクをクリックしたときに別タブでリンク先のページが開きますが、開いた先のページが悪意ある者によって作成されたページであった場合、 リンク元 のページを操作される危険があります。しかしrel="noopener noreferrer"をつけてあげることで、 リンク元 のページが操作されるのを防いだり、 リンク元 の情報を渡さないようにできます。 まとめ このように、LinkifyとMUIを一緒に使うことで、チーム内で統一して使っているカスタムリンク コンポーネント を使って文字列内のURLをリンク化できます。LinkifyはURLだけでなく、メールアドレスもリンク化できますし、 プラグイン を使用すれば Twitter の ハッシュタグ やメンション、 IPアドレス 、また自分が指定したキーワードも検出してリンク化できてしまいます!便利な オプション もそろっているので、ぜひ使ってみてください! 私たちは同じチームで働いてくれる仲間を大募集しています!たくさんのご応募をお待ちしています。 セキュリティエンジニア 執筆: @onishi.mayu 、レビュー: @kano.nanami ( Shodo で執筆されました )
こんにちは、ISID 金融ソリューション事業部の岡崎です。 ゲームや動画などを作成する際に、ユーザーが違和感なくコンテンツを使用するためには、 フレームごとの描画速度(フレームレート)を意識し、パフォーマンスを担保し続ける必要があります。 今回はUE5でパフォーマンスを担保するために必要な、プロファイリングのワークフローの説明を行います。 はじめに UEでは、制作したプロジェクトの性能を測るためにプロファイリングという作業を行います。 プロファイリングは、主にパフォーマンス改善を目的として実施します。例えばコマンドや専用のアプリケーションを使用して、描画に遅延が起こっていないか、不要な処理をしているBlueprintがないか、などを調べます。 今回の記事では、UEの基礎的なプロファイリングの方法( GPU 編)について紹介していきます。 CPUに関しては記事が長くなるので、次の記事でご紹介します。 検証環境/ツール OS: Windows 11 pro GPU : NVIDIA GeForce RTX 4070 Ti Game Engine: Unreal Engine 5.2.0 実装手順 「stat unit」コマンドの実施 Drawsが多い場合の対処方法 2-1. 対象メッシュの確認、削除 2-2. Naniteの設定(UE5の場合) 1. 「stat unit」コマンドの実施 まず初めに、「stat unit」コマンドについて説明していきます。 UEではさまざまな方法でプロジェクトのプロファイリングを行う方法があります。 「stat unit」はプロジェクト全体を俯瞰し、大体どの辺に致命的なバグや遅延の原因があるかなどを調べるのに適したコマンドになります。 「stat unit」コマンドを使用するためには、 デバッグ したいプロジェクトを開き、画面下部よりアウトプットタブを押下し、 コマンド入力スペースに「stat unit」を記述します。 画面上に画像のようなログが出てきます。 主要な項目の説明をします。 Frame : 画面を描画するのにかかった処理時間。60FPSのゲームを作成する場合は、16.6ms以下になるように調整しないといけない Game : リアルタイムで動作するゲームのロジックやアニメーションにかかるCPUの処理時間 Draw : 何を描画するか、選択や計算をするためにかかるCPUの処理時間 GPU Time : メッシュや各マテリアルの描画や、ライティングなどにかかる GPU の処理時間 Draws : 描画する必要のあるメッシュの個数。 GPU Timeに影響を与える またGameなどの数値は、ゲームをプレイしている最中にBlueprintなどに連動して数値が変動するので、 ゲームをプレイしてキャ ラク ターの操作などを行った際の数値も確かめる必要があります。 今回は GPU 編なので、「stat unit」の結果から、 「Draw」、「Draws」の数値を調査、修正を行っていきます。 その他の項目のCPUに関わる箇所は次の記事で紹介するので、本記事では割愛します。 2. Drawsが多い場合の対処方法 Drawsの数値が大きい場合は、メッシュが大量に配置されていたり、ポリゴン数の多すぎる複雑なメッシュが配置されてしまっている可能性があります。 今回は、16.6msを超えているため、正常時は緑に表示される数字が赤文字になっています。 この Drawsの数値が大きいように感じたので調査していきます。 まずはレベル上にどのようなメッシュやポリゴンがあるか確認していきます。 2-1. 対象メッシュの確認、削除 画面上部のツールから、オーディット>統計 を選びます。 すると別画面でレベル内に配置されているメッシュのポリゴン数を確認することが出来ます。 「Tris」と書かれている部分がポリゴン数で、「Sum Tris」と書かれている部分が合計のポリゴン数になります。 今回の統計では、「SM_Movehuman」というオブジェクトの「Count」が「31,834」になっており、「Sum Tris」の数値も非常に高くなっています。 一般的にポリゴン数は下記の 閾値 を参考にすると良いとされています。 2000から3000までが理想 5000を超えると重たくなり始める 10000を超えると問題が起こり始める このためDrawの数値が大きくなっていることが考えられます。 プロジェクトに戻って確認してみると、 実はこのレベルには大量の「SM_Movehuman」のアクターを配置していたことがわかりました。 もちろんこのプロジェクトは処理を重くすることを目的に作成しているので簡単に発見できましたが、 実際のプロジェクトでは、ここまで単純に問題を発見することはなかなか出来ません。 しかし、統計を見ながらレベルに配置してあるオブジェクトの個数や、ポリゴン数を確認し、大体のあたりをつけるのにはとても有効な手段です。 今回のように、オブジェクトが大量にあり「Draws」の数値が非常に高い場合の対処法は大きく3つあります。 無駄なオブジェクトの削除 UE5で追加された「Nanite」を使用 オクルージョンカリングの設定 ※オクルージョンカリングの設定方法は本記事では説明しません。次回以降の記事で紹介する予定です。 まずは無駄なオブジェクトの削除を試します。 本プロジェクトでは、「SM_Movehuman」のアクターをすべて削除してみます。 「stat unit」の値を確認してみます。 「Draws」の値が下がり、「Draw」にかかる処理速度も短くなっていることが確認できます。 アクター削除前 アクター削除後 また、本プロジェクトでは割愛しますが、統計内の「Count」の数を下げなくとも、そもそものポリゴン数を少ないものを用意するのも有効です。 もし配置してあるオブジェクトが全て必要なもので、削除できない場合は次の手段を試します。 2-2. Naniteの設定(UE5の場合) Naniteとは まず Nanite を簡単に説明をします。 Nanite とは、UE5から搭載された、3Dモデルを効率的にかつ高速に レンダリング してくれるシステムで、LODを自動で行ってくれます。 LODというのは Level of Detail の略で、ひとつのオブジェクトに対し、複数の粗さの違うメッシュを作成し、 カメラが遠くにあるときには粗く軽いメッシュを使用し、近くにあるときは細かく正確なメッシュを使用する描画方法です。 これによりユーザーに違和感やメッシュの粗さを感じさせずに、描画速度を上げることができます。 Naniteが搭載される前は、これらの複数のメッシュを用意し、距離を計算し配置する作業は手作業で行っていましたが、 LODがNaniteによって自動化され、手作業でやるよりさらに効率的に レンダリング できるようになりました。 Naniteの設定方法 Naniteはスタティックメッシュにのみ使用できます。(スケルタルメッシュなどには設定できないので注意が必要) 設定したいスタティックメッシュを開きます。 今回はレベル内に配置してある大量の人型のオブジェクトに対し、Naniteの設定を行っていきます。 スタティックメッシュを開いたら詳細パネルより、Naniteの設定 > Naniteサポートの有効化 をオンにします。 スタティックメッシュを保存し、レベルに配置するためのアクタークラスBlueprintを作成します。 コンポーネント 内にスタティックメッシュを追加し、詳細画面から先ほどNaniteの設定をしたスタティックメッシュを選択します。 あとは、このアクターをレベル上に配置して負荷に変化があるか検証していきます。 Naniteによる負荷軽減の検証 PCGを利用して人型のアクターを大量に配置したレベルを用意し、Naniteを設定したものと、していないものでどれだけ数値に差が出るか調査しました。 それぞれのゲーム上で「stat unit」を行います。 (今回の記事ではPCGに関しての説明は割愛いたします。) Naniteを有効にしていない場合 Naniteを有効にしている場合 Drawsの数値が劇的に減少され( 18143 → 559 )、Frameにかかる時間も16ms ほど短縮できています。 今回はデフォルトで用意されている人型のメッシュに対しNaniteの設定を行いましたが、 ZBrush などで作成した複雑でポリゴン数の多いオブジェクトなどに対してNaniteの設定を行うことで、劇的に描画速度を向上できます。 おわりに 今回は、UE5を利用してプロファイリングの方法の GPU 部分に関して、 ボトルネック になっている箇所を探し、対策する方法などをまとめました。 今回は検証用に作成したプロジェクトだったため、単純明快に問題の発見と解決ができましたが、 実際のプロジェクトでは、より複雑に原因が入り組んでいることが想像できます。 実践を積みながら、プロファイリングについてもっと詳しくなっていきたいです。 本プロジェクトでは、まだCPU側に ボトルネック がありFrameの数値が140msと、非常に遅くなっているので、 次の記事ではCPUに関するプロファイルング方法をご紹介していきます。 現在ISIDは web3領域のグループ横断組織 を立ち上げ、Web3および メタバース 領域のR&Dを行っております(カテゴリー「3DCG」の記事は こちら )。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください! 私たちと同じチームで働いてくれる仲間を、是非お待ちしております! ISID採用ページ(Web3/メタバース/AI) 執筆: @okazaki.wataru 、レビュー: @kano.nanami ( Shodo で執筆されました )
こんにちは、ISID 金融ソリューション事業部の岡崎です。 ゲームや動画などを作成する際に、ユーザーが違和感なくコンテンツを使用するためには、 フレームごとの描画速度(フレームレート)を意識し、パフォーマンスを担保し続ける必要があります。 今回はUE5でパフォーマンスを担保するために必要な、プロファイリングのワークフローの説明を行います。 はじめに UEでは、制作したプロジェクトの性能を測るためにプロファイリングという作業を行います。 プロファイリングは、主にパフォーマンス改善を目的として実施します。例えばコマンドや専用のアプリケーションを使用して、描画に遅延が起こっていないか、不要な処理をしているBlueprintがないか、などを調べます。 今回の記事では、UEの基礎的なプロファイリングの方法( GPU 編)について紹介していきます。 CPUに関しては記事が長くなるので、次の記事でご紹介します。 検証環境/ツール OS: Windows 11 pro GPU : NVIDIA GeForce RTX 4070 Ti Game Engine: Unreal Engine 5.2.0 実装手順 「stat unit」コマンドの実施 Drawsが多い場合の対処方法 2-1. 対象メッシュの確認、削除 2-2. Naniteの設定(UE5の場合) 1. 「stat unit」コマンドの実施 まず初めに、「stat unit」コマンドについて説明していきます。 UEではさまざまな方法でプロジェクトのプロファイリングを行う方法があります。 「stat unit」はプロジェクト全体を俯瞰し、大体どの辺に致命的なバグや遅延の原因があるかなどを調べるのに適したコマンドになります。 「stat unit」コマンドを使用するためには、 デバッグ したいプロジェクトを開き、画面下部よりアウトプットタブを押下し、 コマンド入力スペースに「stat unit」を記述します。 画面上に画像のようなログが出てきます。 主要な項目の説明をします。 Frame : 画面を描画するのにかかった処理時間。60FPSのゲームを作成する場合は、16.6ms以下になるように調整しないといけない Game : リアルタイムで動作するゲームのロジックやアニメーションにかかるCPUの処理時間 Draw : 何を描画するか、選択や計算をするためにかかるCPUの処理時間 GPU Time : メッシュや各マテリアルの描画や、ライティングなどにかかる GPU の処理時間 Draws : 描画する必要のあるメッシュの個数。 GPU Timeに影響を与える またGameなどの数値は、ゲームをプレイしている最中にBlueprintなどに連動して数値が変動するので、 ゲームをプレイしてキャ ラク ターの操作などを行った際の数値も確かめる必要があります。 今回は GPU 編なので、「stat unit」の結果から、 「Draw」、「Draws」の数値を調査、修正を行っていきます。 その他の項目のCPUに関わる箇所は次の記事で紹介するので、本記事では割愛します。 2. Drawsが多い場合の対処方法 Drawsの数値が大きい場合は、メッシュが大量に配置されていたり、ポリゴン数の多すぎる複雑なメッシュが配置されてしまっている可能性があります。 今回は、16.6msを超えているため、正常時は緑に表示される数字が赤文字になっています。 この Drawsの数値が大きいように感じたので調査していきます。 まずはレベル上にどのようなメッシュやポリゴンがあるか確認していきます。 2-1. 対象メッシュの確認、削除 画面上部のツールから、オーディット>統計 を選びます。 すると別画面でレベル内に配置されているメッシュのポリゴン数を確認することが出来ます。 「Tris」と書かれている部分がポリゴン数で、「Sum Tris」と書かれている部分が合計のポリゴン数になります。 今回の統計では、「SM_Movehuman」というオブジェクトの「Count」が「31,834」になっており、「Sum Tris」の数値も非常に高くなっています。 一般的にポリゴン数は下記の 閾値 を参考にすると良いとされています。 2000から3000までが理想 5000を超えると重たくなり始める 10000を超えると問題が起こり始める このためDrawの数値が大きくなっていることが考えられます。 プロジェクトに戻って確認してみると、 実はこのレベルには大量の「SM_Movehuman」のアクターを配置していたことがわかりました。 もちろんこのプロジェクトは処理を重くすることを目的に作成しているので簡単に発見できましたが、 実際のプロジェクトでは、ここまで単純に問題を発見することはなかなか出来ません。 しかし、統計を見ながらレベルに配置してあるオブジェクトの個数や、ポリゴン数を確認し、大体のあたりをつけるのにはとても有効な手段です。 今回のように、オブジェクトが大量にあり「Draws」の数値が非常に高い場合の対処法は大きく3つあります。 無駄なオブジェクトの削除 UE5で追加された「Nanite」を使用 オクルージョンカリングの設定 ※オクルージョンカリングの設定方法は本記事では説明しません。次回以降の記事で紹介する予定です。 まずは無駄なオブジェクトの削除を試します。 本プロジェクトでは、「SM_Movehuman」のアクターをすべて削除してみます。 「stat unit」の値を確認してみます。 「Draws」の値が下がり、「Draw」にかかる処理速度も短くなっていることが確認できます。 アクター削除前 アクター削除後 また、本プロジェクトでは割愛しますが、統計内の「Count」の数を下げなくとも、そもそものポリゴン数を少ないものを用意するのも有効です。 もし配置してあるオブジェクトが全て必要なもので、削除できない場合は次の手段を試します。 2-2. Naniteの設定(UE5の場合) Naniteとは まず Nanite を簡単に説明をします。 Nanite とは、UE5から搭載された、3Dモデルを効率的にかつ高速に レンダリング してくれるシステムで、LODを自動で行ってくれます。 LODというのは Level of Detail の略で、ひとつのオブジェクトに対し、複数の粗さの違うメッシュを作成し、 カメラが遠くにあるときには粗く軽いメッシュを使用し、近くにあるときは細かく正確なメッシュを使用する描画方法です。 これによりユーザーに違和感やメッシュの粗さを感じさせずに、描画速度を上げることができます。 Naniteが搭載される前は、これらの複数のメッシュを用意し、距離を計算し配置する作業は手作業で行っていましたが、 LODがNaniteによって自動化され、手作業でやるよりさらに効率的に レンダリング できるようになりました。 Naniteの設定方法 Naniteはスタティックメッシュにのみ使用できます。(スケルタルメッシュなどには設定できないので注意が必要) 設定したいスタティックメッシュを開きます。 今回はレベル内に配置してある大量の人型のオブジェクトに対し、Naniteの設定を行っていきます。 スタティックメッシュを開いたら詳細パネルより、Naniteの設定 > Naniteサポートの有効化 をオンにします。 スタティックメッシュを保存し、レベルに配置するためのアクタークラスBlueprintを作成します。 コンポーネント 内にスタティックメッシュを追加し、詳細画面から先ほどNaniteの設定をしたスタティックメッシュを選択します。 あとは、このアクターをレベル上に配置して負荷に変化があるか検証していきます。 Naniteによる負荷軽減の検証 PCGを利用して人型のアクターを大量に配置したレベルを用意し、Naniteを設定したものと、していないものでどれだけ数値に差が出るか調査しました。 それぞれのゲーム上で「stat unit」を行います。 (今回の記事ではPCGに関しての説明は割愛いたします。) Naniteを有効にしていない場合 Naniteを有効にしている場合 Drawsの数値が劇的に減少され( 18143 → 559 )、Frameにかかる時間も16ms ほど短縮できています。 今回はデフォルトで用意されている人型のメッシュに対しNaniteの設定を行いましたが、 ZBrush などで作成した複雑でポリゴン数の多いオブジェクトなどに対してNaniteの設定を行うことで、劇的に描画速度を向上できます。 おわりに 今回は、UE5を利用してプロファイリングの方法の GPU 部分に関して、 ボトルネック になっている箇所を探し、対策する方法などをまとめました。 今回は検証用に作成したプロジェクトだったため、単純明快に問題の発見と解決ができましたが、 実際のプロジェクトでは、より複雑に原因が入り組んでいることが想像できます。 実践を積みながら、プロファイリングについてもっと詳しくなっていきたいです。 本プロジェクトでは、まだCPU側に ボトルネック がありFrameの数値が140msと、非常に遅くなっているので、 次の記事ではCPUに関するプロファイルング方法をご紹介していきます。 現在ISIDは web3領域のグループ横断組織 を立ち上げ、Web3および メタバース 領域のR&Dを行っております(カテゴリー「3DCG」の記事は こちら )。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください! 私たちと同じチームで働いてくれる仲間を、是非お待ちしております! ISID採用ページ(Web3/メタバース/AI) 執筆: @okazaki.wataru 、レビュー: @kano.nanami ( Shodo で執筆されました )
こんにちは。X(クロス) イノベーション 本部 ソフトウェアデザインセンター セキュリティグループの平岡です。 私は社内の SOC サービスの研究開発メンバーとして、Azureの Microsoft Defender for Cloud周りの調査を専門に行っています。 最近は、主に推奨事項の発出条件やセキュリティアラートの調査をしたり、顧客開発環境のセキュリティ監視などを行うための仕組みを作っています。 SOC活動を通じて、是非読者の皆さんに試していただきたいと思った情報を、このテックブログで紹介したいと思います。どうぞよろしくお願いします。 さて、今回は、 Azure Lighthouseを利用して他 サブスクリプション のセキュリティ情報を集約する方法 を紹介します。 そもそもどんなシチュエーションでこの設定が役に立つのか? Azureポータル上では、 Microsoft Defender for Cloud等のサービスを通じて、自分の サブスクリプション 内のセキュリティ情報を見ることが出来ます。 使用している サブスクリプション が一つだけなら、セキュリティ情報の管理はそれほど難しくないかもしれません。 しかし、大きな企業になると社内で沢山の サブスクリプション を立てて、それを部署や案件単位で管理していることが多いのではないでしょうか。このような状況であれば、一つの サブスクリプション で、他の サブスクリプション や、異なるテナント間のリソースのセキュリティ情報を集約して、監視することが出来たらとても楽ですよね。 そこで使っていただきたいのが Azure Lighthouse です。 Azure lighthouseとは・・・Azure Lighthouseは、複数のAzure ADテナントの管理を一か所のテナントで行えるようにするものです。これにより、Azureを払い出している部署が、各部署や案件単位で利用するテナントを効率的に構築および提供する事ができるようになります。また、Azure Lighthouse自体の利用料金はかかりません。 Azure Lighthouse とは https://learn.microsoft.com/ja-jp/azure/lighthouse/overview それでは、早速設定してみます。 今回は委任先の サブスクリプション に対して、委任元の サブスクリプション のセキュリティ情報を集約できるようにします。 1. Azure Lighthouseのデプロイを実施します (1) Azure Lighthouseのデプロイはポータルからはできない(※ 2023/6/1現在)ため、 Github のARMテンプレートを使用します。テンプレートはリンクから選択します。 https://github.com/Azure/Azure-Lighthouse-samples/ (2) README.md内の"Deploy to Azure buttons"から、下記画像のテンプレートを選択します。 Name : Azure Lighthouse - Subscription Deployment Description : onboard a subscription 2. Azureのカスタムデプロイ画面に遷移後、必須項目を埋めます   サブスクリプション : 委任元の サブスクリプション リージョン :デプロイ場所 Msp Offer Name : 委任の名称 Msp Offer Description : 委任の説明 Managed By Tenant ID : 委任先のテナントID Authorizations : 委任内容を json 形式で記述 [ { "principalId": "<ユーザー等のオブジェクト ID>", "principalIdDisplayName": "<任意の名前>", "roleDefinitionId": "<委任する組み込みロール ID>" } ] 委任先のテナントIDは Azure Acrive Directory>概要 を参照します。 principalId(グループまたはユーザーのオブジェクトID)は Azure Active Directory >グループ(ユーザー) を参照します。 roleDefinitionId(委任する組み込みロールID)は 下記ドキュメントから必要な権限を選択します。 Azure 組み込みロール: https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles 3.必須項目の入力完了後、”確認と作成”ボタンを押下しデプロイを完了します 4.委任先のテナントで、ポータルの設定に遷移します ポータルの設定画面は右上の歯車ボタンを押下します 5.既定の サブスクリプション フィルターのプルダウンを“すべての ディレクト リ”および“すべての サブスクリプション ”に設定します 設定は以上です。 集約先の サブスクリプション で Microsoft Defender for Cloud画面を見てみましょう。 集約元の サブスクリプション の推奨情報やセキュリティ警告が反映されています。 サブスクリプション を行き来しなくても、一つの サブスクリプション でセキュリティ情報が見られるようになり、管理がしやすくなりました。 <推奨事項画面> <セキュリティ警告画面> 終わりに 今回紹介したAzure Lighthouseを利用することで、一つの サブスクリプション に複数の サブスクリプション の情報を集約することができます。 複数の サブスクリプション の管理をしている方は是非利用してみてください。 私たちは一緒に働いてくれる仲間を募集しています! セキュリティエンジニア 執筆: @hiraoka.eri 、レビュー: @fukutake.hiroaki ( Shodo で執筆されました )
こんにちは。X(クロス) イノベーション 本部 ソフトウェアデザインセンター セキュリティグループの平岡です。 私は社内の SOC サービスの研究開発メンバーとして、Azureの Microsoft Defender for Cloud周りの調査を専門に行っています。 最近は、主に推奨事項の発出条件やセキュリティアラートの調査をしたり、顧客開発環境のセキュリティ監視などを行うための仕組みを作っています。 SOC活動を通じて、是非読者の皆さんに試していただきたいと思った情報を、このテックブログで紹介したいと思います。どうぞよろしくお願いします。 さて、今回は、 Azure Lighthouseを利用して他 サブスクリプション のセキュリティ情報を集約する方法 を紹介します。 そもそもどんなシチュエーションでこの設定が役に立つのか? Azureポータル上では、 Microsoft Defender for Cloud等のサービスを通じて、自分の サブスクリプション 内のセキュリティ情報を見ることが出来ます。 使用している サブスクリプション が一つだけなら、セキュリティ情報の管理はそれほど難しくないかもしれません。 しかし、大きな企業になると社内で沢山の サブスクリプション を立てて、それを部署や案件単位で管理していることが多いのではないでしょうか。このような状況であれば、一つの サブスクリプション で、他の サブスクリプション や、異なるテナント間のリソースのセキュリティ情報を集約して、監視することが出来たらとても楽ですよね。 そこで使っていただきたいのが Azure Lighthouse です。 Azure lighthouseとは・・・Azure Lighthouseは、複数のAzure ADテナントの管理を一か所のテナントで行えるようにするものです。これにより、Azureを払い出している部署が、各部署や案件単位で利用するテナントを効率的に構築および提供する事ができるようになります。また、Azure Lighthouse自体の利用料金はかかりません。 Azure Lighthouse とは https://learn.microsoft.com/ja-jp/azure/lighthouse/overview それでは、早速設定してみます。 今回は委任先の サブスクリプション に対して、委任元の サブスクリプション のセキュリティ情報を集約できるようにします。 1. Azure Lighthouseのデプロイを実施します (1) Azure Lighthouseのデプロイはポータルからはできない(※ 2023/6/1現在)ため、 Github のARMテンプレートを使用します。テンプレートはリンクから選択します。 https://github.com/Azure/Azure-Lighthouse-samples/ (2) README.md内の"Deploy to Azure buttons"から、下記画像のテンプレートを選択します。 Name : Azure Lighthouse - Subscription Deployment Description : onboard a subscription 2. Azureのカスタムデプロイ画面に遷移後、必須項目を埋めます   サブスクリプション : 委任元の サブスクリプション リージョン :デプロイ場所 Msp Offer Name : 委任の名称 Msp Offer Description : 委任の説明 Managed By Tenant ID : 委任先のテナントID Authorizations : 委任内容を json 形式で記述 [ { "principalId": "<ユーザー等のオブジェクト ID>", "principalIdDisplayName": "<任意の名前>", "roleDefinitionId": "<委任する組み込みロール ID>" } ] 委任先のテナントIDは Azure Acrive Directory>概要 を参照します。 principalId(グループまたはユーザーのオブジェクトID)は Azure Active Directory >グループ(ユーザー) を参照します。 roleDefinitionId(委任する組み込みロールID)は 下記ドキュメントから必要な権限を選択します。 Azure 組み込みロール: https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles 3.必須項目の入力完了後、”確認と作成”ボタンを押下しデプロイを完了します 4.委任先のテナントで、ポータルの設定に遷移します ポータルの設定画面は右上の歯車ボタンを押下します 5.既定の サブスクリプション フィルターのプルダウンを“すべての ディレクト リ”および“すべての サブスクリプション ”に設定します 設定は以上です。 集約先の サブスクリプション で Microsoft Defender for Cloud画面を見てみましょう。 集約元の サブスクリプション の推奨情報やセキュリティ警告が反映されています。 サブスクリプション を行き来しなくても、一つの サブスクリプション でセキュリティ情報が見られるようになり、管理がしやすくなりました。 <推奨事項画面> <セキュリティ警告画面> 終わりに 今回紹介したAzure Lighthouseを利用することで、一つの サブスクリプション に複数の サブスクリプション の情報を集約することができます。 複数の サブスクリプション の管理をしている方は是非利用してみてください。 私たちは一緒に働いてくれる仲間を募集しています! セキュリティエンジニア 執筆: @hiraoka.eri 、レビュー: @fukutake.hiroaki ( Shodo で執筆されました )
はじめに こんにちは。X イノベーション 本部の藤川です。 私は「aiuola(アイウォーラ)」という エンタープライズ アプリケーションプラットフォームの開発において、プロダクトマネージャーをしています。まれにアーキテクト、 デベロッパ ーなど別の帽子を被って 開発プロセス に参加しています。 今回の記事では、aiuolaが採用している アジャイル 開発プロセス について私たちの現在の着地点をスプリントイベントを中心に紹介します。 ちなみにaiuolaとは「 エンタープライズ アプリケーションでお客様に感動を」というキャッチフレーズで立ち上げた開発プロジェクトです。エンプラ系アプリってなんかあれじゃん、結局大したことないでしょという眉唾100%の皆様、ご安心ください。 私たちの想いを体現した エンタープライズ アプリケーションは「Ci*X(サイクロス)」というブランドでリリースしております。 ご利用中のお客様からは「マニュアルを参照せずに使える業務アプリって初めて!」「 経理 部門に配属以来最も大きな感動体験です!」と評判です。 会計プロダクトの検討をされている方はぜひこちらをご覧ください。 グループ経営管理ソリューション サイクロスシリーズ aiuolaの取り組み aiuola とは aiuolaは当社の エンタープライズ アプリケーションの共通プラットフォームです。 エンタープライズ アプリで求められる認証・認可やUIライブラリを提供しています。 2023年現在、aiuolaを活用したいくつかのプロダクト群をリリースしご好評をいただいております。 体制 aiuolaの開発体制は初期からの変遷を経て、以下のような体制となっています。 本チームではサービス運用のミッションを持っていないためインフラチームは有していません。 (各プロダクト側にインフラチームがいて、我々と協力してお客様のサクセスを支えています) 初期の頃はフロントエンジニア4名、専任デザイナーが1名という体制でしたが、デザインシステムが固まってからは概ね上記の体制で活動しています。 当チームのバックエンドエンジニアは単一の ユースケース (機能)の開発を担当し、機能単位のフロント実装も行います。 一方でフロントエンジニアはUI コンポーネント の開発やフロントエンド実装指針にフォーカスを当てて活動しています。 スプリントイベント aiuolaの開発は2週間のスプリントで実施しています。 スプリント期間の過ごし方をスプリントイベントを中心に図にしてみました。 ご覧いただくとお分かりかと思いますが、すごくオーソドックスな スクラム 開発プロセス を採用しています。 なお、2020年以降、aiuolaの開発はリモートスタイルでの開発となっています。 スプリントイベントを含めて、すべての活動をリモート環境で実施しています。飲み会以外はね!😉。 デイリーミーティング 主に前日タスクでの課題とその日の活動予定を共有しますが、slackで簡単なワークレポートを投稿するルールにしているので、困りごとへの対応、レビュー担当者への アサイ ン、QAメンバーへのテスト依頼などが目的になります。 大体、15分〜20分ぐらいの時間でその名の通り、毎日実施しています。 スプリントプランニング スプリントで実施するタスクを バックログ から決定します。 スプリントチームはQAチームを含めて4つのサブチームが存在するので、3段階のスプリントプランニングステージを設けています。 プレスプリントプランニング 各サブチームにて次スプリントタスクの選定とポーカー サブリーダーによるスプリントプランニング サブチーム間の作業すり合わせ 全員でのスプリントプランニング スプリントタスクの共有 従来は3だけですべてを実施していたのですが、チーム体制が大きくなるにつれ、全員を拘束してしまう時間が増えてしまいました。 貴重なエンジニアリング時間を十分に確保することを目的に3段階のフェーズを設けることにしました。 プロダクトリーダー会 プロダクトファミリーで紹介した通り、aiuolaを活用するプロダクトは複数あります。 各プロダクトも日々開発を進めています。プロダクト間で期待する要望、対応スケジュールのすり合わせは重要です。 プロダクトリーダー会ではそのようなプロダクトをまたがった調整を行います。 リリース内容発表会 リリース内容発表会ではスプリントにおいてリリースできる機能をチーム内で共有し、紹介し、功績を称える会となります。 私たちの開発対象は エンタープライズ アプリケーションのため、単一の機能が有するフィーチャーは比較的大規模になります。そのためスプリントの中で1つの機能を完全に作り上げることができません。 リリース内容発表会ではそのリリースに含めることができた機能を対象とします。 それ以外にもQAチームから品質の取り組みに関する発表も含まれることがあります。 スプリントリリース スプリントリリースはミーティングではなく、前スプリントの成果をリリースするタスクとなります。 aiuolaとしてのリリースはスプリントの成果物を各プロダクトチームに提供する作業です。 プロダクトファミリーの市場投入サイクルはaioulaを含めてすべて6ヶ月単位となります。そのため、スプリントリリースは開発ベータ版としてプロダクトチームに成果物を提供することを指します。 レトロスペクティブ レトロスペクティブはその名の通り、スプリントの最後に行う振り返り会です。 開発の改善に役立つア イデア や課題を議論し、スプリントの中で挑戦すべきことを議論します。 従来はオフラインで実施していましたが、オンライン主体の 開発プロセス に変わってからはMiroを活用しております。 終わりに 今回の記事では私たちが開発している エンタープライズ アプリケーションプラットフォーム「aiuola」の 開発プロセス について非常に簡単ですがその一端をご紹介しました。 プロダクトファミリーにて紹介したaiuolaプラットフォームを活用した各プロダクトも積極的な機能強化を行っています。 それぞれのプロダクトはここで紹介したプロセスをコピーして適用しているわけではなく、プロダクト特性やチーム体制に応じた開発スタイルを採用し、独自に発展を遂げています。もちろん私たちaiuolaチームも現状に満足しているわけではなく、より効果的な取り組みにチャレンジしています。 いずれのプロダクトでも、共に新たなチャレンジに挑んでくれる仲間を探していますので、ご興味を持っていただいた方は是非とも採用ページをご覧ください。 また、本チームの開発メンバーがアプリケーション アーキテクチャ をテーマとしてTech Playに登壇します。 こちらも是非ご参加いただけると幸いです。 Tech Play URL 私たちは一緒に働いてくれる仲間を募集しています! プロダクトプラットフォーム開発エンジニア/新規プロダクト開発エンジニア 次世代会計プロダクト開発ITアーキテクト(Ci*Xシリーズ) 次世代会計プロダクトDevOpsエンジニア(Ci*Xシリーズ) 執筆: @fujikawa.kenji 、レビュー: @wakamoto.ryosuke ( Shodo で執筆されました )
はじめに こんにちは。X イノベーション 本部の藤川です。 私は「aiuola(アイウォーラ)」という エンタープライズ アプリケーションプラットフォームの開発において、プロダクトマネージャーをしています。まれにアーキテクト、 デベロッパ ーなど別の帽子を被って 開発プロセス に参加しています。 今回の記事では、aiuolaが採用している アジャイル 開発プロセス について私たちの現在の着地点をスプリントイベントを中心に紹介します。 ちなみにaiuolaとは「 エンタープライズ アプリケーションでお客様に感動を」というキャッチフレーズで立ち上げた開発プロジェクトです。エンプラ系アプリってなんかあれじゃん、結局大したことないでしょという眉唾100%の皆様、ご安心ください。 私たちの想いを体現した エンタープライズ アプリケーションは「Ci*X(サイクロス)」というブランドでリリースしております。 ご利用中のお客様からは「マニュアルを参照せずに使える業務アプリって初めて!」「 経理 部門に配属以来最も大きな感動体験です!」と評判です。 会計プロダクトの検討をされている方はぜひこちらをご覧ください。 グループ経営管理ソリューション サイクロスシリーズ aiuolaの取り組み aiuola とは aiuolaは当社の エンタープライズ アプリケーションの共通プラットフォームです。 エンタープライズ アプリで求められる認証・認可やUIライブラリを提供しています。 2023年現在、aiuolaを活用したいくつかのプロダクト群をリリースしご好評をいただいております。 体制 aiuolaの開発体制は初期からの変遷を経て、以下のような体制となっています。 本チームではサービス運用のミッションを持っていないためインフラチームは有していません。 (各プロダクト側にインフラチームがいて、我々と協力してお客様のサクセスを支えています) 初期の頃はフロントエンジニア4名、専任デザイナーが1名という体制でしたが、デザインシステムが固まってからは概ね上記の体制で活動しています。 当チームのバックエンドエンジニアは単一の ユースケース (機能)の開発を担当し、機能単位のフロント実装も行います。 一方でフロントエンジニアはUI コンポーネント の開発やフロントエンド実装指針にフォーカスを当てて活動しています。 スプリントイベント aiuolaの開発は2週間のスプリントで実施しています。 スプリント期間の過ごし方をスプリントイベントを中心に図にしてみました。 ご覧いただくとお分かりかと思いますが、すごくオーソドックスな スクラム 開発プロセス を採用しています。 なお、2020年以降、aiuolaの開発はリモートスタイルでの開発となっています。 スプリントイベントを含めて、すべての活動をリモート環境で実施しています。飲み会以外はね!😉。 デイリーミーティング 主に前日タスクでの課題とその日の活動予定を共有しますが、slackで簡単なワークレポートを投稿するルールにしているので、困りごとへの対応、レビュー担当者への アサイ ン、QAメンバーへのテスト依頼などが目的になります。 大体、15分〜20分ぐらいの時間でその名の通り、毎日実施しています。 スプリントプランニング スプリントで実施するタスクを バックログ から決定します。 スプリントチームはQAチームを含めて4つのサブチームが存在するので、3段階のスプリントプランニングステージを設けています。 プレスプリントプランニング 各サブチームにて次スプリントタスクの選定とポーカー サブリーダーによるスプリントプランニング サブチーム間の作業すり合わせ 全員でのスプリントプランニング スプリントタスクの共有 従来は3だけですべてを実施していたのですが、チーム体制が大きくなるにつれ、全員を拘束してしまう時間が増えてしまいました。 貴重なエンジニアリング時間を十分に確保することを目的に3段階のフェーズを設けることにしました。 プロダクトリーダー会 プロダクトファミリーで紹介した通り、aiuolaを活用するプロダクトは複数あります。 各プロダクトも日々開発を進めています。プロダクト間で期待する要望、対応スケジュールのすり合わせは重要です。 プロダクトリーダー会ではそのようなプロダクトをまたがった調整を行います。 リリース内容発表会 リリース内容発表会ではスプリントにおいてリリースできる機能をチーム内で共有し、紹介し、功績を称える会となります。 私たちの開発対象は エンタープライズ アプリケーションのため、単一の機能が有するフィーチャーは比較的大規模になります。そのためスプリントの中で1つの機能を完全に作り上げることができません。 リリース内容発表会ではそのリリースに含めることができた機能を対象とします。 それ以外にもQAチームから品質の取り組みに関する発表も含まれることがあります。 スプリントリリース スプリントリリースはミーティングではなく、前スプリントの成果をリリースするタスクとなります。 aiuolaとしてのリリースはスプリントの成果物を各プロダクトチームに提供する作業です。 プロダクトファミリーの市場投入サイクルはaioulaを含めてすべて6ヶ月単位となります。そのため、スプリントリリースは開発ベータ版としてプロダクトチームに成果物を提供することを指します。 レトロスペクティブ レトロスペクティブはその名の通り、スプリントの最後に行う振り返り会です。 開発の改善に役立つア イデア や課題を議論し、スプリントの中で挑戦すべきことを議論します。 従来はオフラインで実施していましたが、オンライン主体の 開発プロセス に変わってからはMiroを活用しております。 終わりに 今回の記事では私たちが開発している エンタープライズ アプリケーションプラットフォーム「aiuola」の 開発プロセス について非常に簡単ですがその一端をご紹介しました。 プロダクトファミリーにて紹介したaiuolaプラットフォームを活用した各プロダクトも積極的な機能強化を行っています。 それぞれのプロダクトはここで紹介したプロセスをコピーして適用しているわけではなく、プロダクト特性やチーム体制に応じた開発スタイルを採用し、独自に発展を遂げています。もちろん私たちaiuolaチームも現状に満足しているわけではなく、より効果的な取り組みにチャレンジしています。 いずれのプロダクトでも、共に新たなチャレンジに挑んでくれる仲間を探していますので、ご興味を持っていただいた方は是非とも採用ページをご覧ください。 また、本チームの開発メンバーがアプリケーション アーキテクチャ をテーマとしてTech Playに登壇します。 こちらも是非ご参加いただけると幸いです。 Tech Play URL 私たちは一緒に働いてくれる仲間を募集しています! プロダクトプラットフォーム開発エンジニア/新規プロダクト開発エンジニア 次世代会計プロダクト開発ITアーキテクト(Ci*Xシリーズ) 次世代会計プロダクトDevOpsエンジニア(Ci*Xシリーズ) 執筆: @fujikawa.kenji 、レビュー: @wakamoto.ryosuke ( Shodo で執筆されました )
こんにちは。X(クロス) イノベーション 本部 クラウド イノベーション センターの柴田です。 本記事ではTerraformでコードを変更していないリソースが known after apply となってしまう場合の回避策をご紹介します。 前提 問題となるコードの例 原因 回避策 おわりに 参考 前提 この記事は以下のTerraformのバージョンを前提とします。 新しいバージョンのTerraformでは本記事と異なる挙動をする可能性があります。 $ terraform version Terraform v1.5.3 on linux_amd64 + provider registry.terraform.io/hashicorp/aws v5.7.0 問題となるコードの例 以下のTerraformコードを例に考えてみましょう。 resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { Project = "My Project A" } } data "aws_iam_policy_document" "sample" { statement { effect = "Allow" actions = [ "s3:*" ] resources = [ aws_s3_bucket.sample.arn ] } } resource "aws_iam_policy" "sample" { name = "SampleBucketFullAccess" path = "/" policy = data.aws_iam_policy_document.sample.json } このTerraformコードを terraform apply します。 $ terraform apply Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create <= read (data resources) Terraform will perform the following actions: # data.aws_iam_policy_document.sample will be read during apply # (config refers to values not yet known) <= data "aws_iam_policy_document" "sample" { + id = (known after apply) + json = (known after apply) + statement { + actions = [ + "s3:*", ] + effect = "Allow" + resources = [ + (known after apply), ] } } # aws_iam_policy.sample will be created + resource "aws_iam_policy" "sample" { + arn = (known after apply) + id = (known after apply) + name = "SampleBucketFullAccess" + name_prefix = (known after apply) + path = "/" + policy = (known after apply) + policy_id = (known after apply) + tags_all = (known after apply) } # aws_s3_bucket.sample will be created + resource "aws_s3_bucket" "sample" { + acceleration_status = (known after apply) + acl = (known after apply) + arn = (known after apply) + bucket = (known after apply) + bucket_domain_name = (known after apply) + bucket_prefix = "sample-" + bucket_regional_domain_name = (known after apply) + force_destroy = false + hosted_zone_id = (known after apply) + id = (known after apply) + object_lock_enabled = (known after apply) + policy = (known after apply) + region = (known after apply) + request_payer = (known after apply) + tags = { + "Project" = "My Project A" } + tags_all = { + "Project" = "My Project A" } + website_domain = (known after apply) + website_endpoint = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_s3_bucket.sample: Creating... aws_s3_bucket.sample: Creation complete after 1s [id=sample-20230713121614963200000001] data.aws_iam_policy_document.sample: Reading... data.aws_iam_policy_document.sample: Read complete after 0s [id=55239551] aws_iam_policy.sample: Creating... aws_iam_policy.sample: Creation complete after 1s [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Apply complete! Resources: 2 added, 0 changed, 0 destroyed. 次にS3 バケット aws_s3_bucket.sample の Project タグの値を変更します。 resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { - Project = "My Project A" + Project = "My Project B" } } 変更後のTerraformコードに対して terraform plan を実行します。 $ terraform plan aws_s3_bucket.sample: Refreshing state... [id=sample-20230713121614963200000001] aws_iam_policy.sample: Refreshing state... [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place <= read (data resources) Terraform will perform the following actions: # data.aws_iam_policy_document.sample will be read during apply # (depends on a resource or a module with changes pending) <= data "aws_iam_policy_document" "sample" { + id = (known after apply) + json = (known after apply) + statement { + actions = [ + "s3:*", ] + effect = "Allow" + resources = [ + "arn:aws:s3:::sample-20230713121614963200000001", ] } } # aws_iam_policy.sample will be updated in-place ~ resource "aws_iam_policy" "sample" { id = "arn:aws:iam::************:policy/SampleBucketFullAccess" name = "SampleBucketFullAccess" ~ policy = jsonencode( { - Statement = [ - { - Action = "s3:*" - Effect = "Allow" - Resource = "arn:aws:s3:::sample-20230713121614963200000001" }, ] - Version = "2012-10-17" } ) -> (known after apply) tags = {} # (4 unchanged attributes hidden) } # aws_s3_bucket.sample will be updated in-place ~ resource "aws_s3_bucket" "sample" { id = "sample-20230713121614963200000001" ~ tags = { ~ "Project" = "My Project A" -> "My Project B" } ~ tags_all = { ~ "Project" = "My Project A" -> "My Project B" } # (10 unchanged attributes hidden) # (3 unchanged blocks hidden) } Plan: 0 to add, 2 to change, 0 to destroy. すると、変更がないはずのIAM policy aws_iam_policy.sample の policy が known after apply となってしまいました。 原因 これはData Sourceの仕様によるものです。 Data Resource Dependencies には以下のように記述されています。 Data resources have the same dependency resolution behavior as defined for managed resources . Setting the depends_on meta-argument within data blocks defers reading of the data source until after all changes to the dependencies have been applied. In order to ensure that data sources are accessing the most up to date information possible in a wide variety of use cases, arguments directly referencing managed resources are treated the same as if the resource was listed in depends_on . 要約すると以下のとおりです。 Data Sourceでは depends_on に記載されたリソースのすべての変更が適用されるまで読み取りは延期される。 Data Sourceの引数が他のリソースを直接参照している場合、参照先のリソースがData Sourceの depends_on に含まれている場合と同じように扱われる。 つまり Data Sourceが直接参照しているリソースに変更がある場合、それらの変更が適用されたあと、Data Sourceの読み取りが再実行される ということです。 改めて先ほどの例を考えてみましょう。Terraformが以下のように判断していたことがわかります。 aws_s3_bucket.sample のコードの変更が検出される。 data.aws_iam_policy_document.sample は aws_s3_bucket.sample を直接参照しているため、 depends_on に aws_s3_bucket.sample が含まれている場合と同じように扱われる。 depends_on に含まれる aws_s3_bucket.sample の変更が検出されたため、その変更が適用されたあとで data.aws_iam_policy_document.sample の再読み取りを行う必要があると判断される。 3をうけて aws_iam_policy.sample の policy が更新されると判断される。 回避策 Data Resource Dependencies には以下のように記述されています。 This behavior can be avoided when desired by indirectly referencing the managed resource values through a local value , unless the data resource itself has custom conditions . どうやら Local Value を間に挟むことで先ほどの事象を回避できるようです。 試してみましょう。先ほどのTerraformコードを以下のように変更します。 provider "aws" { region = "ap-northeast-1" } resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { Project = "My Project B" } } locals { s3_bucket_arn = aws_s3_bucket.sample.arn } data "aws_iam_policy_document" "sample" { statement { effect = "Allow" actions = [ "s3:*" ] resources = [ local.s3_bucket_arn ] } } resource "aws_iam_policy" "sample" { name = "SampleBucketFullAccess" path = "/" policy = data.aws_iam_policy_document.sample.json } 変更後のTerraformコードに対して terraform plan を実行します。 $ terraform plan aws_s3_bucket.sample: Refreshing state... [id=sample-20230713121614963200000001] data.aws_iam_policy_document.sample: Reading... data.aws_iam_policy_document.sample: Read complete after 0s [id=55239551] aws_iam_policy.sample: Refreshing state... [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # aws_s3_bucket.sample will be updated in-place ~ resource "aws_s3_bucket" "sample" { id = "sample-20230713121614963200000001" ~ tags = { ~ "Project" = "My Project A" -> "My Project B" } ~ tags_all = { ~ "Project" = "My Project A" -> "My Project B" } # (10 unchanged attributes hidden) # (3 unchanged blocks hidden) } Plan: 0 to add, 1 to change, 0 to destroy. S3 バケット aws_s3_bucket.sample 以外の変更が表示されないことを確認できました。 おわりに 本記事ではTerraformでコードを変更していないリソースが known after apply となってしまう場合の回避策をご紹介しました。 この記事がこの問題に悩んでいる方のお役に立てば幸いです。 最後までお読みいただき、ありがとうございました。 参考 Data Sources - Configuration Language | Terraform | HashiCorp Developer date source referencing managed resource proposes unnecessary changes under 0.14 · Issue #27171 · hashicorp/terraform 私たちは一緒に働いてくれる仲間を募集しています! クラウドアーキテクト 執筆: @shibata.takao 、レビュー: 寺山 輝 (@terayama.akira) ( Shodo で執筆されました )
こんにちは。X(クロス) イノベーション 本部 クラウド イノベーション センターの柴田です。 本記事ではTerraformでコードを変更していないリソースが known after apply となってしまう場合の回避策をご紹介します。 前提 問題となるコードの例 原因 回避策 おわりに 参考 前提 この記事は以下のTerraformのバージョンを前提とします。 新しいバージョンのTerraformでは本記事と異なる挙動をする可能性があります。 $ terraform version Terraform v1.5.3 on linux_amd64 + provider registry.terraform.io/hashicorp/aws v5.7.0 問題となるコードの例 以下のTerraformコードを例に考えてみましょう。 resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { Project = "My Project A" } } data "aws_iam_policy_document" "sample" { statement { effect = "Allow" actions = [ "s3:*" ] resources = [ aws_s3_bucket.sample.arn ] } } resource "aws_iam_policy" "sample" { name = "SampleBucketFullAccess" path = "/" policy = data.aws_iam_policy_document.sample.json } このTerraformコードを terraform apply します。 $ terraform apply Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create <= read (data resources) Terraform will perform the following actions: # data.aws_iam_policy_document.sample will be read during apply # (config refers to values not yet known) <= data "aws_iam_policy_document" "sample" { + id = (known after apply) + json = (known after apply) + statement { + actions = [ + "s3:*", ] + effect = "Allow" + resources = [ + (known after apply), ] } } # aws_iam_policy.sample will be created + resource "aws_iam_policy" "sample" { + arn = (known after apply) + id = (known after apply) + name = "SampleBucketFullAccess" + name_prefix = (known after apply) + path = "/" + policy = (known after apply) + policy_id = (known after apply) + tags_all = (known after apply) } # aws_s3_bucket.sample will be created + resource "aws_s3_bucket" "sample" { + acceleration_status = (known after apply) + acl = (known after apply) + arn = (known after apply) + bucket = (known after apply) + bucket_domain_name = (known after apply) + bucket_prefix = "sample-" + bucket_regional_domain_name = (known after apply) + force_destroy = false + hosted_zone_id = (known after apply) + id = (known after apply) + object_lock_enabled = (known after apply) + policy = (known after apply) + region = (known after apply) + request_payer = (known after apply) + tags = { + "Project" = "My Project A" } + tags_all = { + "Project" = "My Project A" } + website_domain = (known after apply) + website_endpoint = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_s3_bucket.sample: Creating... aws_s3_bucket.sample: Creation complete after 1s [id=sample-20230713121614963200000001] data.aws_iam_policy_document.sample: Reading... data.aws_iam_policy_document.sample: Read complete after 0s [id=55239551] aws_iam_policy.sample: Creating... aws_iam_policy.sample: Creation complete after 1s [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Apply complete! Resources: 2 added, 0 changed, 0 destroyed. 次にS3 バケット aws_s3_bucket.sample の Project タグの値を変更します。 resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { - Project = "My Project A" + Project = "My Project B" } } 変更後のTerraformコードに対して terraform plan を実行します。 $ terraform plan aws_s3_bucket.sample: Refreshing state... [id=sample-20230713121614963200000001] aws_iam_policy.sample: Refreshing state... [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place <= read (data resources) Terraform will perform the following actions: # data.aws_iam_policy_document.sample will be read during apply # (depends on a resource or a module with changes pending) <= data "aws_iam_policy_document" "sample" { + id = (known after apply) + json = (known after apply) + statement { + actions = [ + "s3:*", ] + effect = "Allow" + resources = [ + "arn:aws:s3:::sample-20230713121614963200000001", ] } } # aws_iam_policy.sample will be updated in-place ~ resource "aws_iam_policy" "sample" { id = "arn:aws:iam::************:policy/SampleBucketFullAccess" name = "SampleBucketFullAccess" ~ policy = jsonencode( { - Statement = [ - { - Action = "s3:*" - Effect = "Allow" - Resource = "arn:aws:s3:::sample-20230713121614963200000001" }, ] - Version = "2012-10-17" } ) -> (known after apply) tags = {} # (4 unchanged attributes hidden) } # aws_s3_bucket.sample will be updated in-place ~ resource "aws_s3_bucket" "sample" { id = "sample-20230713121614963200000001" ~ tags = { ~ "Project" = "My Project A" -> "My Project B" } ~ tags_all = { ~ "Project" = "My Project A" -> "My Project B" } # (10 unchanged attributes hidden) # (3 unchanged blocks hidden) } Plan: 0 to add, 2 to change, 0 to destroy. すると、変更がないはずのIAM policy aws_iam_policy.sample の policy が known after apply となってしまいました。 原因 これはData Sourceの仕様によるものです。 Data Resource Dependencies には以下のように記述されています。 Data resources have the same dependency resolution behavior as defined for managed resources . Setting the depends_on meta-argument within data blocks defers reading of the data source until after all changes to the dependencies have been applied. In order to ensure that data sources are accessing the most up to date information possible in a wide variety of use cases, arguments directly referencing managed resources are treated the same as if the resource was listed in depends_on . 要約すると以下のとおりです。 Data Sourceでは depends_on に記載されたリソースのすべての変更が適用されるまで読み取りは延期される。 Data Sourceの引数が他のリソースを直接参照している場合、参照先のリソースがData Sourceの depends_on に含まれている場合と同じように扱われる。 つまり Data Sourceが直接参照しているリソースに変更がある場合、それらの変更が適用されたあと、Data Sourceの読み取りが再実行される ということです。 改めて先ほどの例を考えてみましょう。Terraformが以下のように判断していたことがわかります。 aws_s3_bucket.sample のコードの変更が検出される。 data.aws_iam_policy_document.sample は aws_s3_bucket.sample を直接参照しているため、 depends_on に aws_s3_bucket.sample が含まれている場合と同じように扱われる。 depends_on に含まれる aws_s3_bucket.sample の変更が検出されたため、その変更が適用されたあとで data.aws_iam_policy_document.sample の再読み取りを行う必要があると判断される。 3をうけて aws_iam_policy.sample の policy が更新されると判断される。 回避策 Data Resource Dependencies には以下のように記述されています。 This behavior can be avoided when desired by indirectly referencing the managed resource values through a local value , unless the data resource itself has custom conditions . どうやら Local Value を間に挟むことで先ほどの事象を回避できるようです。 試してみましょう。先ほどのTerraformコードを以下のように変更します。 provider "aws" { region = "ap-northeast-1" } resource "aws_s3_bucket" "sample" { bucket_prefix = "sample-" tags = { Project = "My Project B" } } locals { s3_bucket_arn = aws_s3_bucket.sample.arn } data "aws_iam_policy_document" "sample" { statement { effect = "Allow" actions = [ "s3:*" ] resources = [ local.s3_bucket_arn ] } } resource "aws_iam_policy" "sample" { name = "SampleBucketFullAccess" path = "/" policy = data.aws_iam_policy_document.sample.json } 変更後のTerraformコードに対して terraform plan を実行します。 $ terraform plan aws_s3_bucket.sample: Refreshing state... [id=sample-20230713121614963200000001] data.aws_iam_policy_document.sample: Reading... data.aws_iam_policy_document.sample: Read complete after 0s [id=55239551] aws_iam_policy.sample: Refreshing state... [id=arn:aws:iam::************:policy/SampleBucketFullAccess] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # aws_s3_bucket.sample will be updated in-place ~ resource "aws_s3_bucket" "sample" { id = "sample-20230713121614963200000001" ~ tags = { ~ "Project" = "My Project A" -> "My Project B" } ~ tags_all = { ~ "Project" = "My Project A" -> "My Project B" } # (10 unchanged attributes hidden) # (3 unchanged blocks hidden) } Plan: 0 to add, 1 to change, 0 to destroy. S3 バケット aws_s3_bucket.sample 以外の変更が表示されないことを確認できました。 おわりに 本記事ではTerraformでコードを変更していないリソースが known after apply となってしまう場合の回避策をご紹介しました。 この記事がこの問題に悩んでいる方のお役に立てば幸いです。 最後までお読みいただき、ありがとうございました。 参考 Data Sources - Configuration Language | Terraform | HashiCorp Developer date source referencing managed resource proposes unnecessary changes under 0.14 · Issue #27171 · hashicorp/terraform 私たちは一緒に働いてくれる仲間を募集しています! クラウドアーキテクト 執筆: @shibata.takao 、レビュー: 寺山 輝 (@terayama.akira) ( Shodo で執筆されました )
こんにちは、X(クロス) イノベーション 本部 クラウド イノベーション センターの田村です。 2023 年 5 月の Microsoft Build にて統合分析プラットフォーム Microsoft Fabric が発表されました。 Microsoft Fabric は現在プレビュー中ですが、既存のサービスにはない機能追加や多くのアップデートが予定されており、 Microsoft のデータ領域ビジネスにおいて今後注目すべきサービスです。 本記事では、 Microsoft Fabric の概要とサービス検証として実施した勤怠データ分析の内容をご紹介します。 Microsoft Fabric の概要 One Lake Synapse Data Engineering Data Factory Power BI サービス検証:勤怠データの分析 概要 検証シナリオ:勤怠データ分析 検証アーキテクチャ Microsoft Fabric サブスクリプションの購入 Microsoft Fabric ワークスペースの作成 レイクハウスの作成 勤怠データの格納 ノートブックによるデータの整形 データフローによるデータの変換・加工 SQL エンドポイントによる分析 Power BI レポートの作成 サービス検証結果 一気通貫のデータ分析 データ分析の経験が浅いユーザーへのサポート 各機能の操作感 まとめ Microsoft Fabric の概要 Microsoft Fabric は、データ分析に必要な要素を 1 つの統合環境で提供する SaaS 形式のソリューションです。 従来 Microsoft の クラウド サービスでデータ分析をする場合は、Azure Data Factory や Azure Synapse Analytics といった PaaS を組み合わせた アーキテクチャ を設計する手法が一般的でした。 Microsoft Fabric では、データの蓄積/加工/変換/分析/可視化を単一の基盤上で実現できるため、ユーザーは統一された UI 上でシームレスな分析を実施できると謳われています。 これにより、ユーザーは 1 つのサービス内でデータ分析やデータ管理に関する作業をすべて完結でき、分析リソースのサイジングといった管理負担の軽減が期待できます。 Microsoft Fabric の主要な構成要素について述べます。 記事のボリュームを考慮し、今回は技術検証にて扱った要素について簡潔に説明しますので、他にも興味がある方は こちら のリンクをご参照ください。 (出典) Microsoft Fabric とは One Lake Microsoft Fabric の環境に 1 つ作成される SaaS 形式のデータレイクです。 Microsoft Fabric の各機能で利用されるデータを一元的に管理する基盤であり、ショートカットと呼ばれる機能を利用するとさまざまなサービスから手軽にデータを移動できます。 現時点では Microsoft Fabric 内部/ Amazon S3 /Azure Data Lake Storage との連携が実装されており、今後も拡大されていくと思われます。 OneLake のショートカット Synapse Data Engineering レイクハウスと呼ばれる構造化/非構造化データを管理・分析できるデータストアに格納されたデータに対する処理を行う機能です。 具体的には Apache Spark クラスタ による分析やノートブックによる対話的な分析( Python /R/ Scala )、データパイプラインによるデータの移動/変換/結合等が実施できます。 Microsoft Fabric のデータ エンジニアリングとは Data Factory 既存のデータ統合サービスである Azure Data Factory と、 Excel や Power BI 等に搭載されている Power Query を組み合わせたデータ統合機能です。 さまざまなデータソースからデータを取り込み、柔軟な処理が可能です。 Microsoft Fabric の Data Factory とは Power BI Microsoft Power Platform にて提供されている BI ツールです。 Microsoft Fabric に可視化 コンポーネント として統合されています。 Power BI とは サービス検証:勤怠データの分析 概要 7 月上旬あたりで Microsoft Fabric のキャッチアップと チュートリアル の実施がある程度進んだので、手持ちのデータを使用して Microsoft Fabric での分析に着手しました。 分析作業を通じて、下記の項目について検証することを目的とします。 Microsoft Fabric のみでデータ分析を 一気通貫 で実施できるか データ分析の経験があまりないユーザーをサポートする機能が現時点でどの程度実装されているか Microsoft Fabric の操作感(Power BI や Data Factory など統合されたサービスがこれまで通り利用できるか) 検証シナリオ:勤怠データ分析 ISID では日々の勤怠入力を自社ソリューションである POSITIVE で実施しています。 POSITIVE - 人事給与、勤怠システム ISID 社内で利用している POSITIVE では、入力した勤怠情報を Excel 形式でダウンロードできます。 そこで、自分の勤怠データが記録された Excel ファイルを Microsoft Fabric で分析し、可視化までの工程を 一気通貫 で検証してみることにしました。 検証 アーキテクチャ アーキテクチャ と検証手順は下記の通りです。 Microsoft Fabric サブスクリプション を購入する Microsoft Fabric ワークスペース を作成する Synapse Data Engineering にてデータストアとなるレイクハウスを作成する ローカルから Excel 形式の勤怠データをレイクハウスへ格納する ノートブック を作成し、 Excel 形式の勤怠データを整形して再度レイクハウスへ格納する 整形された勤怠データをデータフローにて変換・加工し、再度レイクハウスへ格納する レイクハウスから SQL エンドポイントを作成し分析を実施する 変換後のデータおよび分析結果を Power BI にて可視化する Microsoft Fabric サブスクリプション の購入 Microsoft 365 もしくは Azure 上から購入できます。 今回は Azure 上から購入しました。 手順は簡単かつドキュメントの内容をなぞるだけですので、本記事では割愛します。 Microsoft Fabric サブスクリプションを購入する Microsoft Fabric ワークスペース の作成 ワークスペース とは、 Microsoft Fabric で作成したさまざまなコレクション(レイクハウス、データフロー、BI レポート etc...)をまとめて管理するものです。 Microsoft Fabric で作業を開始する際には、内容を問わずはじめに実施する工程となります。 手順としては ワークスペース 名を入力して保存するだけですので、こちらについても詳細は割愛します。 厳密には ワークスペース に対する権限設定などもありますが、今回は検証用 ワークスペース のため実施していません。 ワークスペースの作成 レイクハウスの作成 レイクハウスは、大容量のデータを蓄積するデータレイクとデータの取り込みや分析に特化したデータウェアハウスを統合したものです。 一般的に構造化/半構造化/非構造化データを 1 箇所で管理・分析することが可能で、 Microsoft Fabric では多様なデータソースからのデータ格納とデータに対するさまざまな変換・統合処理や SQL や Spark エンジンを利用した分析をサポートしています。 また Microsoft Fabric におけるレイクハウスの特徴として、格納されたデータを自動で検出し、分析に適した形式でテーブルとして登録する機能も用意されています。 作成自体は非常に簡単で、 Microsoft Fabric ワークスペース の[+ 新規]より[レイクハウス]を選択し任意の名前を設定して完了です。 勤怠データの格納 検証に必要なデータを作成したレイクハウスへ格納します。 対象となるのは、私の 2023 年 6 月分の勤怠実績を記録した Excel データ(ファイル名:Attendance_202306.xlsx)です。 作成直後のレイクハウスには 構造化データが管理される Tables とデータレイクのようにさまざまなソースから連携された生データが管理される Files というセクションが用意されています。 データ格納をする際はデータフローやパイプラインを利用する方法や、One Lake のショートカット機能などさまざまな選択肢がありますが、今回はシンプルに手動でアップロードしました。 アップロードが完了すると データ形式 によってはプレビュー表示が可能ですが、2023 年 7 月時点で Excel データはサポート外のようです。 ノートブックによるデータの整形 生データの時点である程度構造化されていればよいのですが、検証で扱う勤怠データは分析用にフォーマットされたものではないため、 変換や統合処理の前にデータを整形する必要があります。 そこで、今回は Spark エンジンが接続されたノートブックによるデータの整形を実施しました。 ほかの選択肢としてデータフロー(Power Query)も検討しましたが、そちらはこの後の作業であるデータの変換・加工処理で利用しています。 ノートブックはレイクハウス UI の[ノートブックを開く]より作成できます。 ノートブックの作成と同時に Spark エンジンも用意されるため、ユーザーは言語を選択して処理を記述していくだけです。 私は Python を選択しましたが、その他に Scala / C# /R/Spark SQL がサポートされています。 データ整形の内容としては、 Excel 形式の勤怠データをより必要なデータを抽出し、 Python のデータフレームを利用してデータを再配置しています。 抽出したデータは下記の通りです。 日付 勤務区分(出勤/法定休日/有給など) 勤務形態(出社/テレワーク/顧客先など) 勤務開始時間 勤務終了時間 勤務時間 休憩時間 また、整形後のデータはレイクハウス内でプレビュー表示させたかったので、 CSV 形式のファイルとして Files セクションに格納しています。 整形後のデータは下記の通りです(ファイル名:Attendance. csv )。 データフローによるデータの変換・加工 整形したデータに対して、変換・加工処理を実施し分析の準備を行います。 前述したノートブックでまとめて実施してもよかったのですが、他の機能も触ってみたいという思いでデータフローによる作業としました。 データフローは Microsoft Fabric の UI より Data Factory を選択し、[Dataflow Gen2(プレビュー)]より作成できます。 作成後はレイクハウスに格納されている整形後の勤怠データ(Attendance. csv )を読み込み、必要な処理を実施します。 今回実施した主な処理内容は下記の通りです。 勤務開始/終了時間のデータ型を文字列型へ変更する 定時を表現する列を追加する 勤務時間と定時を計算し、残業時間を表現する列を追加する 勤務区分に休日出勤が含まれる場合は、勤務時間を残業時間として追加する 実際のデータフロー画面は下画像のようになります。 ノートブックと異なり、コード(Power Query)を記述できなくとも GUI 上の操作で基本的なデータの変換・加工が可能です。 もちろん、必要に応じて直接 Power Query を書くこともできます。 また、処理のサマリがダイアグラムビュー(画像内の青枠部分)に記録され処理結果は画像下部にプレビューされるので、処理に対する結果を即時把握できます。 データ変換が完了したら、画像右下の[データの同期先]よりレイクハウスへの同期設定を行うことで、分析用に最適化された形式で Tables セクションへ格納されます。 また、その際の スキーマ 定義やデータ構造の作成などはすべて自動で実施されます。 データフローからレイクハウスへの同期が完了すると、Tables セクションでテーブルの内容をプレビューできます。 今回は変換後のデータであることを明示するために、attendance_transform というテーブル名としました。 SQL エンドポイントによる分析 データフローから同期されたテーブルに対して分析を実施します。 SQL エンドポイントと呼ばれる機能を利用することで、レイクハウス内のテーブルに対する SQL クエリ発行やリレーションシップの構成が可能です。 レイクハウスの UI より、 SQL エンドポイントへ遷移します。 SQL エンドポイントでは 3 つのペインが用意されており、それぞれ下記の作業が可能です。 データ: スキーマ 定義に含まれるテー ブルデー タの確認や SQL クエリの管理 クエリ: T-SQL クエリの発行 モデル:テーブル間のリレーションシップ構成や Power BI におけるメジャーの設定が可能 今回はクエリとモデルのペインにて、それぞれ分析作業を実施しました。 主な分析内容は下記の通りです。 SQL クエリを利用した分析 勤務時間、残業時間、勤務区分、勤務形態の集計 勤務形態における勤務状況の傾向分析 1 か月間における勤務状況の傾向分析 モデル 勤務日における出社/テレワークの割合を算出 今回は 1 か月分の勤怠データのみであったためそこまで複雑な分析ではありませんが、関連データの追加やデータ期間を拡大することでさらに充実した分析が可能です。 Power BI レポートの作成 最終工程として、分析結果を Power BI で可視化します。 SQL エンドポイント UI の[新しいレポート]より、Power BI レポートの作成画面へ遷移します。 分析結果を反映した Power BI レポートは下画像の通りです。 レポート内の各ビジュアルで分析結果を可視化しています。 勤務時間と残業時間および勤務日に対するテレワークの割合をカード上にテキスト形式で表示 1 か月間における勤務時間の推移と定時に対する残業時間の推移を棒グラフで表示 勤務時間が長い日や期間を表形式で表示 勤務形態(出社 or テレワーク)の違いで平均勤務時間にどのような影響があるか散布図で表示 サービス検証結果 勤怠データの分析シナリオを通じた Microsoft Fabric の検証結果をまとめます。 検証項目は下記の通りです(再掲)。 Microsoft Fabric のみでデータ分析を 一気通貫 で実施できるか データ分析の経験があまりないユーザーをサポートする機能が現時点でどの程度実装されているか Microsoft Fabric の操作感(Power BI や Data Factory など統合されたサービスがこれまで通り利用できるか) その他利用時の注意点 一気通貫 のデータ分析 データの格納から可視化まですべて Microsoft Fabric で完結できました。 従来のように分析ごとに用途に応じて PaaS を組み合わせたり、インフラを確保する必要がなく、統一された UI の元で作業ができることはメリットであると言えます。 今回はローカルデータを中心とした分析シナリオでしたが、 機械学習 やリアルタイム分析など幅広いシナリオに対応できるサービスであるという印象です。 一方で、分析シナリオによっては不要な機能や コンポーネント があることも事実です。 Microsoft Fabric の利用が最適となる分析シナリオは何か、という点については、金銭面や学習コストの観点も含めて今後のアップデートを追っていく必要があります。 データ分析の経験が浅いユーザーへのサポート 今回の検証で触れた機能の中では、データフローの GUI によるデータ変換処理は比較的ユーザーに易しい設計という印象を受けました。 ですが、それ以外の部分については継続的な強化が必要と感じています。 Microsoft Fabric は「誰もがデータを管理および分析してアクションにつながる インサイト を得られる」というコンセプトを掲げていますが、現状の機能構成はデータ変換や加工・分析等の処理設計をユーザーの知識に依存しています。 Microsoft Fabric - データ分析 今回の検証においては、ノートブックを利用したデータの前処理や SQL エンドポイントによる分析で必要となるコードやクエリの作成は、未経験のユーザーには難易度が高い作業です。 誰もがデータを管理および分析するためにはこのような作業に対するサポート機能が必要で、具体的には下記のような内容を期待します。 Copilot 機能による各種コードやクエリの自動生成 One Lake のショートカット機能強化(連携先の拡張など) ドキュメントや チュートリアル の充実 Microsoft によると、Azure OpenAI と連携した Copilot 機能が近日公開予定となっておりますので、そちらを注視したいと思います。 各機能の操作感 主観になりますが、既存の PaaS や SaaS から統合された機能については違和感なく操作できました。 ノートブックによる対話形式でのデータ操作やデータフロー周辺の操作は、UI 自体が統合元の Microsoft 製品と大きく変わらないため、それらの経験がある方であれば抵抗なく利用できるかと思います。 まとめ 本記事では、 Microsoft Fabric の概要とサービス検証として実施した勤怠データ分析の内容についてご紹介しました。 Microsoft Fabric は発表されて間もないソリューションであり、ロードマップでは今後も多くのアップデートが予定されておりますので、引き続き注視したいと思います。 私たちは一緒に働いてくれる仲間を募集しています! クラウドアーキテクト 執筆: @tamura.kohei 、レビュー: @yamada.y ( Shodo で執筆されました )
こんにちは、X(クロス) イノベーション 本部 クラウド イノベーション センターの田村です。 2023 年 5 月の Microsoft Build にて統合分析プラットフォーム Microsoft Fabric が発表されました。 Microsoft Fabric は現在プレビュー中ですが、既存のサービスにはない機能追加や多くのアップデートが予定されており、 Microsoft のデータ領域ビジネスにおいて今後注目すべきサービスです。 本記事では、 Microsoft Fabric の概要とサービス検証として実施した勤怠データ分析の内容をご紹介します。 Microsoft Fabric の概要 One Lake Synapse Data Engineering Data Factory Power BI サービス検証:勤怠データの分析 概要 検証シナリオ:勤怠データ分析 検証アーキテクチャ Microsoft Fabric サブスクリプションの購入 Microsoft Fabric ワークスペースの作成 レイクハウスの作成 勤怠データの格納 ノートブックによるデータの整形 データフローによるデータの変換・加工 SQL エンドポイントによる分析 Power BI レポートの作成 サービス検証結果 一気通貫のデータ分析 データ分析の経験が浅いユーザーへのサポート 各機能の操作感 まとめ Microsoft Fabric の概要 Microsoft Fabric は、データ分析に必要な要素を 1 つの統合環境で提供する SaaS 形式のソリューションです。 従来 Microsoft の クラウド サービスでデータ分析をする場合は、Azure Data Factory や Azure Synapse Analytics といった PaaS を組み合わせた アーキテクチャ を設計する手法が一般的でした。 Microsoft Fabric では、データの蓄積/加工/変換/分析/可視化を単一の基盤上で実現できるため、ユーザーは統一された UI 上でシームレスな分析を実施できると謳われています。 これにより、ユーザーは 1 つのサービス内でデータ分析やデータ管理に関する作業をすべて完結でき、分析リソースのサイジングといった管理負担の軽減が期待できます。 Microsoft Fabric の主要な構成要素について述べます。 記事のボリュームを考慮し、今回は技術検証にて扱った要素について簡潔に説明しますので、他にも興味がある方は こちら のリンクをご参照ください。 (出典) Microsoft Fabric とは One Lake Microsoft Fabric の環境に 1 つ作成される SaaS 形式のデータレイクです。 Microsoft Fabric の各機能で利用されるデータを一元的に管理する基盤であり、ショートカットと呼ばれる機能を利用するとさまざまなサービスから手軽にデータを移動できます。 現時点では Microsoft Fabric 内部/ Amazon S3 /Azure Data Lake Storage との連携が実装されており、今後も拡大されていくと思われます。 OneLake のショートカット Synapse Data Engineering レイクハウスと呼ばれる構造化/非構造化データを管理・分析できるデータストアに格納されたデータに対する処理を行う機能です。 具体的には Apache Spark クラスタ による分析やノートブックによる対話的な分析( Python /R/ Scala )、データパイプラインによるデータの移動/変換/結合等が実施できます。 Microsoft Fabric のデータ エンジニアリングとは Data Factory 既存のデータ統合サービスである Azure Data Factory と、 Excel や Power BI 等に搭載されている Power Query を組み合わせたデータ統合機能です。 さまざまなデータソースからデータを取り込み、柔軟な処理が可能です。 Microsoft Fabric の Data Factory とは Power BI Microsoft Power Platform にて提供されている BI ツールです。 Microsoft Fabric に可視化 コンポーネント として統合されています。 Power BI とは サービス検証:勤怠データの分析 概要 7 月上旬あたりで Microsoft Fabric のキャッチアップと チュートリアル の実施がある程度進んだので、手持ちのデータを使用して Microsoft Fabric での分析に着手しました。 分析作業を通じて、下記の項目について検証することを目的とします。 Microsoft Fabric のみでデータ分析を 一気通貫 で実施できるか データ分析の経験があまりないユーザーをサポートする機能が現時点でどの程度実装されているか Microsoft Fabric の操作感(Power BI や Data Factory など統合されたサービスがこれまで通り利用できるか) 検証シナリオ:勤怠データ分析 ISID では日々の勤怠入力を自社ソリューションである POSITIVE で実施しています。 POSITIVE - 人事給与、勤怠システム ISID 社内で利用している POSITIVE では、入力した勤怠情報を Excel 形式でダウンロードできます。 そこで、自分の勤怠データが記録された Excel ファイルを Microsoft Fabric で分析し、可視化までの工程を 一気通貫 で検証してみることにしました。 検証 アーキテクチャ アーキテクチャ と検証手順は下記の通りです。 Microsoft Fabric サブスクリプション を購入する Microsoft Fabric ワークスペース を作成する Synapse Data Engineering にてデータストアとなるレイクハウスを作成する ローカルから Excel 形式の勤怠データをレイクハウスへ格納する ノートブック を作成し、 Excel 形式の勤怠データを整形して再度レイクハウスへ格納する 整形された勤怠データをデータフローにて変換・加工し、再度レイクハウスへ格納する レイクハウスから SQL エンドポイントを作成し分析を実施する 変換後のデータおよび分析結果を Power BI にて可視化する Microsoft Fabric サブスクリプション の購入 Microsoft 365 もしくは Azure 上から購入できます。 今回は Azure 上から購入しました。 手順は簡単かつドキュメントの内容をなぞるだけですので、本記事では割愛します。 Microsoft Fabric サブスクリプションを購入する Microsoft Fabric ワークスペース の作成 ワークスペース とは、 Microsoft Fabric で作成したさまざまなコレクション(レイクハウス、データフロー、BI レポート etc...)をまとめて管理するものです。 Microsoft Fabric で作業を開始する際には、内容を問わずはじめに実施する工程となります。 手順としては ワークスペース 名を入力して保存するだけですので、こちらについても詳細は割愛します。 厳密には ワークスペース に対する権限設定などもありますが、今回は検証用 ワークスペース のため実施していません。 ワークスペースの作成 レイクハウスの作成 レイクハウスは、大容量のデータを蓄積するデータレイクとデータの取り込みや分析に特化したデータウェアハウスを統合したものです。 一般的に構造化/半構造化/非構造化データを 1 箇所で管理・分析することが可能で、 Microsoft Fabric では多様なデータソースからのデータ格納とデータに対するさまざまな変換・統合処理や SQL や Spark エンジンを利用した分析をサポートしています。 また Microsoft Fabric におけるレイクハウスの特徴として、格納されたデータを自動で検出し、分析に適した形式でテーブルとして登録する機能も用意されています。 作成自体は非常に簡単で、 Microsoft Fabric ワークスペース の[+ 新規]より[レイクハウス]を選択し任意の名前を設定して完了です。 勤怠データの格納 検証に必要なデータを作成したレイクハウスへ格納します。 対象となるのは、私の 2023 年 6 月分の勤怠実績を記録した Excel データ(ファイル名:Attendance_202306.xlsx)です。 作成直後のレイクハウスには 構造化データが管理される Tables とデータレイクのようにさまざまなソースから連携された生データが管理される Files というセクションが用意されています。 データ格納をする際はデータフローやパイプラインを利用する方法や、One Lake のショートカット機能などさまざまな選択肢がありますが、今回はシンプルに手動でアップロードしました。 アップロードが完了すると データ形式 によってはプレビュー表示が可能ですが、2023 年 7 月時点で Excel データはサポート外のようです。 ノートブックによるデータの整形 生データの時点である程度構造化されていればよいのですが、検証で扱う勤怠データは分析用にフォーマットされたものではないため、 変換や統合処理の前にデータを整形する必要があります。 そこで、今回は Spark エンジンが接続されたノートブックによるデータの整形を実施しました。 ほかの選択肢としてデータフロー(Power Query)も検討しましたが、そちらはこの後の作業であるデータの変換・加工処理で利用しています。 ノートブックはレイクハウス UI の[ノートブックを開く]より作成できます。 ノートブックの作成と同時に Spark エンジンも用意されるため、ユーザーは言語を選択して処理を記述していくだけです。 私は Python を選択しましたが、その他に Scala / C# /R/Spark SQL がサポートされています。 データ整形の内容としては、 Excel 形式の勤怠データをより必要なデータを抽出し、 Python のデータフレームを利用してデータを再配置しています。 抽出したデータは下記の通りです。 日付 勤務区分(出勤/法定休日/有給など) 勤務形態(出社/テレワーク/顧客先など) 勤務開始時間 勤務終了時間 勤務時間 休憩時間 また、整形後のデータはレイクハウス内でプレビュー表示させたかったので、 CSV 形式のファイルとして Files セクションに格納しています。 整形後のデータは下記の通りです(ファイル名:Attendance. csv )。 データフローによるデータの変換・加工 整形したデータに対して、変換・加工処理を実施し分析の準備を行います。 前述したノートブックでまとめて実施してもよかったのですが、他の機能も触ってみたいという思いでデータフローによる作業としました。 データフローは Microsoft Fabric の UI より Data Factory を選択し、[Dataflow Gen2(プレビュー)]より作成できます。 作成後はレイクハウスに格納されている整形後の勤怠データ(Attendance. csv )を読み込み、必要な処理を実施します。 今回実施した主な処理内容は下記の通りです。 勤務開始/終了時間のデータ型を文字列型へ変更する 定時を表現する列を追加する 勤務時間と定時を計算し、残業時間を表現する列を追加する 勤務区分に休日出勤が含まれる場合は、勤務時間を残業時間として追加する 実際のデータフロー画面は下画像のようになります。 ノートブックと異なり、コード(Power Query)を記述できなくとも GUI 上の操作で基本的なデータの変換・加工が可能です。 もちろん、必要に応じて直接 Power Query を書くこともできます。 また、処理のサマリがダイアグラムビュー(画像内の青枠部分)に記録され処理結果は画像下部にプレビューされるので、処理に対する結果を即時把握できます。 データ変換が完了したら、画像右下の[データの同期先]よりレイクハウスへの同期設定を行うことで、分析用に最適化された形式で Tables セクションへ格納されます。 また、その際の スキーマ 定義やデータ構造の作成などはすべて自動で実施されます。 データフローからレイクハウスへの同期が完了すると、Tables セクションでテーブルの内容をプレビューできます。 今回は変換後のデータであることを明示するために、attendance_transform というテーブル名としました。 SQL エンドポイントによる分析 データフローから同期されたテーブルに対して分析を実施します。 SQL エンドポイントと呼ばれる機能を利用することで、レイクハウス内のテーブルに対する SQL クエリ発行やリレーションシップの構成が可能です。 レイクハウスの UI より、 SQL エンドポイントへ遷移します。 SQL エンドポイントでは 3 つのペインが用意されており、それぞれ下記の作業が可能です。 データ: スキーマ 定義に含まれるテー ブルデー タの確認や SQL クエリの管理 クエリ: T-SQL クエリの発行 モデル:テーブル間のリレーションシップ構成や Power BI におけるメジャーの設定が可能 今回はクエリとモデルのペインにて、それぞれ分析作業を実施しました。 主な分析内容は下記の通りです。 SQL クエリを利用した分析 勤務時間、残業時間、勤務区分、勤務形態の集計 勤務形態における勤務状況の傾向分析 1 か月間における勤務状況の傾向分析 モデル 勤務日における出社/テレワークの割合を算出 今回は 1 か月分の勤怠データのみであったためそこまで複雑な分析ではありませんが、関連データの追加やデータ期間を拡大することでさらに充実した分析が可能です。 Power BI レポートの作成 最終工程として、分析結果を Power BI で可視化します。 SQL エンドポイント UI の[新しいレポート]より、Power BI レポートの作成画面へ遷移します。 分析結果を反映した Power BI レポートは下画像の通りです。 レポート内の各ビジュアルで分析結果を可視化しています。 勤務時間と残業時間および勤務日に対するテレワークの割合をカード上にテキスト形式で表示 1 か月間における勤務時間の推移と定時に対する残業時間の推移を棒グラフで表示 勤務時間が長い日や期間を表形式で表示 勤務形態(出社 or テレワーク)の違いで平均勤務時間にどのような影響があるか散布図で表示 サービス検証結果 勤怠データの分析シナリオを通じた Microsoft Fabric の検証結果をまとめます。 検証項目は下記の通りです(再掲)。 Microsoft Fabric のみでデータ分析を 一気通貫 で実施できるか データ分析の経験があまりないユーザーをサポートする機能が現時点でどの程度実装されているか Microsoft Fabric の操作感(Power BI や Data Factory など統合されたサービスがこれまで通り利用できるか) その他利用時の注意点 一気通貫 のデータ分析 データの格納から可視化まですべて Microsoft Fabric で完結できました。 従来のように分析ごとに用途に応じて PaaS を組み合わせたり、インフラを確保する必要がなく、統一された UI の元で作業ができることはメリットであると言えます。 今回はローカルデータを中心とした分析シナリオでしたが、 機械学習 やリアルタイム分析など幅広いシナリオに対応できるサービスであるという印象です。 一方で、分析シナリオによっては不要な機能や コンポーネント があることも事実です。 Microsoft Fabric の利用が最適となる分析シナリオは何か、という点については、金銭面や学習コストの観点も含めて今後のアップデートを追っていく必要があります。 データ分析の経験が浅いユーザーへのサポート 今回の検証で触れた機能の中では、データフローの GUI によるデータ変換処理は比較的ユーザーに易しい設計という印象を受けました。 ですが、それ以外の部分については継続的な強化が必要と感じています。 Microsoft Fabric は「誰もがデータを管理および分析してアクションにつながる インサイト を得られる」というコンセプトを掲げていますが、現状の機能構成はデータ変換や加工・分析等の処理設計をユーザーの知識に依存しています。 Microsoft Fabric - データ分析 今回の検証においては、ノートブックを利用したデータの前処理や SQL エンドポイントによる分析で必要となるコードやクエリの作成は、未経験のユーザーには難易度が高い作業です。 誰もがデータを管理および分析するためにはこのような作業に対するサポート機能が必要で、具体的には下記のような内容を期待します。 Copilot 機能による各種コードやクエリの自動生成 One Lake のショートカット機能強化(連携先の拡張など) ドキュメントや チュートリアル の充実 Microsoft によると、Azure OpenAI と連携した Copilot 機能が近日公開予定となっておりますので、そちらを注視したいと思います。 各機能の操作感 主観になりますが、既存の PaaS や SaaS から統合された機能については違和感なく操作できました。 ノートブックによる対話形式でのデータ操作やデータフロー周辺の操作は、UI 自体が統合元の Microsoft 製品と大きく変わらないため、それらの経験がある方であれば抵抗なく利用できるかと思います。 まとめ 本記事では、 Microsoft Fabric の概要とサービス検証として実施した勤怠データ分析の内容についてご紹介しました。 Microsoft Fabric は発表されて間もないソリューションであり、ロードマップでは今後も多くのアップデートが予定されておりますので、引き続き注視したいと思います。 私たちは一緒に働いてくれる仲間を募集しています! クラウドアーキテクト 執筆: @tamura.kohei 、レビュー: @yamada.y ( Shodo で執筆されました )
こんにちは。X(クロス) イノベーション 本部 ソフトウェアデザインセンター セキュリティグループの耿です。 AWS のマネジメントコンソールへのユーザー認証ではMFAの利用が一般的になってきましたが、アクセスキー利用時にMFAを必須とするには少しコツがいるので、この記事でまとめてみます。 ちなみに Security Hub のコン トロール IAM.19 「すべての IAM ユーザーに対して MFA を有効にする必要があります」を満たすには、マネジメントコンソールのユーザーだけではなく、アクセスキーで利用するIAMユーザーに対してもMFAの設定をしなければなりません。 前提:IAMユーザーの状態 通常通りポリシーをつけても、MFA不要でアクセスできてしまう MFAを必須にする方法1:ユーザーポリシーに条件を追加する MFAを必須にする方法2:スイッチロールを利用し、コードの取得を簡単にする Tips:OSSツールAWSumeで簡単にスイッチロール まとめ 前提:IAMユーザーの状態 IAMユーザーを作成し、MFAを設定した状態を前提として、この後の話を進めます。(IAMユーザー・アクセスキーを配布するケースは事前にMFAを設定しておくことはできませんが、この記事では割愛します。) このユーザーに対してアクセスキーを発行しておきます。 ~/.aws/credentials に test-user というプロファイル名で、アクセスキーとシークレットアクセスキーを保存しておきます。 [test-user] aws_access_key_id = <アクセスキーID> aws_secret_access_key = <シークレットアクセスキー> region = ap-northeast-1 通常通りポリシーをつけても、MFA不要でアクセスできてしまう このユーザーに対して、以下のようなポリシーを付けてみます。 この記事では一貫して ec2:DescribeRegions を例としていますが、一般的なリソースアクセスの許可に適宜置き換えて考えてください。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " ec2:DescribeRegions ", " Resource ": " * " } ] } このユーザーを利用し DescribeRegions API をコールすると、MFAを設定しているにも関わらず、MFAコードを入力しなくてもアクセスが成功してしまいました。 Security Hub のIAM.19コン トロール をクリアするだけであれば、このようにMFAを有効にするだけで良いのですが、それだとMFAを利用しなくても権限を使用できてしまいます。せっかくMFAを有効にするのですから、MFAを利用しないと API アクセスできないようにきっちり設定したいですね。 MFAを必須にする方法1:ユーザーポリシーに条件を追加する MFAの利用を必須とする方法の1つ目として、IAMユーザーのポリシーを次のように書き換えます。 Condition 句を追加し、 aws:MultiFactorAuthPresent を利用してMFAを行ったことを条件とします。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " ec2:DescribeRegions ", " Resource ": " * ", " Condition ": { " Bool ": { " aws:MultiFactorAuthPresent ": " true " } } } ] } 再び DescribeRegions API をコールすると、MFAを利用していないので今度はちゃんとエラーとなります。 MFAを利用するためには STS の GetSessionToken API を呼び出し、一時的な認証情報を取得します。 このとき --serial-number オプションには設定した MFA デ バイス の識別子(ARN)を、 --token-code にはMFA トーク ンを指定します。 発行された一時的な認証情報を使用するために ~/.aws/credentials に新しくプロファイルを作成しても良いですが、ここではシンプルに 環境変数 に設定します。 ( 環境変数 に設定された AWS 認証情報は、 認証情報ファイルよりも優先されます 。) そして 環境変数 に設定した認証情報を利用してもらうために、 AWS CLI の --profile オプションをつけずに DescribeRegions API をコールすると、再びアクセスできるようになりました。 以上の方法でMFAの利用を必須にはできましたが、 GetSessionToken API を呼び出して一時的な認証情報を取得する 取得した認証情報を利用するように設定する といった手間がかかってしまいます。 MFAを必須にする方法2:スイッチロールを利用し、コードの取得を簡単にする 上で説明した手間を省くために、スイッチロールを利用してMFAを強制する方法があります。 IAMロールを1つ作成します。 信頼ポリシー では同じアカウントからの AssumeRole を許可すると同時に、 aws:MultiFactorAuthPresent を利用してMFAを行ったことを条件とします。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " AWS ": " arn:aws:iam::<アカウントID>:root " } , " Action ": " sts:AssumeRole ", " Condition ": { " Bool ": { " aws:MultiFactorAuthPresent ": " true " } } } ] } このロールの 許可ポリシー は、上で作成したユーザーと同じとします。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " ec2:DescribeRegions ", " Resource ": " * " } ] } そして元のIAMユーザーの許可ポリシーから DescribeRegions の許可を除外し、作成した IAMロールへの AssumeRole のみを許可します。( aws:MultiFactorAuthPresent の条件も不要です。) { " Version ": " 2012-10-17 ", " Statement ": [ { " Action ": " sts:AssumeRole ", " Resource ": " arn:aws:iam::<アカウントID>:role/<ロール名> ", " Effect ": " Allow " } ] } スイッチロールを簡単にするために、 ~/.aws/config に以下のように追記します。 [profile test-user] の部分は ~/.aws/credentials に記載したプロファイル名 test-user と名前を合わせる必要があります。 [profile test-user] region = ap-northeast-1 [profile my-test-role] region = ap-northeast-1 source_profile = test-user role_arn = arn:aws:iam::<アカウントID>:role/<スイッチロール用のロール名> mfa_serial = arn:aws:iam::<アカウントID>:mfa/<デバイス名> DescribeRegions API を呼び出す時に、スイッチロールした先のプロファイル名(ここでは my-test-role )を指定すると、そのままMFAコードを尋ねられます。入力すると API 実行が成功します。 この方法の良いところは、実行したい API をそのままコールすればよく、デ バイス の識別子(ARN)も ~/.aws/config にあらかじめ保存してあるので毎回入力する必要がないことです。 Tips: OSS ツールAWSumeで簡単にスイッチロール MFAを強制するスイッチロールを簡単にするツールとして、 OSS の AWSume もおすすめです。 必要なロール・ポリシー構成は「方法2」と同じで、ローカルで AWS SDK を利用する時にも一時的なクレデンシャル情報を簡単なコマンドでセットアップできたりするので便利です。 セットアップ 後、 awsume <プロファイル名> で一時的な認証情報を取得でき、MFAが必要な場合はここで尋ねられます。そのあとは、一時的な認証情報を利用して API コールできるようになります。 まとめ これまで説明したパターンを図にまとめてみました。 IAMアクセスキーは漏えいしないように細心の注意を払うことが大前提ですが、万が一漏えいしたとしてもすぐに使えないように、MFAで二重のガードをしておきましょう。 私たちは同じチームで働いてくれる仲間を大募集しています!たくさんのご応募をお待ちしています。 セキュリティエンジニア 執筆: @kou.kinyo 、レビュー: 寺山 輝 (@terayama.akira) ( Shodo で執筆されました )