株匏䌚瀟G-genのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟G-gen

株匏䌚瀟G-gen の技術ブログ

å…š888ä»¶

G-gen の杉村です。BigQuery は通垞の運甚デヌタベヌスず異なり、分析甚デヌタベヌスであるこずから、非正芏化したテヌブルを扱うこずが倚くなりたす。そのための独特のデヌタ型ずしお、ARRAY (配列) ず STRUCT (構造䜓) がありたす。これらに぀いお解説したす。 抂芁 ARRAY (配列) ARRAY ずは サンプルテヌブル SELECT SELECT 〜 WHERE SELECT 〜 CROSS JOIN SELECT (SELECT ~ UNNEST) CREATE TABLE / INSERT 制限 STRUCT (構造䜓) STRUCT ずは サンプルテヌブル SELECT SELECT 〜 WHERE CREATE TABLE / INSERT 制限 ARRAY<STRUCT> (ネストされた繰り返し列) ARRAY<STRUCT> ずは サンプルテヌブル SELECT SELECT 〜 WHERE (゚ラヌ) SELECT 〜 CROSS JOIN SELECT (SELECT ~ UNNEST) CREATE TABLE / INSERT 実践 : Google Analytics 4 デヌタぞのク゚リ 抂芁 テヌブル䟋 ク゚リ䟋1: 特定ペヌゞの PV 数を集蚈 ク゚リ䟋2 : string_value を取り出す関数を䜜る スキヌマ衚蚘 抂芁 ARRAY STRUCT ARRAY<STRUCT> 抂芁 BigQuery は Google Cloud (旧称 GCP) の提䟛するサヌバヌレスな分析甚デヌタベヌスのサヌビスです。列志向 (カラムナ) の特城を持ち、料金プランの遞択にもよりたすが、デフォルトではスキャンしたデヌタ量に応じた埓量課金です。 クラりド䞊の分析甚デヌタベヌスのベストプラクティスずしお、テヌブルを非正芏化するこずでデヌタ読み取りや結合のコストを䞋げ、パフォヌマンス向䞊を図るこずがありたす。今回ご玹介する ARRAY (配列) ず STRUCT (構造䜓) は、いずれもデヌタを非正芏化しお持぀型です。これらのデヌタ型には、Google Analytics 4 や Google Analytics for Firebase、Google Cloud の Billing Export などでデヌタを BigQuery に゚クスポヌトするずよく出䌚いたす。 その独特のク゚リの仕方に苊しめられた人も倚いのではないでしょうか。圓蚘事ではこれらに぀いお解説し、たた組み合わせお䜿う ARRAY<STRUCT> に぀いおもご玹介したす。 たた、最埌には Google Analytics 4 のデヌタを暡したテヌブルに察するク゚リの方法も䟋瀺したす。 参考 : ネストされ繰り返されおいるフィヌルドを䜿甚する ARRAY (配列) ARRAY ずは ARRAY (配列) ずは「れロ個以䞊の同じデヌタ型の倀で構成された順序付きリスト」のこずです。以䞋のようなものを指したす。 # INT64 の配列 [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ] # STRING の配列 [" 囜語 " , " 算数 " , " 理科 " , " 瀟䌚 "] 配列の型を持぀テヌブルは以䞋のようなものになりたす。 (行番号) name subjects 1 田侭 倪郎 囜語 算数 理科 瀟䌚 2 鈎朚 二郎 囜語 算数 ※ (行番号) 列は䞀行のたずたりを瀺すために䟿宜的に割り振ったものであり、テヌブル内のデヌタではありたせん。 䞊蚘のテヌブルの subjects 列は ARRAY であり、 1行に2぀以䞊の倀 が入っおいたす。 これはリレヌションの第1正芏圢に違反しおおり、通垞のリレヌショナル・デヌタベヌスではこのようなデヌタの持ち方をしたせん。しかし BigQuery のような分析甚デヌタベヌスではこのような配列型を䜿いリレヌションを維持したたた、マスタずトランザクションを分けない倧犏垳的なテヌブル構成にするこずで、JOIN のコストが䞋がりパフォヌマンス向䞊を図るこずができたす。 参考 : Array type 参考 : 配列リテラル 参考 : 配列の操䜜 サンプルテヌブル ここからは実際の SQL を玹介しながらむメヌゞを掎んでいきたす。以䞋の WITH 句を仮想的なサンプルテヌブルずしお䜿いたす。 name 列が通垞の STRING 型で、subjects 列は STRING 型の倀を芁玠に持぀配列型です。 WITH t0 AS ( SELECT " 田侭 倪郎 " AS name, [ " 囜語 " , " 算数 " , " 理科 " , " 瀟䌚 " ] AS subjects UNION ALL SELECT " 鈎朚 二郎 " AS name, [ " 囜語 " , " 算数 " ] AS subjects ) SELECT * FROM t0; (行番号) name subjects 1 田侭 倪郎 囜語 算数 理科 瀟䌚 2 鈎朚 二郎 囜語 算数 SELECT たず SELECT 文の䟋を芋るこずでむメヌゞを掎みたす (以降、WITH 句は省略したす。先ほどの SQL 文埌半の SELECT 以降を曞き換えおお詊しください)。 SELECT name, subjects FROM t0; 䞊蚘のように、SELECT 文は通垞の列をク゚リするずきず䜕ら代わりありたせん。出力結果は以䞋のようになり、配列内の党おの倀が返りたす。 (行番号) name subjects 1 田侭 倪郎 囜語 算数 理科 瀟䌚 2 鈎朚 二郎 囜語 算数 SELECT 〜 WHERE WHERE 句でフィルタをしようず考えたずき、最初の壁に圓たりたす。 SELECT name, subjects FROM t0 WHERE subjects = " 理科 " ; この SQL は、以䞋のような゚ラヌになりたす。 No matching signature for operator = for argument types: ARRAY<STRING>, STRING. Supported signature: ANY = ANY at [17:3] = の巊蟺ず右蟺で異なる型 (巊蟺は ARRAY である subjects 列、右蟺は STRING) を指定しおいるこずから゚ラヌになっおいたす。なお右蟺を ["囜語", "算数"] のように配列にしおも゚ラヌになりたす ( Equality is not defined for arguments of type ARRAY<STRING> at [7:5] )。 = 挔算子はそもそも配列型をサポヌトしおいたせん。 䞀方で、以䞋のク゚リは成功したす。 SELECT name, subjects FROM t0 WHERE " 理科 " IN UNNEST(subjects); (行番号) name subjects 1 田侭 倪郎 囜語 算数 理科 瀟䌚 ここでは UNNEST 関数を甚いおいたす。UNNEST() は配列内の党芁玠を各行に割り振った「テヌブル」を返したす。以䞋の䟋を芋おください。 SELECT * FROM UNNEST([ 1 , 2 , 3 ]); (行番号) f0_ 1 1 2 2 3 3 このように配列が UNNEST() されるず、各芁玠が1行1行に割り振られた「テヌブル圢匏」になるこずが分かりたす。先皋の WHERE 句では UNNEST() で subjects 列の䞭身を分解しおテヌブル化し、その結果の䞭に "理科" が含たれおいるかを IN 挔算子で怜査しお、TRUE ずなった行だけを返したのです。 参考 : 配列内の芁玠をテヌブル内の行に倉換する SELECT 〜 CROSS JOIN 配列型を含むテヌブルに自圚にフィルタを行うには、UNNEST() ず CROSS JOIN を䜿いこなす必芁がありたす。 䞀䟋を瀺したす。 SELECT name, unnested_subject FROM t0 CROSS JOIN UNNEST(subjects) AS unnested_subject; (行番号) name unnested_subject 1 田侭 倪郎 囜語 2 田侭 倪郎 算数 3 田侭 倪郎 理科 4 田侭 倪郎 瀟䌚 5 鈎朚 二郎 囜語 6 鈎朚 二郎 算数 䞊蚘のク゚リでは元テヌブルの党行に察しお1行ず぀「subjects を UNNEST しお返っおきたテヌブル」を CROSS JOIN しおいたす。これにより、配列が分解されお通垞の第1正芏化されたテヌブルのようになり、WHERE でフィルタできたす。 SELECT (SELECT ~ UNNEST) 以䞋のようなク゚リも甚いるこずができたす。 SELECT name, ( SELECT * FROM UNNEST(subjects) AS u WHERE u = " 理科 " ) AS subject_science FROM t0; (行番号) name subject_science 1 田侭 倪郎 理科 2 鈎朚 二郎 null SELECT 句内のサブク゚リの SELECT は、UNNEST() した subjects 列を察象ずしおおり、その結果は WHERE で "理科" だけに絞られおいたす。 subjects 列が "理科" の倀を持っおいない行は null ずしお返りたす。 ただしこの䟋は、 (SELECT * FROM UNNEST(subjects) AS u WHERE u = "理科") の結果が単䞀行だけ返る (スカラ倀である) こずが前提です。もし配列に "理科" が耇数ある堎合、 Scalar subquery produced more than one element ゚ラヌが生じおしたいたす。 䟋えば以䞋のように、デヌタが重耇しおしたっおいるテヌブルの堎合です。 (行番号) name subjects 1 田侭 倪郎 囜語 算数 理科 瀟䌚 2 鈎朚 二郎 囜語 算数 3 侉侭 侉郎 囜語 理科 理科 侉侭 䞉郎の subjects 列に理科が2行あるため、UNNEST に察する SELECT 結果が2行になっおしたい、ク゚リが倱敗したす。 このようなデヌタの䞍敎合がある可胜性に察応するには、以䞋のようにしたす。 SELECT name, ( SELECT DISTINCT * FROM UNNEST(subjects) AS u WHERE u = " 理科 " ) AS subject_science FROM t0; (行番号) name subjects 1 田侭 倪郎 理科 2 鈎朚 二郎 null 3 侉侭 侉郎 理科 DISTINCT するこずで返华結果が䞀意に絞られ、゚ラヌになりたせん。 CREATE TABLE / INSERT 順序ずしおはあべこべですが、ARRAY を持぀衚の CREATE TABLE および INSERT 文も玹介したす。 CREATE TABLE はシンプルです。ARRAY の列を ARRAY<(型名)> ずしお定矩するのみです。 CREATE TABLE `my-project.my_dataset.t0` ( name STRING, subjects ARRAY<STRING> ); INSERT 文は以䞋です。 INSERT `my-project.my_dataset.t0` VALUES ( " 鈎朚 二郎 " , [ " 囜語 " , " 算数 " ]); 䞊蚘の ["囜語", "算数"] を ARRAY["囜語", "算数"] や ARRAY<STRING>["囜語", "算数"] のように衚珟するこずもできたす (意味は倉わりたせん)。 制限 配列の配列を䜜るこずはできたせん。぀たり、以䞋のようにネストした配列は䜜れたせん。 SELECT [ " hogehoge " , [ " foo " , " bar " ]]; Cannot construct array with element type ARRAY<STRING> because nested arrays are not supported at [2:16] 䞀方で配列の䞭に、埌に玹介する STRUCT 型は入れるこずができたす。これが Google Analytics 4 の BigQuery Export 等で芋られる独特な構成です。これに぀いおは埌に解説したす。 SELECT [ STRUCT( " hoge01 " AS f1, " fuga01 " AS f2), STRUCT( " hoge02 " , " fuga02 " ) ] AS arrayed_struct; (行番号) arrayed_struct.f1 arrayed_struct.f2 1 hoge01 fuga01 hoge02 fuga02 STRUCT (構造䜓) STRUCT ずは BigQuery の STRUCT (構造䜓) 型は、構造を持った型で、䞀぀以䞊のフィヌルドを持぀こずができたす。 䟋えば以䞋の衚では、item ずいう列が STRUCT 型で、id ずいう INT64 型のフィヌルドず、name ずいう STRING 型のフィヌルドを持っおいたす。 price item.id item.name 3000 10001 T-shirt 8000 20001 jacket STRUCT はデヌタを構造的に敎理するために有甚です。 参考 : Struct type 参考 : 構造䜓リテラル サンプルテヌブル STRUCT 型を持぀テヌブルの䟋ずしお、以䞋の WITH 句を仮想的なサンプルテヌブルずしお䜿いたす。 school 列が STRUCT 型で、フィヌルドずしお year (INT64 型) ず class (STRING 型) を持っおいたす。 WITH t1 AS ( SELECT " 田侭 倪郎 " AS name, STRUCT( 1 AS year, " B " AS class) AS school UNION ALL SELECT " 鈎朚 二郎 " AS name, STRUCT( 2 AS year, " C " AS class) AS school ) SELECT * FROM t1; (行番号) name school.year school.class 1 田侭 倪郎 1 B 2 鈎朚 二郎 2 C SELECT STRUCT 型に察する SELECT は、他の通垞の型ず倧きく倉わらないため、盎感的に理解できたす。 このようなテヌブルに察するク゚リは以䞋のようになりたす。 SELECT name, school FROM t1; (行番号) name school.year school.class 1 田侭 倪郎 1 B 2 鈎朚 二郎 2 C school ずいう列名を指定するだけで、配䞋のフィヌルドの党おが遞択されたす。 以䞋のように、フィヌルド名を明瀺しお SELECT するこずも可胜です。 SELECT name, school.year FROM t1; (行番号) name year 1 田侭 倪郎 1 2 鈎朚 二郎 2 なおこの堎合、返华結果の列名はフィヌルド名だけになりたす。 SELECT 〜 WHERE ARRAY ず異なり、STRUCT 型ぞの WHERE 句の䜿甚は盎感的です。 SELECT name, school FROM t1 WHERE school.year = 1 ; (行番号) name school.year school.class 1 田侭 倪郎 1 B WHERE 句でフィヌルドに察しお条件を指定するだけで、フィルタをするこずができたす。 CREATE TABLE / INSERT STRUCT 型を持぀テヌブルの CREATE TABLE 文は、以䞋のように蚘述したす。STRUCT<(フィヌルド名) (型名), (フィヌルド名) (型名), ...> のように各フィヌルドの名前ず型を指定したす。 CREATE TABLE `my-project.my_dataset.t1` ( name STRING, school STRUCT<year INT64, class STRING> ); INSERT 文は以䞋です。 INSERT INTO `my-project.my_dataset.t1` VALUES ( " 鈎朚 二郎 " , STRUCT( 2 AS year, " C " AS class)); なお AS year AS class のようなフィヌルド名指定は省略可胜で、実は可読性を高める以倖の意味はありたせん。フィヌルド名を指定したずころで蚘茉順番が優先されたす。すなわち䞊蚘を "C" AS class, 2 AS year ず曞き換えるず、型゚ラヌになりたす。逆に、型が同じだず意図しない列に倀が入っおしたいたす。 以䞋のように簡易的に蚘述するこずもできたす。 INSERT INTO `my-project.my_dataset.t1` VALUES ( " 鈎朚 二郎 " , ( 2 , " C " )); 制限 STRUCT 型はネストするこずができたすが、最倧で15段階たでです。 ネストした STRUCT 型の䟋は以䞋です。 SELECT STRUCT( 1001 AS f_int, " hoge " AS f_string, STRUCT( " foo " AS f1, " bar " AS f2 ) AS f_struct ) AS root; (行番号) root.f_int root.f_string root.f_struct.f1 root.f_struct.f2 1 1001 hoge foo bar ARRAY<STRUCT> (ネストされた繰り返し列) ARRAY<STRUCT> ずは ARRAY<STRUCT> (ネストされた繰り返し列) ずはここたで玹介した ARRAY ず STRUCT を組み合わせたものです。 ARRAY の列の䞭に、芁玠ずしお STRUCT 型が入っおいるものです。Google Analytics 4 (Firebase) や Google Cloud の Billing Export でこの圢匏が芋られたす。 実䟋ずしおは、以䞋のようなものです。 (行番号) name classes.subject classes.teacher 1 田侭 倪郎 囜語 斉藀 侉郎 英語 䌊東 四朗 2 鈎朚 二郎 英語 䌊東 四朗 classes 列は ARRAY (配列) 型ですが、その各芁玠は subject ず teacher ずいうフィヌルドを持぀ STRUCT 型です。 参考 : テヌブル スキヌマでネストされた列ず繰り返し列を指定する サンプルテヌブル サンプルテヌブルずしお、以䞋の WITH 句を䜿っお詊しおください。 classes 列が「ネストされた繰り返し列」です。配列であり、各芁玠は subject ずいう STRING 型フィヌルドず teacher ずいう STRING 型フィヌルドを持った STRUCT です。 WITH t2 AS ( SELECT " 田侭 倪郎 " AS name, [ STRUCT( " 囜語 " AS subject, " 斉藀 侉郎 " AS teacher), STRUCT( " 英語 " AS subject, " 䌊東 四朗 " AS teacher) ] AS classes UNION ALL SELECT " 鈎朚 二郎 " AS name, [ STRUCT( " 英語 " AS subject, " 䌊東 四朗 " AS teacher) ] AS classes ) SELECT * FROM t2; (行番号) name classes.subject classes.teacher 1 田侭 倪郎 囜語 斉藀 侉郎 英語 䌊東 四朗 2 鈎朚 二郎 英語 䌊東 四朗 SELECT classes 列を指定しお SELECT するこずは可胜です。 SELECT name, classes FROM t2; しかし、以䞋のように classes 列のフィヌルドを指定しおク゚リしようずするず、゚ラヌになりたす。 SELECT name, classes.subject FROM t2; Cannot access field subject on a value with type ARRAY<STRUCT<subject STRING, teacher STRING>> at [18:11] classes は ARRAY です。classes 列の subject だけを取り出したい堎合、以䞋のように UNNEST() しおテヌブル化し、そこから subject 列だけを取り出すこずができたす。ARRAY を先頭に぀けないず、単䜓の倀 (スカラ倀) が返っおくるこずが期埅され Scalar subquery produced more than one element になっおしたうため、ARRAY() ずしお戻りが配列であるこずを明瀺したす。 SELECT name, ARRAY( SELECT subject FROM UNNEST(classes)) AS subject FROM t2; (行番号) name subject 1 田侭 倪郎 囜語 英語 2 鈎朚 二郎 英語 SELECT 〜 WHERE (゚ラヌ) WHERE を䜿ったフィルタも独特です。以䞋のク゚リぱラヌになりたす。 SELECT name, classes FROM t2 WHERE classes.subject = " 囜語 " ; Cannot access field subject on a value with type ARRAY<STRUCT<subject STRING, teacher STRING>> at [22:11] 先皋ず同じ理由で、配列である classes の䞀芁玠の subject フィヌルドにはアクセスできたせん。 ARRAY<STRUCT> をフィルタするには、次に瀺すようなク゚リを甚いたす。 SELECT 〜 CROSS JOIN 以䞋のク゚リは通りたす。 SELECT name, c.subject, c.teacher FROM t2 CROSS JOIN UNNEST(classes) AS c WHERE c.subject = " 囜語 " ; (行番号) name subject teacher 1 田侭 倪郎 囜語 斉藀 侉郎 ARRAY である classes 列を毎行 unnest しお CROSS JOIN し、第1正芏化された状態のテヌブルに WHERE でフィルタをかけおいたす。 SELECT (SELECT ~ UNNEST) 以䞋ようなク゚リもできたす。 SELECT name, ( SELECT AS STRUCT subject, teacher FROM UNNEST(classes) WHERE subject = " 囜語 " ) AS class FROM t2; (行番号) name class.subject class.teacher 1 田侭 倪郎 囜語 斉藀 侉郎 2 鈎朚 二郎 null null こちらもやっおいるこずは䌌おおり、SELECT 句の䞭のサブク゚リで毎行 classes を UNNEST しお subject ず teacher を取り出し、その結果を WHERE 句で絞っおいたす。 SELECT で指定する列は単䞀の倀 (スカラ倀) を期埅するので SELECT AS STRUCT を䜿うこずで、戻りが STRUCT であるこずを明瀺的に指瀺しおいたす。 AS STRUCT を぀けないず以䞋のような゚ラヌになりたす。 Scalar subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values at [18:3] もしくは AS STRUCT を぀けなくおも、SELECT する列が subject か teacher の䞀぀だけであれば゚ラヌになりたせん。 CREATE TABLE / INSERT ARRAY<STRUCT> の CREATE TABLE 文は以䞋のようになりたす。 CREATE TABLE `my-project.my_dataset.t2` ( name STRING, classes ARRAY< STRUCT< subject STRING, teacher STRING > > ); INSERT 文は以䞋です。 INSERT `my-project.my_dataset.t2` VALUES ( " 田侭 倪郎 " , [ STRUCT( " 囜語 " AS subject, " 斉藀 侉郎 " AS teacher ), STRUCT( " 英語 " AS subject, " 䌊東 四朗 " AS teacher ) ] ); なお通垞の STRUCT 型ず同じで AS subject AS teacher のようなフィヌルド名の指定は省略可胜で、むしろスキヌマ定矩ず同じ順番で蚘茉する必芁がありたす。 実践 : Google Analytics 4 デヌタぞのク゚リ 抂芁 Google Analytics 4 (GA4) や Firebase ではアクセス情報を BigQuery に゚クスポヌトするこずができたす。簡単な蚭定で BigQuery に定期的にデヌタを吐き出しおくれるので䟿利ですが、そのスキヌマには圓蚘事で玹介した ARRAY<STRUCT> が䜿われおおり、ク゚リの仕方が独特です。 圓項目では、GA4 の゚クスポヌトデヌタのテヌブルを暡したテヌブルに察するク゚リの方法を簡単にご玹介したす。 参考 : [GA4] BigQuery Export 参考 : [GA4] BigQuery Export スキヌマ 参考 : Firebase の BigQuery Export テヌブル䟋 以䞋のような暡擬テヌブルを甚いたす。 フィヌルド名 皮類 モヌド event_timestamp INTEGER NULLABLE event_name STRING NULLABLE event_params RECORD (=STRUCT) REPEATED (=ARRAY) ├ key STRING NULLABLE └ value RECORD (=STRUCT) NULLABLE  ├ string_value STRING NULLABLE  ├ int_value INTEGER NULLABLE  ├ float_value FLOAT NULLABLE  └ double_value FLOAT NULLABLE デヌタは以䞋のように入っおいたす。 GA4 デヌタを暡したテヌブル ク゚リ䟋1: 特定ペヌゞの PV 数を集蚈 特定ペヌゞの PV 数を蚈枬するため event_name が "page_view" で、か぀ page_location が "https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision" ずいう文字列ずなっおいるレコヌドを遞択したいずしたす。 以䞋のようにしたいずころですが、゚ラヌになりたす。 SELECT COUNT (*) AS pv FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " AND event_params.value.string_value = " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " ; Cannot access field value on a value with type ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [8:16] フィルタ察象の event_params は ARRAY であり、その芁玠である event_params.value は STRUCT 型でありそのフィヌルドの䞀぀が string_value です。どのようにク゚リすれば良いのか、頭がこんがらがっおしたいたす。 以䞋のようなク゚リが通りたす。 SELECT COUNT (*) AS pv FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " AND " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " IN ( SELECT value.string_value FROM UNNEST (event_params) WHERE key = " page_location " ) (行番号) pv 1 1 このク゚リでは、event_name 列が "page_view" の行に察し、配列である event_param 列を UNNEST しお平準化テヌブルずし、その䞭で key が "page_location" である行の value.string_value フィヌルドを IN で怜査しおいたす。 たた別案ずしお、以䞋のようなビュヌを䜜っおしたうのも手です。 SELECT event_timestamp, event_name, ( SELECT value.string_value FROM UNNEST(event_params) WHERE key = " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " ; (行番号) event_timestamp event_name page_location 1 1695781266341693 page_view https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision このように page_view むベントの page_location 倀のビュヌだけを䜜っおしたえば、あずは䞀般的な SQL でク゚リできたす。 CREATE VIEW AS でビュヌを䜜るか、䞀時的・探玢的なク゚リなら WITH 句を䜿っおも良いでしょう。 WITH unnested_view AS ( SELECT event_timestamp, event_name, ( SELECT value.string_value FROM UNNEST(event_params) WHERE key = " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " ) SELECT COUNT (*) AS pv FROM unnested_view WHERE page_location = " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " ; (行番号) pv 1 1 䞊蚘のように UNNEST しお平坊化した状態をデヌタマヌトやビュヌずしお持っおおけば、BI ツヌルや Connected Sheets からも利甚しやすくなりたす。 このように ARRAY 型や ARRAY<STRUCT> 型は、SELECT 句たたは WHERE 句のサブク゚リで UNNEST() 関数を䜿うこずで、自圚に扱うこずができたす。 ク゚リ䟋2 : string_value を取り出す関数を䜜る 前述の䟋だずサブク゚リが長く、可読性に劣りたす。UNNEST() する凊理を関数に切り出しお可読性を高めおみたす。 CREATE TEMP FUNCTION getStringValue(col ANY TYPE , col_key STRING) AS ( ( SELECT c.value.string_value FROM UNNEST(col) c WHERE c.key = col_key) ); SELECT event_timestamp, event_name, getStringValue(event_params, " page_title " ) AS page_title, getStringValue(event_params, " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` 結果は以䞋のようになりたす。 (行番号) event_timestamp event_name page_title page_location 1 1695781266341693 page_view プルリク゚ストをトリガずするCloud Runのプレビュヌ環境自動デプロむを実装しおみた - G-gen Tech Blog https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision 2 1695781266341693 first_visit プルリク゚ストをトリガずするCloud Runのプレビュヌ環境自動デプロむを実装しおみた - G-gen Tech Blog https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision スキヌマ衚蚘 抂芁 BigQuery でのスキヌマ衚蚘は「SQL 䞊の衚蚘」ず「Web コン゜ヌルや JSON 圢匏での衚蚘」が異なる堎合がありたす。 䟋えば前述の ARRAY<STRUCT> は「タむプが RECORD でモヌドが REPEATED」のように衚珟されたす。 参考 : スキヌマの指定 以䞋に参考情報ずしお蚘茉したす。 ARRAY BigQuery コン゜ヌル䞊や JSON 圢匏でのスキヌマ衚珟では、ここたで扱ったような ARRAY は以䞋のように「皮類が (配列内のデヌタの型名) でモヌドが REPEATED 」ずしお衚珟されたす。 配列は「モヌド」が REPEATED になっおいる { 〜略〜 " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " mode ": " REPEATED ", " name ": " subjects ", " type ": " STRING " } ] } , 〜略〜 } STRUCT BigQuery コン゜ヌル䞊や JSON 圢匏でのスキヌマ衚珟では、STRUCT は以䞋のように「皮類が RECORD でモヌドが NULLABLE/REQUIRED」ずしお衚珟されたす。 STRUCT は RECORD ずいう皮類ずしお衚蚘 { 〜略〜 " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " fields ": [ { " name ": " year ", " type ": " INTEGER " } , { " name ": " class ", " type ": " STRING " } ] , " name ": " school ", " type ": " RECORD " } ] } , 〜略〜 } ARRAY<STRUCT> BigQuery コン゜ヌル䞊や JSON 圢匏でのスキヌマ衚珟では、 ARRAY<STRUCT> は以䞋のように「皮類が RECORD でモヌドが REPEATED 」ずしお衚珟されたす。RECORD は STRUCT ず、REPEATED は ARRAY ず同矩です。 「皮類」が RECORD (=STRUCT)、「モヌド」が REPEATED (=ARRAY) JSON では以䞋のようになりたす。 { 〜略〜 " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " fields ": [ { " name ": " subject ", " type ": " STRING " } , { " name ": " teacher ", " type ": " STRING " } ] , " mode ": " REPEATED ", " name ": " classes ", " type ": " RECORD " } ] } , 〜略〜 } 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。X (旧 Twitter) では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
圓蚘事では Google Cloud旧称 GCPで「ドメむン別の ID の制限」の組織ポリシヌ適甚䞋で Cloud Run サヌビスを䞀般公開する方法を玹介したす。 前提知識 「ドメむン別の ID の制限」の組織ポリシヌ Cloud Run ぀のアクセス制埡レむダヌ サヌビスを䞀般公開する方法 泚意点 タグがサポヌトされおいるサヌビス Config Controller は未察応 Cloud Run サヌビスの䞀般公開 アヌキテクチャ 前提 暩限 蚭定手順 組織管理者「ドメむン別の ID の制限」の条件付き組織ポリシヌを適甚 組織管理者タグキヌずタグ倀を䜜成 プロゞェクト管理者Cloud Run の䜜成 組織管理者Cloud Run にタグバむンディング プロゞェクト管理者Cloud Run に allUsers 蚱可 ゚ラヌ䟋 前提知識 「ドメむン別の ID の制限」の組織ポリシヌ Google Cloud には、組織やフォルダ、プロゞェクトに察しお統制を効かせるための 組織ポリシヌ 機胜がありたす。 組織ポリシヌの制玄の぀に ドメむン別の ID の制限  constraints/iam.allowedPolicyMemberDomains があり、これは誀っおたたは悪意を持っお自組織以倖の Google アカりントが IAM 暩限を持たないようにする制玄です。「ドメむンで制限された共有」ず衚蚘される堎合も有り 以䞋のように、蚱可する Google Workspace お客様 ID たたは Google Cloud の組織リ゜ヌス ID を指定したす。 ドメむン別の ID の制限 リ゜ヌスに特定のタグが付䞎されおいる堎合は組織ポリシヌの制玄を適甚しない、ずいう条件を含めた蚭定もできたす。圓蚘事では条件が蚭定された組織ポリシヌを 条件付き組織ポリシヌ ず衚蚘したす。 参考 タグを䜿甚した組織のポリシヌの蚭定 タグに぀いおは以䞋の蚘事をご参照ください。 blog.g-gen.co.jp Cloud Run ぀のアクセス制埡レむダヌ Cloud Run には぀のアクセス制埡レむダヌがありたす。 Cloud Run サヌビスに到達するには、Ingress ず IAM の䞡方で蚱可されおいる必芁がありたす。 Cloud Run のアクセス制埡レむダヌ レむダヌ名 仕様 Ingress ・ 通信元 に基づいおリク゚ストをフィルタリング ( ネットワヌク的な制埡 ) ・通信元が蚭定された、内郚もしくはすべおの堎合に蚱可される ・組織ポリシヌ「 蚱可される䞊り 」 constraints/run.allowedIngress で制埡可胜 IAM ・ 送信者 に基づいおリク゚ストをフィルタリング ( 認蚌・認可的な制埡 ) ・送信者に Cloud Run 起動元ロヌル roles/run.invoker が付䞎されおいるず蚱可される ・組織ポリシヌ「ドメむン別の ID の制限」で制埡可胜 Cloud Run でサヌビスを䞀般公開する堎合、Cloud Run 起動元ロヌル roles/run.invoker を allUsers に割り圓おる必芁がありたす。 しかし、前述の「ドメむン別の ID の制限」の組織ポリシヌの適甚䞋では allUsers に IAM ロヌルを付䞎できたせん。 参考 ドメむンで制限された共有 サヌビスを䞀般公開する方法 「ドメむン別の ID の制限」の組織ポリシヌの適甚䞋で Cloud Run サヌビスを䞀般公開぀たり allUsers に Cloud Run 起動元ロヌルを付䞎する方法ずしお、以䞋の2぀がありたす。 「ドメむン別の ID の制限」の組織ポリシヌを䞀時的に削陀する タグず条件付き組織ポリシヌを䜿う 方法1の堎合、以䞋のようなフロヌずなりたす。 䞀時的に「ドメむン別の ID の制限」の組織ポリシヌを削陀 → Cloud Run を 未認蚌の呌び出しを蚱可 にしデプロむ allUsers に Cloud Run 起動元ロヌルが割圓たる → 「ドメむン別の ID の制限」の組織ポリシヌを適甚 䜆し、組織ポリシヌを削陀するこずは䞀時的ずは蚀えセキュリティリスクが高たるための方法が掚奚されたす。 圓蚘事では、タグず条件付き組織ポリシヌを䜿うこずで「ドメむン別の ID の制限」の組織ポリシヌ適甚䞋でも Cloud Run サヌビスを䞀般公開する方法を玹介したす。 泚意点 タグがサポヌトされおいるサヌビス タグがサポヌトされおいるリ゜ヌスは ドキュメント に蚘茉の通りです。 2023 幎 10 月執筆時点では、 Cloud Functions はサポヌトされおいたせん 。 䜆し、Cloud Functions 第䞖代や Cloud Functions for Firebase 第䞖代は Cloud Run 䞊で起動するため、圓蚘事で玹介する方法でサヌビスを䞀般公開できたす。 Config Controller は未察応 条件付き組織ポリシヌを䜿うには、Organization Policy API V2 が必芁です。 しかし 2023 幎 10 月執筆時点では、Config Controller では Cloud Resource Manager API V1 のみの察応ずなっおいるため、条件付き組織ポリシヌは䜿えたせん。 他の IaC ツヌルずしおよく䜿われる Terraform では google_org_policy_policy で条件付き組織ポリシヌが䜿えたす。 Cloud Run サヌビスの䞀般公開 アヌキテクチャ タグず条件付き組織ポリシヌを適甚した際のアヌキテクチャは以䞋の通りです。 アヌキテクチャ 前提 Google Cloud を䌁業で利甚する堎合、「組織の管理者」ず「各プロゞェクトでリ゜ヌスを管理するナヌザヌ」は異なる堎合が倚く、たた必芁な暩限も異なりたす。 埌述の蚭定手順では実際に䌁業で䜿う堎合を想定し、組織の管理者が行う䜜業ずプロゞェクトの管理者が行う䜜業を項目の箇所に蚘茉しおいたす。 暩限 本構成で組織の管理者に必芁な組織レベルのロヌルは以䞋の通りです。 組織ポリシヌを蚭定組織ポリシヌ管理者 roles/orgpolicy.policyAdmin  タグの䜜成タグ管理者 roles/resourcemanager.tagAdmin  タグをリ゜ヌスにバむンディングタグナヌザヌ roles/resourcemanager.tagUser  蚭定手順 組織管理者「ドメむン別の ID の制限」の条件付き組織ポリシヌを適甚 ここでは Cloud Shell で実行したす。コン゜ヌルからでも蚭定可胜です。 drs-policy.yaml ファむルを䜜成したすファむル名は任意。 ORGANIZATION_ID ず DIRECTORY_CUSTOMER_ID は眮き換えおください。 # drs-policy.yaml name : organizations/ORGANIZATION_ID/policies/iam.allowedPolicyMemberDomains spec : rules : - values : allowedValues : - DIRECTORY_CUSTOMER_ID - allowAll : true condition : expression : resource.matchTag("ORGANIZATION_ID/allUsersIngress", "True" ) title : allowAllUsersIngress drs-policy.yaml ファむルを保存し、適甚したす。 $ gcloud org-policies set-policy drs-policy.yaml これによっお、タグキヌ allUsersIngress の倀が True のタグがバむンディングされおいるリ゜ヌスに察しお「ドメむン別の ID の制限」で蚱可されおいるドメむンに関わらず、IAM ロヌルを付䞎できるようになりたす。 適甚埌、以䞋のように allowedValues で定矩した Google Workspace お客様 ID ずタグの条件匏が蚭定されおいたす。 適甚埌の組織ポリシヌ 組織管理者タグキヌずタグ倀を䜜成 タグキヌ ( allUsersIngress ) を䜜成したす。 $ gcloud resource-manager tags keys create allUsersIngress \ --parent=organizations/ORGANIZATION_ID 以䞋のようにタグキヌが䜜成されたす。 䜜成されたタグキヌ 䜜成したタグキヌにタグ倀 True を远加したす。TAGKEY_ID は䜜成したタグキヌ ID (䟋: tagKeys/123456 ) に眮き換えおください。 $ gcloud resource-manager tags values create True \ --parent=TAGKEY_ID \ --description="Allow for allUsers for internal Cloud Run services" 以䞋のようにタグ倀が远加されたす。 远加されたタグ倀 参考 タグの䜜成ず管理 プロゞェクト管理者Cloud Run の䜜成 ここではむメヌゞにサンプルコンテナを䜿い、初回は 認蚌が必芁 でデプロむしたす。 サヌビスの䜜成画面 ここで、 未認蚌の呌び出しを蚱可 でデプロむするず以䞋の゚ラヌが衚瀺されたす。 サヌビスが䜜成されたしたが、䞀般アクセスできない可胜性がありたす。リ゜ヌス「projects/xxxx/locations/asia-northeast1/services/hello」に察しお IAM ポリシヌを蚭定できたせんでした。ロヌル「roles/run.invoker」を次のプリンシパルに割り圓おるこずができたせんでした: allUsers。詳现: One or more users named in the policy do not belong to a permitted customer, perhaps due to an organization policy. デプロむ時の゚ラヌ画面 サヌビス URL の゚ラヌ画面 組織管理者Cloud Run にタグバむンディング 䜜成した Cloud Run にタグをバむンディングしたす。 TAGVALUE_ID は远加したタグ倀䟋 tagValues/1234567890 に眮き換えおください。 $ gcloud resource-manager tags bindings create \ --tag-value=TAGVALUE_ID \ --parent=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SERVICE_NAME \ --location=REGION タグバむンディングをするず、コン゜ヌルから以䞋のように衚瀺されたす。 タグバむンディング埌の Cloud Run プロゞェクト管理者Cloud Run に allUsers 蚱可 最埌に、 未認蚌の呌び出しを蚱可 ずするため allUsers に Cloud Run 起動元ロヌルを付䞎したす。 $ gcloud run services add-iam-policy-binding SERVICE_NAME \ --region=REGION \ --member="allUsers" \ --role="roles/run.invoker" コン゜ヌルから確認するず、以䞋のように未認蚌の呌び出しが蚱可されおいたす。 未認蚌の呌び出しが蚱可された Cloud Run サヌビス URL ぞ問題なくアクセスできたす。 サヌビス画面 ゚ラヌ䟋 「ドメむン別の ID の制限」の組織ポリシヌ適甚䞋で、蚱可されおいないドメむンのナヌザヌぞ IAM ロヌルを付䞎しようずするず以䞋の゚ラヌずなりたす。 IAM ポリシヌの曎新に倱敗したした ドメむン制限の組織ポリシヌがありたす。ポリシヌでプリンシパルずしお远加できるのは、蚱可されたドメむンのプリンシパルのみです。プリンシパルのメヌルアドレスを修正しお、もう䞀床お詊しください。 ゚ラヌ画面 G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の䜐々朚です。圓蚘事では Cloud Run で Cloud Storage FUSE を䜿甚しお、オブゞェクトストレヌゞである Cloud Storage のバケットをコンテナ内のディレクトリにマりントしおみたす。 前提知識 Cloud Run ずは Cloud StorageGCSずは Cloud Storage FUSE に぀いお Cloud Storage FUSE ずは 制限事項 料金 ネむティブ機胜によるマりント 考慮事項 Cloud Run 実行環境 マルチプロセス化による PID 1 問題ぞの察凊 Cloud Run で Cloud Storage FUSE を䜿甚しおみる 構成図 Cloud Storage バケットの䜜成 Artifact Registry リポゞトリの䜜成 䜿甚するコヌド main.go gcsfuse_run.sh Dockerfile コンテナむメヌゞのビルド・プッシュ Cloud Run サヌビスのデプロむ 動䜜確認 前提知識 Cloud Run ずは Cloud Run は Google Cloud のマネヌゞドなコンテナ実行環境を䜿甚しおアプリケヌションを実行するこずができるサヌバレス コンテナコンピュヌティング サヌビスです。 HTTP リク゚ストを凊理のトリガヌずする Cloud Run services ず、手動もしくはスケゞュヌル、ワヌクフロヌをトリガヌずする Cloud Run jobs の 2皮類がありたす。 それぞれ以䞋の蚘事で詳现を解説しおいたす。 blog.g-gen.co.jp blog.g-gen.co.jp Cloud StorageGCSずは Cloud Storage は容量無制限のオブゞェクトストレヌゞサヌビスであり、99.999999999% (むレブンナむン) の堅牢性を持぀オブゞェクトストレヌゞを安䟡に利甚するこずができたす。 Cloud Storage の詳现は以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp Cloud Storage FUSE に぀いお Cloud Storage FUSE ずは Cloud Storage FUSE は Cloud Storage バケットをロヌカルファむルシステムずしおマりントしおアクセスできるようにする FUSE (Filesystem in Userspace) アダプタであり、Google がサポヌトするオヌプン゜ヌスのプロダクトです。これを䜿甚するこずで、アプリケヌションから通垞のファむルシステム同様にバケット内のオブゞェクトを読み曞きするこずができるようになりたす。 Cloud Storage FUSE は、Cloud Storage バケットに栌玍されたオブゞェクトの名前をファむルずディレクトリに倉換したす。オブゞェクトの名前に含たれおいるスラッシュ/をディレクトリの区切りずするこずで、仮想的なディレクトリ構成を䜿甚しおアプリケヌションからファむルにアクセスできるようにしたす以䞋の䟋を参照。 これにより、アプリケヌションは Cloud Storage の無制限のストレヌゞをファむルシステムず同様に利甚するこずができたす。 # Cloud Storage バケットの状態 bucket ├ aaa/aaa-0.txt ├ aaa/aaa-1.txt ├ bbb/bbb-0.txt └ bbb/bbb-1.txt # アプリケヌションからの芋え方 bucket/ ├ aaa/ │ ├ aaa-0.txt │ └ aaa-1.txt └ bbb/  ├ bbb-0.txt  └ bbb-1.txt 参考 : Cloud Storage FUSE 制限事項 Cloud Storage FUSE によっおマりントされるファむルシステムの制限事項をいく぀か蚘茉したす。 その他の制限事項に぀いおは ドキュメント をご䞀読ください。 Cloud Storage FUSE は POSIX に準拠しおいたせん。POSIX 準拠のファむルシステムずしおは、Google Cloud からは Filestore が提䟛されおいたす。 Cloud Storage FUSE が Cloud Storage にファむルをアップロヌドする際、 オブゞェクトのメタデヌタ を蚭定するこずはできたせん。メタデヌタを蚭定する必芁がある堎合は、コン゜ヌルや CLI、API を䜿甚しお Cloud Stroage にオブゞェクトを盎接アップロヌドしたす。 Cloud Storage FUSE を䜿甚しお同じファむルに察しお同時に耇数の曞き蟌みを行った堎合、最埌の曞き蟌みだけが有効ずなり、それ以前の曞き蟌みはすべお倱われたす同時実行制埡ができない。 Cloud Storage FUSE ではハヌドリンクを䜿甚するこずができたせん。 マりントされたファむルシステムぞのアクセスには Cloud Storage バケットのアクセス暩 roles/storage.objectUser などが必芁ずなりたす。 料金 Cloud Storage FUSE は無料で利甚できたすが、これを利甚するこずによっお Cloud Storage バケットに保存されるオブゞェクトやネットワヌク I/O は、通垞の Cloud Storage の利甚料ずしお料金が発生したす。 参考 : Cloud Storage FUSE - Cloud Storage FUSE の料金 参考 : Cloud Storage pricing ネむティブ機胜によるマりント アップデヌトにより、FUSE の蚭定を意識するこずなく Cloud Storage バケットをマりントできるようになったため、基本的にはこちらを䜿甚するこずを掚奚したす。 ネむティブ機胜によるマりント方法に぀いおは以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp 考慮事項 Cloud Run 実行環境 Cloud Storage FUSE は Cloud Run services、Cloud Run jobs の䞡方で䜿甚できたす。 Cloud Run services では第1䞖代ず第2䞖代の 実行環境 がありCloud Run jobs は第2䞖代のみ、ネットワヌクファむルシステムがサポヌトされるのは第2䞖代のみずなっおいたす。 そのため、Cloud Storage FUSE を䜿甚する堎合は第2䞖代の Cloud Run を䜿甚したす。 マルチプロセス化による PID 1 問題ぞの察凊 通垞、コンテナでは単䞀のプロセスアプリケヌションが実行されたすが、Cloud Storage FUSE を䜿甚する堎合、アプリケヌションのほかにファむルシステムぞのマりントプロセスが実行されたす。このようなマルチプロセスのコンテナでは、コンテナの゚ントリポむントずしお実行されるアプリケヌションに PID 1が割り圓おられるこずで、その他のプロセスここではファむルシステムぞのマりントの終了凊理が適切に行われない問題 PID 1問題 が発生しおしたいたす。 この問題を適切に凊理するために、コンテナの゚ントリポむントずしお耇数のプロセスを管理するプロセスマネヌゞャヌを実行し、そこからアプリケヌションやファむルシステムのマりントプロセスを実行したす。 このブログでは公匏ドキュメントの チュヌトリアル に埓い、プロセスマネヌゞャヌずしお Tini を䜿甚するコンテナを䜜成しおいきたす。 PID 1 問題に぀いおは以䞋の蚘事でわかりやすく解説されおいたす。 参考 : コンテナ内で倧量のゟンビプロセスが発生しおいた話 ※倖郚ブログ Cloud Run で Cloud Storage FUSE を䜿甚しおみる 基本的には 公匏ドキュメントのチュヌトリアル に埓っお進めおいきたす。チュヌトリアルには Node.js、Python、Java のアプリケヌションの䟋がありたすが、圓ブログでは Go を䜿甚しおいきたす。 構成図 圓蚘事では、Cloud Run にデプロむするコンテナに /mnt/gcs/ ディレクトリを䜜成し、Cloud Storage FUSE を䜿甚しお Cloud Storage バケットをマりントしたす。 Cloud Run で Cloud Storage FUSE を䜿甚する Cloud Storage バケットの䜜成 ファむルシステムずしお䜿甚する Cloud Storage バケットを䜜成したす。 バケット名はグロヌバルに䞀意の倀を指定する必芁がありたす。 # Cloud Storage バケットを䜜成する $ gcloud storage buckets create gs://mybucket --location asia-northeast1 Artifact Registry リポゞトリの䜜成 Cloud Run にデプロむするコンテナむメヌゞを栌玍するための Artifact Registry リポゞトリを䜜成したす。 # Artifact Registry リポゞトリを䜜成する $ gcloud artifacts repositories create myrepo \ --repository-format = docker \ --location = asia-northeast1 䜿甚するコヌド main.go Cloud Storage バケットをマりントしたディレクトリからテキストファむルを読み取り、ブラりザに衚瀺するだけの簡単な Web アプリケヌションを䜜成したす。 package main import ( "fmt" "log" "net/http" "os" ) func readGCS() ( string , error ) { // Cloud Storage FUSE をマりントしたディレクトリからテキストファむルを読み取る f, err := os.Open( "/mnt/gcs/" + "test.txt" ) if err != nil { return "" , err } defer f.Close() text := make ([] byte , 1024 ) count, err := f.Read(text) if err != nil { return "" , err } return string (text[:count]), nil } func readGCSHandler(w http.ResponseWriter, r *http.Request) { text, err := readGCS() if err != nil { log.Print(err) http.Error(w, err.Error(), 500 ) } else { // 読み取ったテキストファむルの䞭身を衚瀺 fmt.Fprintf(w, "%s" , text) } } func main() { log.Print( "starting server..." ) http.HandleFunc( "/" , readGCSHandler) port := os.Getenv( "PORT" ) if port == "" { port = "8080" log.Printf( "defaulting to port %s" , port) } log.Printf( "listening on port %s" , port) if err := http.ListenAndServe( ":" +port, nil ); err != nil { log.Fatal(err) } } gcsfuse_run.sh Cloud Storage FUSE を䜿甚しおコンテナむンスタンスに Cloud Storage バケットをマりントしたあず、アプリケヌションを実行するスクリプトです。 マりント察象の /mnt/gcs/ ディレクトリもここで䜜成しおいたす。 #!/usr/bin/env bash set -eo pipefail # コンテナむンスタンスに Cloud Storage バケットをマりントするディレクトリを䜜成 mkdir -p $MNT_DIR # Cloud Storage FUSE を䜿甚しおバケットをマりント echo " Mounting GCS Fuse. " gcsfuse --debug_gcs --debug_fuse $BUCKET $MNT_DIR echo " Mounting completed. " # Web アプリケヌションの実行 /app/main Dockerfile Dockerfile ではアプリケヌションの資材の配眮のほか、Cloud Storage FUSE ず Tini をむンストヌルしおいたす。 先述の PID 1 問題に察凊するため、Tini を䜿甚しおマりントずアプリケヌション、それぞれのプロセスを実行、管理するようにしたす。 FROM golang:1.21 WORKDIR /app # tini、gcsfuse をむンストヌル RUN set -e ; \ apt-get update -y && apt-get install -y \ tini \ lsb-release ; \ gcsFuseRepo =gcsfuse- `lsb_release -c -s` ; \ echo " deb http://packages.cloud.google.com/apt $gcsFuseRepo main " | \ tee /etc/apt/sources.list.d/gcsfuse.list ; \ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ apt-key add - ; \ apt-get update ; \ apt-get install -y gcsfuse \ && apt-get clean COPY main.go gcsfuse_run.sh ./ RUN go build -o main /app/main.go RUN chmod +x /app/gcsfuse_run.sh # Cloud Storage バケットをマりントするディレクトリをコンテナの環境倉数に蚭定 ENV MNT_DIR /mnt/gcs # コンテナ実行時に Tini を実行 # https://github.com/krallin/tini ENTRYPOINT [ " /usr/bin/tini ", " -- " ] # ENTRYPOINT である Tini の匕数ずしおスタヌトアップスクリプトgcsfuse_run.shを指定 CMD [ " /app/gcsfuse_run.sh " ] コンテナむメヌゞのビルド・プッシュ Cloud Build を䜿甚しおコンテナむメヌゞをビルドし、Artifact Registry のリポゞトリにプッシュしたす。 # Cloud Build を䜿甚しおコンテナむメヌゞをビルド、プッシュする $ gcloud builds submit --region asia-northeast1 --tag asia-northeast1-docker.pkg.dev/myproject/myrepo/run-fuse Cloud Run サヌビスのデプロむ ビルドしたコンテナむメヌゞを䜿甚しお Cloud Run サヌビスを䜜成したす。 第 2䞖代の実行環境を䜿甚するために --execution-environment で gen2 を指定しおいたす。 環境倉数ずしお Cloud Storage のバケット名を指定したす。この倉数はコンテナむンスタンスが立ち䞊がっお gcsfuse_run.sh が実行された際、バケットをマりントするために䜿甚されたす。 # Cloud Run サヌビスをデプロむする $ gcloud run deploy run-fuse \ --image asia-northeast1-docker.pkg.dev/myproject/myrepo/run-fuse \ --execution-environment gen2 \ --region asia-northeast1 \ --allow-unauthenticated \ --set-env-vars BUCKET =mybucket 動䜜確認 Cloud Run 䞊のアプリケヌションが、コンテナむンスタンスのディレクトリにマりントされた Cloud Stroage バケットにあるファむルを読み蟌むこずができるか確認したす。 以䞋の内容のテキストファむル test.txt を Cloud Storage FUSE に蚭定したバケットに配眮したす。 Hello, FUSE! 以䞋のコマンドを䜿甚しおファむルをアップロヌドしたす。 # Cloud Storage バケットに test.txt をアップロヌドする $ gcloud storage cp test .txt gs://mybucket Cloud Run サヌビスの URL にアクセスするず、 test.txt の内容がブラりザに衚瀺されたす。 Cloud Storage にアップロヌドしたファむルの内容が衚瀺される 䜐々朚 駿倪 (蚘事䞀芧) G-gen最北端、北海道圚䜏のクラりド゜リュヌション郚゚ンゞニア 2022幎6月にG-genにゞョむン。Google Cloud Partner Top Engineer 2025 Fellowに遞出。奜きなGoogle CloudプロダクトはCloud Run。 趣味はコヌヒヌ、小説SF、ミステリ、カラオケなど。 Follow @sasashun0805
圓蚘事では、Google Cloud Next '23 で発衚された BigQuery DataFrames を解説したす。BigQuery 䞊のデヌタを、pandas ラむクな、たた scikit-learn ラむクなむンタヌフェむスで操䜜できるラむブラリです。 BigQuery DataFrames 抂芁 bigframes.pandas 抂芁 仕組み bigframes.ml 抂芁 自動前凊理 抂芁 特城の自動倉換 欠損デヌタの補完 制限事項 䜿っおみる やるこず 環境構築 初期蚭定 パッケヌゞのむンストヌル BigQuery セッションの蚭定 デヌタのロヌド 前凊理 特城の倉換 欠損倀の察応 デヌタ分割 モデルトレヌニング 掚論 モデル評䟡 モデルの保存 クリヌンアップ 抂芁 BigQuery DataFrames ずは、BigQuery API を介したデヌタの倉換や機械孊習を容易に行える Python のオヌプン゜ヌスパッケヌゞです。 BigQuery DataFrames では、以䞋の 2 ぀の機胜を提䟛したす。 bigframes.pandas bigframes.ml 通垞、機械孊習モデルを構築する際、以䞋のようなフロヌが発生したす。 BigQuery DataFrames を甚いた機械孊習モデル䜜成フロヌ BigQuery DataFrames を甚いるず、BigQuery 䞊のデヌタを pandas のような操䜜感で凊理ができ、scikit-learn のような操䜜感でモデルトレヌニングず評䟡、予枬が行えたす。 たた、デヌタの凊理ず保管を BigQuery 䞊で管理できるため、クラむアントのマシンスペックやメモリ容量を気にせず開発ができたす。 尚、BigQuery DataFrames は 2023 幎 10 月珟圚プレビュヌ機胜ずなりたす。 参考 : BigQuery DataFrames Python API 参考 : BigQuery DataFrames クむックスタヌト bigframes.pandas 抂芁 bigframes.pandas では、BigQuery 䞊のデヌタを pandas ラむクに凊理できたす。䞀次元デヌタを栌玍する Series クラスや、二次元デヌタを栌玍する DataFrame クラスが甚意されおおり、pandas でデヌタ凊理を行うメ゜ッドもほずんど甚意されおいたす。 仕組み bigframes.pandas の実態は、BigQuery API が裏偎で実行されおおり、各メ゜ッドを実行するず BigQuery にゞョブを発行しお BigQuery のコンピュヌティングリ゜ヌスで凊理し、たたデヌタも BigQuery に保持したす。぀たり、クラむアントのマシンスペックやメモリ容量を気にせず開発ができたす。 䟋えば、サむズが玄 60GB ある Wikipedia のペヌゞビュヌが栌玍された BigQuery サンプルテヌブルを bigframes.pandas で凊理しおみたいず思いたす。 # input[0] df_sample = bqd.read_gbq( "bigquery-samples.wikipedia_pageviews.200809h" ) df_sample.head( 3 ) output[0] Open Job をクリックするず、実行された SQL を確認できたす。 ゞョブを確認 たた、䞊蚘セルの実行前埌で、クラむアント偎のメモリ䜿甚量にはほずんど圱響しおいないこずから、60GB のデヌタはクラむアント偎に保存されおいないこずがわかりたす。 リ゜ヌス䜿甚状況 デヌタをクラむアントマシンにダりンロヌドしたいずきは、 to_pandas メ゜ッドを甚いるこずでデヌタのダりンロヌドも可胜です。 参考 Package pandas bigframes.ml 抂芁 bigframes.ml では、BigQuery ML API を scikit-learn ラむクに操䜜するこずができたす。 䟋えば、ほずんどのモデルに共通しお以䞋のメ゜ッドが甚意されおいたす。 fit : モデルトレヌニング predict : 掚論 score : モデル評䟡 サポヌトされおいるモデルも、回垰や分類、クラスタリングや次元削枛ずいった基本的な機械孊習モデルはもちろん、 Vertex AI PaLM API を利甚した LLM モデルもサポヌトされおいたす。 さらに、トレヌニング埌のモデルを to_gbq メ゜ッドで BigQuery に保存するこずもできたす。 参考 Train models 自動前凊理 抂芁 bigframes.ml では、 BigQuery ML を甚いおモデルトレヌニングが行われるため、BigQuery ML の暙準機胜である 特城量の自動前凊理 を理解しおおく必芁がありたす。 自動前凊理の䞻な機胜は以䞋の通りです。 特城の自動倉換 欠損デヌタの自動補完 たた、 Preprocessing モゞュヌルを甚いるこずで、ナヌザヌが手動でデヌタの前凊理を行うこずも可胜です。 特城の自動倉換 入力された特城量は次のように自動倉換されたす。 No 入力デヌタの型 倉換方法 説明 1 INT64, NUMERIC, BIGNUMERIC, FLOAT64 暙準化 各特城量の最倧ず最小の幅が倧きいず、特城量をそのたた比范するこずが困難になるため、暙準化を行うこずで「平均倀を 0 、暙準偏差を 1」にしお各特城量のスケヌルを合わせる。 2 BOOL, STRING, BYTES, DATE, DATETIME, TIME one-hot encoding 数倀や配列、TIMESTAMP 以倖のデヌタ型では、ダミヌ倉数甚いお数倀化したす。 その他の入力デヌタ型は以䞋の公匏ドキュメントをご参照䞋さい。 参考 Feature transformations 欠損デヌタの補完 欠損デヌタ (NULL) がある際、列の型によっお以䞋のように倀が補完されたす。 No 列の型 補完方法 1 Numeric 数倀列の NULL 倀は、元の入力列の平均倀に眮換したす 2 One-hot/Multi-hot encoded 新芏のカテゎリずしお扱われたす。぀たり、NULL 倀を持぀デヌタは、新しいカテゎリずしおone-hot/Multi-hot encoding されたす その他の列の型は以䞋の公匏ドキュメントをご参照䞋さい。 参考 Missing data imputation 制限事項 基本的には、 BigQuery の割り圓おず制限 に埓いたすが、他にも以䞋のような制限事項がありたす。 BigQuery セッション で指定しおいるロケヌションず read_gbq / read_gbq_table / read_gbq_query で読み蟌むデヌタセットのロケヌションは同じである必芁がありたす。 bigframes.ml では、モデルトレヌニングのサポヌトはロケヌションによっお異なりたす。詳现は BigQuery ML のロケヌション をご芧ください。 䜿っおみる やるこず BigQuery DataFrames を甚いお、機械孊習モデルを構築したす。 扱うデヌタは、BigQuery 公開デヌタセットにある penguin テヌブル を䜿甚しお、ペンギンの皮類、居䜏島、くちばしの長さず深さ、足ひれの長さ、性別に基づいおペンギンの䜓重を予枬する線圢回垰モデルを䜜成したす。 penguin テヌブルのスキヌマ情報は以䞋のずおりです。 No フィヌルド 型 モヌド 説明 1 species STRING REQUIRED ペンギンの皮類 2 island STRING NULLABLE 居䜏島 3 culmen_length_mm FLOAT NULLABLE くちばしの長さ 4 culmen_depth_mm FLOAT NULLABLE くちばしの深さ 5 flipper_length_mm FLOAT NULLABLE 足ひれの長さ 6 body_mass_g FLOAT NULLABLE 䜓重 7 sex STRING NULLABLE 性別 環境構築 圓蚘事では、Notebook 環境に Colab Enterprise を甚いたす。 Colab Enterprise を䜿甚するず、むンフラストラクチャを管理せずに Notebook で䜜業できたす。 Colab Enterprise の Notebook 䜜成方法は公匏ドキュメントのクむックスタヌトをご参考䞋さい。 cloud.google.com 初期蚭定 パッケヌゞのむンストヌル Notebook で䜿うパッケヌゞをむンストヌルしたす。 # input[1] !pip install bigframes BigQuery セッションの蚭定 プロゞェクト ID をご自身の倀に曞き換えお実行したす。 # input[2] import bigframes.pandas as bpd PROJECT_ID = ${プロゞェクト ID} REGION = "US" bpd.options.bigquery.project = PROJECT_ID bpd.options.bigquery.location = REGION デヌタのロヌド bigframes.pandas では、pandas ず同様に csv や json を読み蟌むメ゜ッドもありたすが、BigQuery 䞊のデヌタを読み蟌む read_gbq メ゜ッドが甚意されおいたす。 今回は read_gbq メ゜ッドを利甚したす。 # input[3] df = bpd.read_gbq( "bigquery-public-data.ml_datasets.penguins" ) df.head( 3 ) output[3] read_gbq の匕数にテヌブル ID を入力しおデヌタを取埗したしたが、BigQuery に察しお SQL を実行しお出力結果をデヌタフレヌムで取埗するこずも可胜です。 # input[4] query_df = bpd.read_gbq( """ SELECT species, AVG(body_mass_g) as avg_body_mass_g FROM `bigquery-public-data.ml_datasets.penguins` GROUP BY species """ ) query_df output[4] 参考 bigframes.pandas - API リファレンス 前凊理 特城の倉換 各カラムのデヌタ型を確認したす。 # input[5] df.dtypes output[5] string ず Float64 の 2 皮類のデヌタ型が存圚したす。 BigQuery ML の自動前凊理 (特城の倉換) により、string 型の堎合は one-hot encoding され、Float64 型の堎合は 暙準化 されるため、ここでは䜕も手を加えないこずにしたす。 欠損倀の察応 各カラムの欠損倀の個数を確認したす。 # input[6] df.isnull().sum() output[6] BigQuery ML の自動前凊理 (欠損デヌタの補完) では、string 型の堎合は NULL が新芏のカテゎリずなり、Float64 型の堎合は元の入力列の平均倀ずなりたす。 ここで、党䜓の行数も確認したす。 # input[7] df.shape output[7] 党デヌタ数は 344 であり、sex の欠損倀は 10 であり党䜓の 3% ずなりたす。 sex 列で、「FEMALE」ず「MALE」以倖の新芏カテゎリが远加されるずノむズになる可胜性があり、たた欠損倀は党䜓の 3% 匱のため、sex 列で NULL ずなる行を削陀したいず思いたす。 # input[8] df2 = df[df[ "sex" ].notna()] # input[9] df2.isnull().sum() output[9] sex の欠損倀が含たれる行を削陀した結果、他の列にあった欠損倀も無くなっおいるこずから、欠損倀は削陀した行の䞭にすべお含たれおいたこずになりたす。 # input[10] df2.shape output[10] デヌタ分割 特城列 (入力) ず正解デヌタ列 (出力) に分割したす。 # input[11] x = df2[[ "species" , "island" , "culmen_length_mm" , "culmen_depth_mm" , "flipper_length_mm" , "sex" ]] y = df2[[ "body_mass_g" ]] トレヌニングデヌタずテストデヌタにデヌタを分割したす。 scikit-learn でもよく䜿われる train_test_split が bigframes.ml にも甚意されおいるためこちらを䜿いたす。 # input[12] from bigframes.ml.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.1 , random_state= 0 ) # input[13] print (f "x_train : {x_train.shape}" ) print (f "x_test : {x_test.shape}" ) print (f "y_train : {y_train.shape}" ) print (f "y_test : {y_test.shape}" ) output[13] 参考 Module model_selection モデルトレヌニング bigframes.ml を甚いお線圢回垰モデルを構築したす。 # input[14] from bigframes.ml.linear_model import LinearRegression # モデルの初期化 model = LinearRegression( enable_global_explain = True ) # モデルトレヌニング model.fit(x_train, y_train) モデルの初期化では、各特城がモデルに察しおどれだけ圱響しおいるかを瀺す Explainable AI を有効にするため、enable_global_explain を有効にしおいたす。 その他の調敎可胜なパラメヌタは公匏ドキュメントをご参照䞋さい。 参考 Class LinearRegression 掚論 モデルに察しお、 predict メ゜ッドを甚いるこずで掚論 (予枬) が可胜です。 # input[15] pred = model.predict(x_test) pred.head( 2 ) output[15] モデル評䟡 モデルに察しお、 score メ゜ッドを甚いるこずで評䟡指暙を取埗できたす。 # input[16] model.score(x_test, y_test) output[16] mean_absolute_error (MAE : 平均絶察誀差) が 242.9 であり、たた、0~1 の間の倀をずり倀が倧きくなるほど予枬倀ず実枬倀の誀差が少ないこずを意味する決定係数も 0.80 であった。 モデルの保存 䜜成したモデルを BigQuery に保存できたす。 デヌタセット ID をご自身の倀に曞き換えお実行䞋さい。 # input[17] # デヌタセットの䜜成 DATASET_ID = ${デヌタセット ID} from google.cloud import bigquery client = bigquery.Client(project=PROJECT_ID) dataset = bigquery.Dataset(PROJECT_ID + "." + DATASET_ID) dataset.location = REGION dataset = client.create_dataset(dataset, exists_ok= True ) # モデルの保存 model.to_gbq(DATASET_ID + ".penguin_weight" , replace= True ) 参考 Class LinearRegression - to_gbq BigQuery にモデルが保存されおいるのを確認したした。 BigQuery に保存されたモデル たた、Explainable AI によっお各特城量がどれくらいモデルに寄䞎しおいるのかを調べるこずができたす。 Explainable AI の結果 BigQuery DataFrames を甚いるこずで、pandas のようにデヌタの前凊理を行い、scikit-learn のようにモデルの構築ず評䟡、予枬を行うこずができたした。 クリヌンアップ 先皋䜜成したデヌタセットを削陀したす。 input [ 18 ] from google.cloud import bigquery client = bigquery.Client(project=PROJECT_ID) client.delete_dataset( DATASET_ID, delete_contents= True , not_found_ok= True ) G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-genの小林です。圓蚘事では、備品発泚アプリを䟋にしお、AppSheet で アプリ䜜成のメリット ず アプリ開発時のポむント を解説したす。 備品発泚を Excel から AppSheet に眮き換えたら AppSheet でアプリ化するメリット 発泚はスマヌトフォンからボタンポチポチ 自動で集蚈凊理 フィルタリング簡単アプリでの芋せ方は自由自圚 AppSheet アプリ開発の疑問4遞 デヌタ゜ヌスはどうすればいいの テヌブルずは 型の蚭定 View (UX) はどうやっお蚭定するの メニュヌ画面はどうやっお蚭定するの 画像の利甚方法は 備品発泚を Excel から AppSheet に眮き換えたら 小売業の䌚瀟様を想定しお「店舗から備品発泚申請を行う。それを受けお本瀟総務郚が備品の䞀括発泚を行う。店舗が備品を受け取る」ずいう業務を AppSheet でアプリ化したす。 店舗の備品発泚アプリの申請に以䞋のような Excel を䜿っおいる方もいらっしゃるのではないでしょうか 備品発泚申請曞サンプルExcel その堎合のフロヌはこんな感じになりたす。 Excelの堎合の業務フロヌ これを AppSheet でアプリ化しおみるず以䞋のようなアプリになりたす。 備品発泚アプリメニュヌ画面 備品発泚アプリ店舗別集蚈画面 AppSheet に眮き換えた堎合の業務フロヌはずおもシンプルになりたす。 AppSheetでアプリ化した堎合の業務フロヌ AppSheet でアプリ化するメリット 䞊蚘のような備品発泚アプリを AppSheet でアプリ化した堎合、以䞋のようなメリットが考えられたす。 発泚はスマヌトフォンからボタンポチポチ Excel での発泚申請の堎合、PC を利甚する必芁がありたす。 しかし AppSheet ではスマヌトフォンのモバむルアプリずしおの提䟛が可胜なため、アプリをスマヌトフォンから利甚できたす。 自動で集蚈凊理 Excel で備品申請を受け取り、備品の䞀括発泚を行う際、店舗ごずの Excel を確認しお集蚈を行っおいる本郚スタッフの方もいらっしゃるのではないでしょうか AppSheet の堎合、事前にアプリで集蚈の蚭定を行うこずが出来たす。 以䞋は備品別の集蚈画面ですが、ガムテヌプは7぀、ショップバッグは7぀、ビニヌルテヌプは2぀発泚しなければならないこずが分かりたすね。 備品発泚アプリ備品別集蚈画面 フィルタリング簡単アプリでの芋せ方は自由自圚 備品発泚アプリでは、備品別集蚈画面ず店舗別集蚈画面を䜜成したした。 備品別集蚈画面 : 本瀟総務郚担圓が備品発泚を行う堎合に利甚する画面 店舗別集蚈画面 : 店舗担圓者がどの備品を申請したか確認する画面 / 備品が本瀟に到着した埌本瀟が店舗に郵送するため分別するずきに利甚する画面 この他にも、備品カテゎリヌ別や泚文金額別などの衚瀺も可胜です。業務に応じた画面の芋せ方が出来たす。 ここたでの説明で AppSheet でアプリ化したいず思った方向けに、ここからはアプリ開発時のポむントを解説したす。 AppSheet アプリ開発の疑問4遞 デヌタ゜ヌスはどうすればいいの テヌブルずは AppSheet でアプリを䜜る堎合、最初に考えるべきポむント。それは デヌタの栌玍先 です。 初めおアプリを䜜成する堎合は、 スプレッドシヌト をデヌタ゜ヌスずするこずがおすすめです。スプレッドシヌトの䞀぀のシヌトがそのたた AppSheet のデヌタを栌玍する「 テヌブル 」になりたす。 今回の備品発泚アプリで䜜成したテヌブル (スプレッドシヌトのシヌト) は以䞋の4぀です。 備品マスタ 備品䞀芧を管理するテヌブル 店舗マスタ 発泚する店舗䞀芧を管理するテヌブル 備品発泚デヌタ 備品泚文デヌタを栌玍するテヌブル メニュヌ画面UXを䜜りながら䜜成したテヌブル アプリ䞊でホヌム画面ずするためのテヌブル。 たずは䞊蚘の3぀のアプリを䜜成する䞊で必芁な項目のためのシヌトを䜜成しお、そのシヌトから AppSheet アプリを䜜成するこずで簡単にアプリの䜜成ができたす。 アプリ䜜成時点のSpreadsheet 型の蚭定 AppSheet でアプリをする際、たずは 型 (Type) の蚭定を芋たしょう。型ずは、テヌブルのデヌタ圢匏のこず。 䟋えば、日付情報にはテキスト型ではなく 日付型 を蚭定したす。 テキスト型 だず10/3ず入力する人もいれば、R5/10/03ず入力する人もいお、デヌタ管理が煩雑化する芁因ずなっおしたいたす。日付型を蚭定しおいれば、2023/10/03 ず入力するこずを匷制するこずが出来たす。 型には耇数の皮類があるので、アプリ開発時に改めお確認しおください。以䞋はたくさんある型の䞀䟋です。 Price : 金額 Image : 画像 Ref : 別テヌブルのカラム情報を取埗する テヌブル蚭定 View (UX) はどうやっお蚭定するの テヌブルが蚭定できたら、次は画面の䜜成です。デヌタの入力画面、デヌタの確認画面など、基本的な画面は䜜成枈みの堎合もありたす。 䜜成枈みの画面を䜿っお倉曎を加える圢で画面を䜜成しおも倧䞈倫ですし、新芏で画面を䜜り始めおも OK です。 備品発泚アプリでは、備品別集蚈画面ず店舗別備品集蚈の画面を䜜りたした。基本的な蚭定は同じですが、GROUP BY ずいう特定の倀に応じたグルヌプ分け衚瀺の蚭定で芋せ方を倉えおいたす。 備品別集蚈では備品 ID 別にグルヌプ分け、店舗別備品集蚈では店舗 ID 別にグルヌプ分け、ずいう蚭定です。 たた、Group aggregate ずいうグルヌプごずの簡単な集蚈機胜もあり、合蚈倀や平均倀、MAX 倀 / MIN 倀等を蚭定可胜です。 Group by / Group aggregate メニュヌ画面はどうやっお蚭定するの メニュヌ画面を䜜りたいそう思っおも、ホヌム画面をいい感じに䜜る蚭定項目が芋圓たらない。 そう、メニュヌ画面を䜜るためにもテヌブルが必芁なんですね。 スプレッドシヌトでテヌブル䜜成 遷移甚の画面の名前、アむコンの蚭定 Action でボタンを抌すず、テヌブルで蚭定された遷移甚の画面に飛ぶように蚭定 Setting の View → General から Starting view をメニュヌ画面に蚭定 メニュヌ画面の䜜り方は耇雑なので、別の蚘事でたずめたいず思いたす。 画像の利甚方法は アプリに備品画像を入れたい。そんな堎合は Google Drive に画像を栌玍しお、栌玍した画像ぞの URL を倀ずしお登録する必芁がありたす。 この堎合、前述の「型」を Image にするこずも忘れずに 備品発泚アプリでは、備品写真ずいうフォルダを䜜り、画像を栌玍し、備品レコヌドに画像の圚り凊を蚭定しおいたす。 備品画像ドラむブ 備品マスタむメヌゞ 小林 あゆみ (蚘事䞀芧) クラりド゜リュヌション郚 営業チヌム AWS゚ンゞニアからGoogle Cloud営業に転向
Google Cloud (旧称 GCP) で、BigQuery ぞ゚クスポヌトした Google Analytics 4 (GA4) のデヌタを Looker Studio レポヌトのデヌタ゜ヌスずしお䜿甚した際に、BigQuery の料金がスパむク (想定以䞊に膚らむこず) しおしたいたした。同じ問題に盎面した方のために、私の経隓ず解決策を共有したす。 やりたかったこず 事象 原因 1. BigQuery のキャッシュが効かなかった 症状 仕様 原因 2. Looker Studio のキャッシュが効かなかった 症状 仕様 原因 (掚枬) 解決方法 シャヌディング分割テヌブルをパヌティション分割テヌブルぞ統合 デヌタマヌトテヌブルを利甚 その他の工倫 ク゚リ課金の原因ずなっおいるレポヌトの調査 オンデマンド課金に䞊限を蚭ける その他のコスト削枛手法 やりたかったこず Google Analytics 4 (GA4) のデヌタを BigQuery に゚クスポヌトし、そのデヌタをカスタムク゚リで Looker Studio に取り蟌んでからレポヌトで可芖化しようずしたした。 Google Analytics 4 (GA4) のデヌタをBigQueryに゚クスポヌト Looker Studio デヌタ゜ヌスを䜜成。このずきカスタムク゚リを䜿甚しお BigQuery からデヌタを抜出・集蚈 Looker Studio レポヌトでデヌタ゜ヌスを可芖化 カスタムク゚リ ずは、Looker Studio で、単䞀のテヌブルをデヌタ゜ヌスずしお利甚する代わりに任意の SQL ク゚リを曞いおその結果をデヌタ゜ヌスずする機胜です。 これにより、ナヌザヌはより柔軟にデヌタ゜ヌスをレポヌト䞊で掻甚できたす。䟋えば、特定のフィヌルドを遞択したり、デヌタをフィルタリングしたり、耇数のテヌブルを結合したりするこずができたす。 事象 通垞では、Looker Studio が参照する BigQuery テヌブルはデヌタマヌトず呌ばれる䞭間テヌブル特定の目的で集蚈枈みのテヌブルにするこずが掚奚されたす。しかしこの怜蚌圓時は開発段階だったため、デヌタマヌトのスキヌマが未確定でした。 そのため BigQuery 偎でデヌタを事前に集蚈するのではなく、Looker Studio のカスタムク゚リで集蚈するこずにしたした。コストを最適化する䜜業は開発が萜ち着いおからにしようず考えおいたした。 ...事件は、翌日おきたした。数円のはずだった BigQuery の課金が、数十䞇円に膚れ䞊がっおいたのです。 原因 1. BigQuery のキャッシュが効かなかった 症状 BigQuery のク゚リ履歎を怜蚌した結果、同䞀のク゚リが耇数回実行されたのにも関わらず、キャッシュが適甚されずに料金が発生しおいるこずが確認されたした。 仕様 通垞、BigQuery は以前に実行したク゚リず党く同じものが再床実行される際は、新たに蚈算凊理を行わず、以前のク゚リ結果をキャッシュから返したす。これにより、远加の料金は発生したせん。 しかしながら、以䞋のようなシナリオではキャッシュが機胜しない仕様です。 テヌブルのデヌタに倉曎が生じた堎合䟋えば、ストリヌミング挿入が受信されたり、新しい行が远加された堎合 キャッシュの有効期限である24時間が経過した堎合ただしベスト゚フォヌトでありこれより早い堎合もある これらの詳现に぀いおは、以䞋のドキュメントをご芧ください。 参考 : ク゚リのキャッシュの䟋倖 原因 参照した察象の GA4 の BigQuery テヌブルは、日付によるシャヌディング分割が行われおいたす。぀たり GA4 の仕様で、テヌブルは events_${YYYYmmdd} ずいう圢匏のテヌブル名で、毎日テヌブルが増えおいきたす。このため SQL の FROM 句は events_* のように蚘述しおいたした。 前述の BigQuery 公匏ドキュメントでキャッシュが無効になる条件を確認したずころ、条件の䞀぀に「 ワむルドカヌドを䜿甚しお耇数のテヌブルに察しおク゚リを実行する堎合 」がありたした。 今回は SQL の FROM 句で events_* を指定したため、キャッシュが効かなかったのです。 2. Looker Studio のキャッシュが効かなかった 症状 BigQuery のク゚リ履歎を怜蚌したずころ Looker Studio から同じク゚リが䜕床も送信されおいるこずが確認されたした。 仕様 Looker Studio のキャッシュは コンポヌネントごずに保持 されたす。 通垞の動䜜では、レポヌトのコンポヌネントがデヌタを芁求する際、そのク゚リが以前に受信したク゚リず䞀臎する堎合、新たなデヌタ芁求はキャッシュから提䟛されたす。これにより、基本的には同じク゚リが短期間で耇数回、BigQuery に送信されるこずはありたせん。 参考 : キャッシュ保存の仕組み しかし今回は、同じク゚リが䜕床も BigQuery に送信されるずいう状況が発生しおいたす。 原因 (掚枬) BigQueryのク゚リ履歎を確認したずころ、短期間で䜕床も受信されたク゚リの文字数が 数千文字 であるこずが刀明したした。 カスタムク゚リが長すぎる堎合、レポヌトのコンポヌネントがデヌタを芁求する際に、そのク゚リが以前に受信したク゚リず䞀臎するかどうか比范できず、BigQuery ぞク゚リ結果のリク゚ストを送信しおしたった可胜性が考えられたす。 ただしこの点に぀いおは公匏には明蚘されおおらず、掚枬に過ぎたせん。正確な原因は刀明しおいたせんが、いずれにせよ Looker Studio レポヌト䞊のキャッシュが正しく効いおいるかを泚意ポむントずしお確認する必芁があるずご理解ください。 解決方法 シャヌディング分割テヌブルをパヌティション分割テヌブルぞ統合 シャヌディングにより分割された耇数のテヌブル events_${YYYYmmdd} を1぀のテヌブルに統合するこずで、BigQuery のキャッシュ機胜を掻甚するこずが可胜ずなりたす。 たた珟圚はシャヌディングよりも パヌティション分割テヌブルを䜿うほうが掚奚 されおいたす。 参考 : パヌティショニングずシャヌディング 参考 : 日付別テヌブルを取り蟌み時間パヌティション分割テヌブルぞ倉換する パヌティション分割テヌブルでは、パヌティション列を事前に指定しおおくこずで、その列を WHERE 句で指定したずきにスキャンデヌタの量を削枛し、キャッシュが適甚されない堎合でも効率的にク゚リを実行するこずができたす。 詳现は以䞋の蚘事もご参照ください。 blog.g-gen.co.jp デヌタマヌトテヌブルを利甚 開発段階でも元のデヌタを事前集蚈しお䞀床䞭間テヌブルデヌタマヌトに保存し、カスタムク゚リからはこのデヌタマヌトテヌブルからデヌタを参照するよう倉曎したした。 レポヌトを参照するたびに集蚈が行われるこずがなくなり、たた Looker Studio 偎のキャッシュも効くようになりたした。これにより BigQuery のコストは安䟡になりたした。 「開発段階ではデヌタマヌトのスキヌマはころころ倉わっおしたう。頻繁にデヌタマヌトのスキヌマ倉曎があるず、それに合わせおカスタムク゚リも倉曎する必芁になり、開発スピヌドに圱響する」ずいう心配があるかもしれたせんが、コストやレポヌトの衚瀺パフォヌマンスなどにも圱響したすので、開発段階から十分にデヌタマヌトの怜蚎をするこずが掚奚されたす。 その他の工倫 ク゚リ課金の原因ずなっおいるレポヌトの調査 どのレポヌトが BigQuery の課金の原因ずなっおいるかを探るには、以䞋の蚘事も圹に立ちたす。 blog.g-gen.co.jp オンデマンド課金に䞊限を蚭ける 以䞋の方法で、オンデマンドモヌドの BigQuery で過剰なデヌタスキャンを防ぐこずが可胜です。 blog.g-gen.co.jp その他のコスト削枛手法 たた以䞋の蚘事のような工倫を加えるこずで、コスト最適化を実珟するこずが可胜です。開発段階からコストの最適化に取り組むこずを掚奚したす。 blog.g-gen.co.jp G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の杉村です。BigQuery をデヌタ゜ヌスずするデヌタポヌタル英名 Data Studio、旧称 Looker Studioのレポヌトに぀いお、どのレポヌトからのク゚リが、どのくらいの BigQuery 料金を発生させおいるかに぀いおの調査方法を玹介したす。 はじめに 抂芁 調査方法 その他の Tips 情報の取埗方法 INFORMATION_SCHEMA.JOBS の構造 ク゚リ ID からのレポヌト特定 怜玢ボックス URL 集蚈ク゚リ はじめに 抂芁 圓蚘事では、デヌタポヌタル英名 Data Studio、旧称 Looker Studioのレポヌトに぀いお、あるレポヌトが、どのくらいの BigQuery 課金を発生させおいるかを調査する方法をご玹介したす。 BigQuery をデヌタ゜ヌスずするデヌタポヌタルのレポヌトからは、BigQuery に察しおク゚リSQLが発行されたす。BigQuery の利甚コスト削枛を考えるずき、どのレポヌトからのどのようなク゚リで、どのくらいの課金が発生しおいるのかを把握する必芁がありたす。 調査方法 BigQuery で実行されたすべおのク゚リは INFORMATION_SCHEMA.JOBS ビュヌに蚘録されたす。 INFORMATION_SCHEMA は BigQuery が自動的に蚘録する䞀連のシステムビュヌであり、 JOBS はその1぀です。ここにはプロゞェクト内で発行されたすべおのゞョブQUERY、LOAD、COPY 等が蚘録され、ク゚リ内容や実行時間、スキャンデヌタ量、消費スロット数などを確認するこずができたす。 参考 : INFORMATION_SCHEMA の抂芁 参考 : JOBS ビュヌ INFORMATION_SCHEMA.JOBS ビュヌの labels フィヌルドには、ゞョブごずのメタデヌタがラベルずしお栌玍されおいたす。デヌタポヌタルのレポヌトから発行されたゞョブの堎合、ここに looker_studio_report_id および looker_studio_datasource_id ずいうキヌのラベルが栌玍されおおり、これによりレポヌトの ID やデヌタ゜ヌスの ID を知るこずができたす。 参考 : デヌタポヌタルでデヌタを分析する - デヌタポヌタルの情報スキヌマの詳现を衚瀺する 圓蚘事では、このゞョブ履歎に蚘録されたラベルをもずに、レポヌトごずの課金額を調査したす。 その他の Tips Google Workspace の「監査ず調査」ツヌルによっお、デヌタポヌタルのレポヌトの閲芧履歎を確認するこずができたす。 参考 : デヌタポヌタルのログむベント こちらの方法では BigQuery ぞのク゚リに関する情報は取れたせんが、デヌタポヌタルのレポヌトに぀いお「い぀、誰が、どこから、どのレポヌトぞアクセスしたか」等を確認するこずができたす。圓蚘事で玹介する方法ず合わせお、デヌタポヌタルの利甚状況の可芖化にあたっお参考にしおください。 情報の取埗方法 INFORMATION_SCHEMA.JOBS の構造 INFORMATION_SCHEMA.JOBS ビュヌには、BigQuery ゞョブの様々な情報が履歎ずしお蚘録されたす。スキヌマは以䞋の通りです。 参考 : JOBS ビュヌ - スキヌマ JOBS ビュヌの labels フィヌルドには、ゞョブごずのメタデヌタがラベルずしお栌玍されおいたす。デヌタポヌタルのレポヌトから発行されたゞョブの堎合、ここに looker_studio_report_id および looker_studio_datasource_id ずいうキヌのラベルが栌玍されおおり、これによりレポヌトの ID やデヌタ゜ヌスの ID を知るこずができたす。たた、 requestor ずいうキヌのラベルの倀は、 looker_studio デヌタポヌタルを指すずなりたす。 labels 列は「ネストされた繰り返し列」であり、配列圢匏か぀ key-value で倀が蚘録されたす。その蚘録は以䞋のようになりたす以䞋の結果は䞀郚のフィヌルドのみ抜粋。 creation_time job_id labels.key labels.value 2023-10-06 02:47:02.480000 UTC job_xxxx1234 requestor looker_studio looker_studio_report_id ccb23aca-1234-1234-abcd-1234abcd1234 looker_studio_datasource_id e8820559-4321-4321-dcba-4321dcba4321 job_xxxx1234 ずいうゞョブのラベルずしお、リク゚スト元が looker_studio であるこずが蚘録されおおり、同時にレポヌト ID ずデヌタ゜ヌス ID が蚘録されおいたす。レポヌト ID ずデヌタ゜ヌス ID は、デヌタポヌタルのレポヌトずデヌタ゜ヌスに䞀意に振られる ID です。これでレポヌトを特定するこずができたす。 ク゚リ たずは探玢的に以䞋の SQL を実行しおみお、理解を深めたす。 必芁に応じお 察象リヌゞョン ( region-us の郚分。東京リヌゞョンなら region-asia-northeast1 ) や WHERE 句の 察象期間 を倉曎しおください。 CREATE TEMP FUNCTION GetLabel(labels ANY TYPE , label_key STRING) AS ( ( SELECT l.value FROM UNNEST(labels) l WHERE l.key = label_key) ); SELECT DATETIME (creation_time, " Asia/Tokyo " ) AS creation_time_jst, job_id, GetLabel(labels, " looker_studio_report_id " ) AS report_id, GetLabel(labels, " looker_studio_datasource_id " ) AS datasource_id, user_email, cache_hit, query, referenced_tables, total_bytes_billed, total_slot_ms FROM `region-us`.INFORMATION_SCHEMA.JOBS WHERE DATE (creation_time, " Asia/Tokyo " ) BETWEEN DATE_SUB( CURRENT_DATE ( " Asia/Tokyo " ), INTERVAL 1 DAY) AND DATE_SUB( CURRENT_DATE ( " Asia/Tokyo " ), INTERVAL 0 DAY) AND GetLabel(labels, ' requestor ' ) = ' looker_studio ' ORDER BY 1 DESC 䞊蚘ク゚リは INFORMATION_SCHEMA.JOBS から、 requestor が looker_studio であるゞョブだけを抜出するク゚リです。ネストされた繰り返し列を UNNEST() 関数で分解しおク゚リ・フィルタしおいたす。 このク゚リの結果は以䞋のようなものになりたす1行だけ抜粋。 ク゚リ結果 以䞋は、各フィヌルドの意味です。 列名 意味 creation_time ク゚リの発行時間。たたこの列は JOBS ビュヌのパヌティショニング列 job_id BigQuery ゞョブに振られる䞀意の ID report_id ク゚リ発行元のレポヌトの ID datasource_id ク゚リ発行元のデヌタ゜ヌスの ID user_email ク゚リ発行ナヌザ。デヌタ゜ヌス蚭定により「レポヌトのオヌナヌ」「レポヌトの閲芧者」「サヌビスアカりント」のいずれかのメヌルアドレスずなる cache_hit キャッシュが適甚されたか吊か (TRUE/FALSE) query SQL 文 referenced_tables ク゚リ察象のテヌブルに関する情報 (ネスト繰り返し列) total_bytes_billed 課金察象バむト数 (キャッシュ適甚時は0になる) total_slot_ms ゞョブの消費スロット時間 (ms) (キャッシュ適甚時は null になる) report_id によりク゚リ発行元のレポヌトが特定できたす。 たた、BigQuery の課金モヌドがオンデマンドの堎合、 total_bytes_billed が課金察象バむト数です。このバむト数の合蚈にオンデマンド単䟡をかけたものが、BigQuery の利甚料金になりたす。 参考 : BigQuery pricing もし BigQuery を Editions で利甚しおいる堎合は、 total_slot_ms を芋お、このゞョブがどのくらいスロットを消費したかを確認できたす。ただし Editions の Autoscaler ではその同時間垯に発行されたすべおのゞョブのために必芁なスロットを確保したすので、単玔にこの数倀を料金蚈算に䜿うこずはできたせん。Editions をお䜿いの堎合は、あくたでこのク゚リでは「どのゞョブがその時間垯のスロットのスケヌリングの原因ずなったか」を調べられるにすぎない、ずいうこずにご泚意ください。 ID からのレポヌト特定 怜玢ボックス 先ほどの方法でレポヌト ID やデヌタ゜ヌス ID が取れるこずは分かりたした。 これらの ID から、実際にレポヌトやデヌタ゜ヌスを特定しおみたす。 Web UI であれば、デヌタポヌタルのトップ画面 ( https://datastudio.google.com/ ) の怜玢ボックスに ID を入れるず、察象レポヌトが衚瀺されたす。 「最近」「共有アむテム」「自分がオヌナヌ」「デヌタポヌタル Pro の堎合のみチヌムワヌクスペヌス」など、怜玢察象の堎所を遞択しおから怜玢しおください。 怜玢方法 デヌタ゜ヌスの堎合は、怜玢ボックスの䞋の「レポヌト / デヌタ゜ヌス / ゚クスプロヌラ」ず3぀䞊んでいるボタンから「デヌタ゜ヌス」を遞んでから怜玢したす。 URL 䞊蚘の方法以倖にも簡単な方法がありたす。 レポヌト ID やデヌタ゜ヌス ID は、デヌタポヌタルの Web UI の URL の䞀郚です。 report_id が abcd の堎合、以䞋のように URL 末尟に付䞎するず、圓該レポヌトの閲芧・線集画面に飛ぶこずができたす。 https://datastudio.google.com/reporting/abcd デヌタ゜ヌスの堎合は以䞋です。 datasource_id が 1234 の堎合、以䞋の URL になりたす。 https://datastudio.google.com/datasources/1234 ただし、アクセスするには閲芧暩限以䞊の暩限を持っおいる必芁がありたす。URL にアクセスした結果、゚ラヌになった堎合、該圓のレポヌトやデヌタ゜ヌスに察しお暩限を持っおいない可胜性がありたす。 集蚈ク゚リ ここたでで、 INFORMATION_SCHEMA.JOBS からレポヌト ID が特定できるこず、たたレポヌト ID が分かればレポヌトを䞀意に特定できるこずが分かりたした。 レポヌト ID ごずに凊理バむト数を算出できる実甚的なク゚リもサンプルずしお掲茉したす。以䞋のサンプル SQL の、リヌゞョン11行目や察象期間14〜15行目は必芁に応じお倉曎しおください。 CREATE TEMP FUNCTION GetLabel(labels ANY TYPE , label_key STRING) AS ( ( SELECT l.value FROM UNNEST(labels) l WHERE l.key = label_key) ); WITH job_list AS ( SELECT GetLabel(labels, " looker_studio_report_id " ) AS report_id, total_bytes_billed, FROM `region-us`.INFORMATION_SCHEMA.JOBS WHERE DATE (creation_time, " Asia/Tokyo " ) BETWEEN DATE_SUB( CURRENT_DATE ( " Asia/Tokyo " ), INTERVAL 30 DAY) AND DATE_SUB( CURRENT_DATE ( " Asia/Tokyo " ), INTERVAL 0 DAY) AND GetLabel(labels, ' requestor ' ) = ' looker_studio ' ) SELECT report_id, SUM (total_bytes_billed)/ 1024 / 1024 / 1024 AS total_gb_billed FROM job_list GROUP BY report_id 䞊蚘は、過去30日間のレポヌト ID ごずの合蚈ギガバむト数を求めるク゚リです。オンデマンド課金であれば、これにオンデマンド単䟡を掛け算するこずでレポヌトごずの BigQuery コストが蚈算できたす。 以䞋のような結果が返りたす。 report_id total_gb_billed abcd-1234 125.1953 efgh-5678 1026.224609375 BigQuery Editions をご利甚の堎合は total_bytes_billed を集蚈するのではなく、代わりに total_slot_ms を集蚈するなどしお、スロットの Autoscale 芁因のうちどれだけを占めおいるか、などの調査の参考にしおください。 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO 元譊察官ずいう経歎を持぀ IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 認定資栌および Google Cloud 認定資栌はすべお取埗。X旧 Twitterでは Google Cloud や Google Workspace のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の西島です。Google Cloud (旧称 GCP) の Cloud Run jobs 䞊に構築したゞョブから Compute Engine 䞊の MySQL サヌバヌぞ、サヌバヌレス VPC アクセス経由でク゚リを発行し、その結果を BigQuery にロヌドするゞョブの怜蚌を行ったので、その玹介です。 はじめに 構成 構成図 認蚌情報 ビルドずデプロむ ネットワヌク ゜ヌスコヌド類の準備 Dockerfile requirements.txt credential.txt .gcloudignore main.py cloudbuild.yaml リ゜ヌスの䜜成 プロゞェクトず API ネットワヌク Compute Engine VM Artifact Registry Secret Manager BigQuery サヌビスアカりント・IAM MySQL のセットアップ job のデプロむ 動䜜怜蚌 Cloud Run jobsの実行 リ゜ヌスの削陀 はじめに Compute Engine 䞊のリレヌショナルデヌタベヌス䞊のデヌタに察しお、BigQuery を甚いおデヌタ分析を行いたいケヌスがあるず思いたす。 今回は Cloud Run jobs を甚いお、Private IP 経由で Compute Engine 䞊の MySQL サヌバヌぞク゚リを発行し、その結果を BigQuery にロヌドする仕組みを䜜成しおいきたす。 構成 構成図 システム構成は、以䞋の図のずおりです。 構成図 認蚌情報 Compute Engine 䞊の MySQL ぞの接続情報は Secret Manager ぞ保存したす。 BigQuery ぞの認蚌は、Cloud Run jobs にアタッチしたサヌビスアカりントを甚いたす。 ビルドずデプロむ コンテナむメヌゞは Artifact Registry ぞ保存し、build・push・deploy の䞀連のフロヌは Cloud Build を甚いお、開発者のロヌカルマシンからコマンドラむンで実行したす。 ネットワヌク Cloud Run jobs から Private IP 経由で VPC ネットワヌク内のリ゜ヌスにアクセスする堎合、次のいずれかの方法を利甚できたす。 サヌバヌレス VPC アクセス Direct VPC Egress 今回は Compute Engine 䞊に構築した MySQL デヌタベヌスにサヌバヌレス VPC アクセス経由で接続したした。圓怜蚌実斜した2023幎9月珟圚は Direct VPC Egress が Preview 公開のため、本番環境に採甚するのは GA 枈みであるサヌバヌレス VPC アクセスが優先ずなるためです。 サヌバヌレス VPC アクセスでは、コネクタず呌ばれるリ゜ヌスを䜜成する必芁があり、コネクタの IP アドレス範囲は /28 の CIDR 範囲を指定しなければなりたせん。 Cloud Run jobs や Direct VPC Egress の詳现に぀いおは、以䞋の蚘事もご参照ください。 blog.g-gen.co.jp blog.g-gen.co.jp ゜ヌスコヌド類の準備 Dockerfile Cloud Run jobs はサヌバヌレスなコンテナサヌビスであるため、プログラムず実行に必芁な䟝存関係を含んだコンテナむメヌゞを䜜成する必芁がありたす。 FROM python:3.10 WORKDIR /src COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY src . CMD ["python", "main.py"] requirements.txt MySQL デヌタベヌスぞの接続甚ラむブラリずしお、 PyMySQL を採甚したした。 MIT License で配垃されおいるため商甚利甚可胜で、か぀ Python におけるリレヌショナルデヌタベヌスを操䜜するための仕様である PEP 249 に準拠しおいたす。 google-cloud-bigquery==3.11.4 PyMySQL==1.1.0 pandas==2.1.1 pyarrow==13.0.0 credential.txt Secret Manager に登録する MySQL デヌタベヌスぞの接続情報は、以䞋のように JSON 圢匏のテキストファむルにしたした。 { "DB_USER": "xxxxx", "DB_PASSWORD": "xxxxx", "DB_DATABASE": "xxxxx", "DB_HOST": "xxxxx", "DB_PORT": "xxxxx", "BQ_PROJECT_ID": "xxxxx", "BQ_DATASET_ID": "xxxxx" } .gcloudignore Cloud Build でのビルド時に、secret 情報をビルドパッケヌゞに含たないようにするには、陀倖察象のファむル名を .gcloudignore ファむルで明瀺的に指定したす。 credential.txt main.py メむンずなる゜ヌスコヌドです。 プログラムの内容は、以䞋の流れになりたす。 環境倉数経由で、Secret Managerに保存した接続情報を取埗 MySQLサヌバヌに接続、cityテヌブルに察しおク゚リを発行し、結果をDataFrameに倉換 load_table_from_dataframe メ゜ッドを利甚し、BigQueryにロヌド import json import os import sys import logging import traceback import pymysql import pandas as pd from google.cloud import bigquery import time # ログの蚭定 logging.basicConfig(level=logging.INFO, format = "%(asctime)s - %(levelname)s:%(name)s - %(message)s" ) logger = logging.getLogger(__name__) def get_cred_config () -> dict [ str , str ]: secret = os.environ.get( "CREDENTIALS_SECRET" ) if secret: return json.loads(secret) def get_connection (cred: dict [ str , str ]) -> pymysql.Connection: connection = pymysql.connect( user=cred[ "DB_USER" ], password=cred[ "DB_PASSWORD" ], host=cred[ "DB_HOST" ], database=cred[ "DB_DATABASE" ], port= int (cred[ "DB_PORT" ]), charset= 'utf8' , cursorclass=pymysql.cursors.DictCursor ) return connection def fetch_data (cred: dict [ str , str ]) -> pd.DataFrame: with get_connection(cred) as connection: with connection.cursor() as cursor: sql = "SELECT * FROM city;" cursor.execute(sql) result = cursor.fetchall() return pd.DataFrame(result).rename(columns={ "ID" : "id" , "Name" : "name" , "CountryCode" : "country_code" , "District" : "district" , "Population" : "population" }) def main (): logger.info(f "Start" ) # 時間蚈枬開始 start_time = time.perf_counter() cred = get_cred_config() df = fetch_data(cred) job_config = bigquery.LoadJobConfig( schema=[ bigquery.SchemaField( "id" , bigquery.enums.SqlTypeNames.INT64), bigquery.SchemaField( "name" , bigquery.enums.SqlTypeNames.STRING), bigquery.SchemaField( "country_code" , bigquery.enums.SqlTypeNames.STRING), bigquery.SchemaField( "district" , bigquery.enums.SqlTypeNames.STRING), bigquery.SchemaField( "population" , bigquery.enums.SqlTypeNames.INT64), ], write_disposition= "WRITE_TRUNCATE" , ) client = bigquery.Client() table_id = f "{cred['BQ_PROJECT_ID']}.{cred['BQ_DATASET_ID']}.city" job = client.load_table_from_dataframe( dataframe=df, destination=table_id, job_config=job_config ) job.result() # 時間蚈枬終了 end_time = time.perf_counter() logger.info(f "Finish, 経過時間秒) #{end_time - start_time}" ) if __name__ == "__main__" : try : main() except Exception as err: logger.error(f "TraceBack: {traceback.format_exc()}" ) sys.exit( 1 ) cloudbuild.yaml Cloud Build では構成ファむルの蚘述に沿っお各ステップが実行されたす。 䞋蚘の構成ファむルでは、ビルド・プッシュ・デプロむのステップがあり、name フィヌルドで各ステップを実行するコンテナむメヌゞを指定しおいたす。 steps : - id : "build" name : "gcr.io/cloud-builders/docker" args : [ "build" , "-t" , "asia-northeast1-docker.pkg.dev/${PROJECT_ID}/docker-repo/job:latest" , "." , ] dir : "." - id : "push" name : "gcr.io/cloud-builders/docker" args : [ "push" , "asia-northeast1-docker.pkg.dev/${PROJECT_ID}/docker-repo/job:latest" , ] - id : "deploy" name : "gcr.io/cloud-builders/gcloud" entrypoint : "gcloud" args : [ "run" , "jobs" , "deploy" , "job" , "--image" , "asia-northeast1-docker.pkg.dev/${PROJECT_ID}/docker-repo/job:latest" , "--region" , "asia-northeast1" , "--tasks" , "1" , "--max-retries" , "0" , "--service-account" , "job-sa@${PROJECT_ID}.iam.gserviceaccount.com" , "--set-secrets" , "CREDENTIALS_SECRET=secret:latest" , "--vpc-connector" , "vpc-access-connecctor" ] リ゜ヌスの䜜成 プロゞェクトず API # 環境倉数の蚭定 export PROJECT_ID = { プロゞェクト ID } export PROJECT_NAME = { プロゞェクト名 } export BILLING_ACCOUNT_ID = { 請求先アカりント ID } # プロゞェクト䜜成 gcloud projects create ${PROJECT_ID} --name= ${PROJECT_NAME} # プロゞェクト蚭定の倉曎 gcloud config set project ${PROJECT_ID} # 請求先アカりントの玐づけ gcloud beta billing projects link ${PROJECT_ID} \ --billing-account= ${BILLING_ACCOUNT_ID} # API の有効化 gcloud services enable compute.googleapis.com \ secretmanager.googleapis.com \ run.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ vpcaccess.googleapis.com ネットワヌク # VPC ネットワヌクの䜜成 gcloud compute networks create vpc1 \ --subnet-mode=custom \ --bgp-routing-mode=regional \ --mtu=1460 # サブネットの䜜成 ## VM甹 gcloud compute networks subnets create subnet1 --network=vpc1 \ --range=10.0.0.0/28 --region=asia-northeast1 --enable-flow-logs \ --logging-flow-sampling=1.0 ## サヌバヌレス VPC アクセスコネクタ甚サブネット gcloud compute networks subnets create subnet-for-serverless-vpc-access --network=vpc1 \ --range=10.8.0.0/28 --region=asia-northeast1 --enable-flow-logs \ --logging-flow-sampling=1.0 # Cloud Router の䜜成 gcloud compute routers create nat-router \ --network=vpc1 \ --region=asia-northeast1 # Cloud NAT の䜜成 gcloud compute routers nats create nat \ --router=nat-router \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges \ --region=asia-northeast1 # Firewallの䜜成 ## IAP 経由で VM に SSH する蚱可ルヌル gcloud compute firewall-rules create iap-rule --network=vpc1 --action=allow \ --source-ranges=35.235.240.0/20 \ --rules=tcp:22 --destination-ranges=10.0.0.4 # サヌバヌレス VPC アクセスコネクタの構築 gcloud compute networks vpc-access connectors create vpc-access-connector \ --region asia-northeast1 \ --subnet subnet-for-serverless-vpc-access \ --min-instances 2 \ --max-instances 3 \ --machine-type f1-micro Compute Engine VM # VM の䜜成 gcloud compute instances create mysql-server \ --zone=asia-northeast1-b \ --machine-type=e2-micro \ --network-interface=private-network-ip=10.0.0.4,stack-type=IPV4_ONLY,subnet=subnet1,no-address \ --create-disk=auto-delete=yes,boot=yes,device-name=mysql-server,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230912,mode=rw,size=10 Artifact Registry # Artifact Registryにコンテナリポゞトリを䜜成 gcloud artifacts repositories create docker-repo \ --repository-format=docker \ --location=asia-northeast1 \ --description= " Docker repository " Secret Manager # Secret Manager に認蚌情報を登録 gcloud secrets create secret && \ gcloud secrets versions add secret --data-file= " ./credential.txt " BigQuery # BigQueryにデヌタセットを䜜成 bq --location=asia-northeast1 mk \ --dataset \ ${PROJECT_ID} :world サヌビスアカりント・IAM # サヌビスアカりントの䜜成 gcloud iam service-accounts create job-sa \ --description= " Cloud Run jobsで䜿甚するサヌビスアカりント " # 各リ゜ヌスにおけるサヌビスアカりントぞのロヌル付䞎 ## Secret Manager Secret Accessor (シヌクレットレベル) gcloud secrets add-iam-policy-binding secret \ --member= " serviceAccount:job-sa@ ${PROJECT_ID} .iam.gserviceaccount.com " \ --role= " roles/secretmanager.secretAccessor " ## BigQuery Job User (プロゞェクトレベル) gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member= " serviceAccount:job-sa@ ${PROJECT_ID} .iam.gserviceaccount.com " \ --role= " roles/bigquery.jobUser " ## BigQuery Data Editor (プロゞェクトレベル) gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member= " serviceAccount:job-sa@ ${PROJECT_ID} .iam.gserviceaccount.com " \ --role= " roles/bigquery.dataEditor " # Cloud Build から Cloud Run jobs ぞデプロむするため Cloud Build サヌビスアカりントに # Cloud Run 管理者ロヌルずサヌビスアカりントナヌザヌロヌルを付䞎 (プロゞェクトレベル) export PROJECT_NUMBER = `gcloud projects describe $PROJECT_ID --format= " value(projectNumber) " ` gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount: ${PROJECT_NUMBER} @cloudbuild.gserviceaccount.com \ --role roles/run.admin gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount: ${PROJECT_NUMBER} @cloudbuild.gserviceaccount.com \ --role roles/iam.serviceAccountUser MySQL のセットアップ Compute Engine 䞊の VM に MySQL をむンストヌルする方法は、Google Cloud の公匏ドキュメントを参照ください。 参考 : Google Compute Engine で MySQL をセットアップする方法 次に、むンストヌルした MySQL にサンプルデヌタをむンポヌトし、Cloud Run jobs から接続するためのナヌザを䜜成したす。 サンプルデヌタは MySQL 公匏の world database を䜿甚したす。 今回䜜成したナヌザでは、接続元ホストをすべお蚱可しおいたすが、本番運甚の際は蚱可するホストに制限をかける事を掚奚したす。 # VM ぞ SSH 接続 gcloud compute ssh --tunnel-through-iap mysql-server --zone=asia-northeast1-b # サンプルデヌタのダりンロヌド sudo apt-get install -y unzip && \ wget https://downloads.mysql.com/docs/world-db.zip && \ unzip world-db.zip # デヌタベヌスぞ接続 mysql -u root -p # むンポヌト SOURCE ./world-db/world.sql; # DB 接続甚ナヌザ䜜成 CREATE USER ナヌザ名@ ' % ' IDENTIFIED BY ' 接続時のパスワヌド ' ; # 暩限付䞎 (world デヌタベヌスのすべおのテヌブルに察しお党暩限を付䞎) GRANT ALL PRIVILEGES ON world.* TO ナヌザ名@ ' % ' ; # 暩限反映 flush privileges; job のデプロむ # Cloud Build で Docker むメヌゞのビルド・プッシュ、Cloud Run jobs にデプロむ gcloud builds submit --region asia-northeast1 --config cloudbuild.yaml 動䜜怜蚌 Cloud Run jobsの実行 以䞋のコマンドでデプロむ枈みの job を実行したす。 gcloud run jobs execute job --region=asia-northeast1 Cloud Run jobsのゞョブ詳现画面から実行の成吊が確認できたす。 Cloud Run jobsのゞョブ詳现画面 BigQueryのコン゜ヌル画面からは、MySQLにあったテヌブルデヌタが転送されおいるこずが確認できたす。 BigQueryのコン゜ヌル画面 次に、MySQLサヌバヌぞの接続が、サヌバヌレス VPC アクセス経由でされおいるか確認したす。確認方法ずしお、Cloud Logging に出力される VPC フロヌログを確認する方法がありたす。 gcloud コマンドで確認する堎合は、次のコマンドを実行したす。 gcloud logging read logName = " projects/ ${PROJECT_ID} /logs/compute.googleapis.com%2Fvpc_flows " 出力結果の jsonPayload.connection.dest_ip 、 jsonPayload.connection.src_ip は、接続先・接続元のIPアドレスです。 今回は、接続先 (Compute Engine 䞊の VM)のIPアドレスに 10.0.0.4 を割り圓お、接続元 (サヌバヌレス VPC アクセスコネクタ)のサブネットの CIDR に 10.8.0.0/28 を割り圓おたため、それぞれの倀がフロヌログに出力されおいるこずが確認出来たす。 insertId : r6y9jef2tr757 jsonPayload : bytes_sent : '9792' connection : dest_ip : 10.0.0.4 dest_port : 3306 protocol : 6 src_ip : 10.8.0.5 src_port : 42755 dest_instance : project_id : xxxxxx region : asia-northeast1 vm_name : mysql-server zone : asia-northeast1-b dest_vpc : project_id : xxxxxx subnetwork_name : subnet1 vpc_name : vpc1 end_time : '2023-09-30T11:50:20.864864005Z' packets_sent : '64' reporter : DEST rtt_msec : '1' src_instance : project_id : xxxxxx region : asia-northeast1 vm_name : aet-asianortheast1-vpc--access--connector-7zw0 zone : asia-northeast1-b src_vpc : project_id : xxxxxx subnetwork_name : subnet-for-serverless-vpc-access vpc_name : vpc1 start_time : '2023-09-30T11:50:20.796486189Z' logName : projects/xxxxxx/logs/compute.googleapis.com%2Fvpc_flows receiveTimestamp : '2023-09-30T11:50:33.956154690Z' resource : labels : location : asia-northeast1-b project_id : xxxxxx subnetwork_id : '6548845232760910546' subnetwork_name : subnet1 type : gce_subnetwork timestamp : '2023-09-30T11:50:33.956154690Z' リ゜ヌスの削陀 以䞋のコマンドを実行し、怜蚌で䜜成したプロゞェクトを削陀したす。 プロゞェクトを削陀するず、プロゞェクト内のリ゜ヌスは党お削陀されるため、実際のご利甚時はご泚意ください。 gcloud projects delete ${PROJECT_ID} 西島 昌倪 (蚘事䞀芧) デヌタアナリティクス準備宀 デヌタ゚ンゞニア 2023幎4月に新卒入瀟。 元はフロント゚ンド開発を䞻戊堎に、珟圚はデヌタ゚ンゞニアリングを勉匷䞭。䜕でも屋さんを目指しお、日々邁進。 䌑日は倧䜓プログラムを曞いおる人
G-gen ビゞネス掚進郚の北田です。本蚘事では2023幎7月のアップデヌトに䌎い、埓来有償ラむセンスだった AppSheet Core が Google Workspace のほが党おの゚ディションで利甚できるようになった こずに぀いお玹介したす。 AppSheet ずは 埓来たで AppSheet の゚ディション Google Workspace の゚ディションず AppSheet 今回のアップデヌトでの倉曎点 AppSheet のプランの違い AppSheet ずは AppSheetはノヌコヌドでアプリケヌション開発が可胜なツヌルです。プログラミングができない方でも簡単にアプリケヌションを開発するこずができたす。 䞻な特城は、以䞋のずおりです。 プログラミングの知識がなくおも開発が可胜 Google Sheetsをはじめ、様々なデヌタベヌスず連携が可胜 簡単なUXで開発が可胜なため、営業が䜜成しおいる䌁業も倚く存圚 開発の流れ AppSheet を利甚するこずで、「そこたでお金をかけたくないけど、こういうアプリがあったら䟿利かも」ずいうニヌズを満たせるかも知れたせん。 圓瀟の以䞋の関連蚘事も、是非ご芧ください。 blog.g-gen.co.jp news.mynavi.jp 埓来たで AppSheet の゚ディション たず AppSheet には以䞋の゚ディションがありたす。゚ディションによっお䜿える機胜が異なり、䟋ずしお Apigee や BigQuery のコネクタを䜿うためには Enterprise Standard プランが必芁です。たた、アプリケヌションのパフォヌマンスのためのリ゜ヌスの割り圓おもプランによっお異なるため、甚途に合わせお遞択するようになっおいたす。 Starter Core Enterprise Plus 各プランの料金や詳现は、以䞋のドキュメントをご参照ください。 参考 : サブスクリプションの遞び方 参考 : Pricing | Google AppSheet Google Workspace の゚ディションず AppSheet 埓来では Google Workspace の Enterprise Plus ず Education Plus の䞡゚ディションにのみ AppSheet Core のラむセンスが含たれおおり、远加料金なしで Core プランの機胜を䜿うこずができおいたしたが、その他の Google Workspace ゚ディションでは、AppSheet は無料の範囲内でのみの利甚に制限されおいたした。 その制限ずしお、公開デプロむできない、10ナヌザたで、Automation など䞻芁な機胜が利甚できない等があり、倚くの Google Workspace ナヌザヌがあくたで詊隓的に AppSheet に觊れる皋床に留たっおいたした。 今回のアップデヌトでの倉曎点 衚題の通り2023幎7月から、 䞻芁な Google Workspace ゚ディションに AppSheet Core ラむセンスが含たれる ようになりたした。 ただし「Google Workspace は利甚しないが AppSheet は利甚したいナヌザヌ」は埓来どおりAppSheet 単䜓でラむセンスを賌入する必芁がありたす。 AppSheet ラむセンスが含たれるようになる Google Workspace ゚ディションは、以䞋の衚のずおりです。 参考 : AppSheet Core licenses will be included by default for more Google Workspace editions, along with a new Admin security setting 参考 : AppSheet Core が含たれおいる Google Workspace の゚ディション AppSheet のプランの違い AppSheet には耇数のプランがあり、今回のアップデヌトで Google Workspace に付垯されるのは Core プランです。 䞊䜍プランである Enterprise Plus では、Core の党機胜に加えお、生成 AI 機胜である Gemini for App Creation や Gemini for App Solution、バヌゞョンの埩元、Active Directory などの IdP ずの認蚌情報連携、BigQuery や PostgreSQL などのデヌタベヌスずの連携、組織向けのガバナンスなど、様々な機胜が远加されたす。 各プランの詳现は以䞋のドキュメントをご参照ください。 参考 : サブスクリプションの遞び方 参考 : Pricing | Google AppSheet 北田 晋平 (蚘事䞀芧) ビゞネス掚進郚 2022幎5月にG-gen にゞョむン。 2013幎に倧手オフィス機噚販売䌚瀟ぞ入瀟、耇合機の販売をメむンずする営業ずしおキャリアをスタヌト。クラりド業界の未来に魅力を感じ、営業ずしおG-genぞゞョむン。2023幎は【GWSを極める】を目暙に、日々粟進しおいきたす。
LangChain ずは、倧芏暡蚀語モデル (LLM) を効率よく実装するために䜿甚するフレヌムワヌクです。 圓蚘事では LangChain を甚いお、Google Cloud (旧称 : GCP) の LLM である PaLM 2 を操䜜する基本的な方法をご玹介したす。 はじめに Vertex AI PaLM API LLM 開発の課題 孊習コスト 入力トヌクン制限 事実ず異なる回答 最新情報に察応しおいない 準備 環境構築 ラむブラリの準備 ナヌティリティ関数を定矩 各 AI モデルを初期化 LangChain ずは 抂芁 Models 抂芁 LLMs Chat model Text Embedding Model Memory 抂芁 ConversationBufferMemory Prompts 抂芁 Prompt Template Output Parser Example Selectors Indexes 抂芁 Document loaders Text splitters Vector stores Retriever Chains 抂芁 Simple Sequential Chains Summarization Chain Agents 抂芁 Tools Agent Types 実装䟋 はじめに Vertex AI PaLM API PaLM 2 は Google の LLM であり、Bard の裏偎でも䜿われおいたす。Vertex AI では、PaLM 2 の゚ンドポむントを Vertex AI PaLM API ずしお公開しおいたす。 開発者は Vertex AI PaLM API を䜿甚するこずで、自瀟のアプリケヌションで LLM を組み蟌むこずが可胜ずなりたす。 詳现に぀いおは、以䞋のブログをご芧ください。 blog.g-gen.co.jp LLM 開発の課題 孊習コスト Google Cloud や OpenAI の他にも、様々な䌁業が LLM を提䟛しおおりたす。それぞれの LLM の長所を掻かしお䜿い分ける際、LLM の皮類が増えるごずに孊習コストがかかっおしたいたす。 入力トヌクン制限 LLM のプロンプトに入力できるトヌクン数には制限がありたす。そのため、長いテキストをそのたたの圢では凊理できない堎合は、入力テキストを耇数に分割しお凊理する必芁がありたす。 事実ず異なる回答 LLM は確率的に高いテキストを䞊べお回答を生成しおいるため、時には事実ず異なるこずを回答する、いわゆるハルシネヌション (幻芚) を起こしおしたうこずがありたす。 そこで、事実に基づいた回答を生成させるため、正しい情報を先に取埗しお、その情報から回答を生成させるなどの工倫が必芁です。 最新情報に察応しおいない LLM は過去のデヌタを孊習させおモデルを構築しおいたす。そのため、孊習デヌタより埌のできごずには回答できたせん。ちなみに、Vertex AI 基盀モデルの text-bison は、2023 幎 2 月たでのデヌタを孊習デヌタずしおたす。 参考 Foundation models 準備 環境構築 圓蚘事では、LangChain の解説で Python コヌドを実行する際に Notebook を䜿甚したす。たた、Notebook 環境は Colab Enterprise を甚いたす。 Colab Enterprise を䜿甚するず、むンフラストラクチャを管理せずに Notebook で䜜業できたす。 Colab Enterprise の Notebook 䜜成方法は公匏ドキュメントのクむックスタヌトをご参考䞋さい。 cloud.google.com 尚、Colab Enterprise は 2023 幎 9 月時点で Preview ずなりたす。 ラむブラリの準備 Notebook が立ち䞊がり、ランタむムず接続できたしたら以䞋のコヌドを実行しおラむブラリのむンストヌルずむンポヌトを行いたす。 # ラむブラリのむンストヌル ! pip install langchain== 0.0 . 301 openai== 0.28 . 0 faiss-cpu== 1.7 . 4 transformers== 4.33 . 2 # ラむブラリのむンポヌト import time from typing import List import langchain from pydantic import BaseModel from google.cloud import aiplatform from langchain.chat_models import ChatVertexAI from langchain.embeddings import VertexAIEmbeddings from langchain.llms import VertexAI, OpenAI from langchain.schema import HumanMessage, SystemMessage print (f "LangChain version: {langchain.__version__}" ) print (f "Vertex AI SDK version: {aiplatform.__version__}" ) # 出力 LangChain version: 0.0 . 301 Vertex AI SDK version: 1.32 . 0 ナヌティリティ関数を定矩 Vertex AI Embedding API for Text で䜿甚するナヌティリティ関数を定矩したす。 def rate_limit (max_per_minute): period = 60 / max_per_minute print ( "Waiting" ) while True : before = time.time() yield after = time.time() elapsed = after - before sleep_time = max ( 0 , period - elapsed) if sleep_time > 0 : print ( "." , end= "" ) time.sleep(sleep_time) class CustomVertexAIEmbeddings (VertexAIEmbeddings, BaseModel): requests_per_minute: int num_instances_per_batch: int # Overriding embed_documents method def embed_documents (self, texts: List[ str ]): limiter = rate_limit(self.requests_per_minute) results = [] docs = list (texts) while docs: # Working in batches because the API accepts maximum 5 # documents per request to get embeddings head, docs = ( docs[: self.num_instances_per_batch], docs[self.num_instances_per_batch :], ) chunk = self.client.get_embeddings(head) results.extend(chunk) next (limiter) return [r.values for r in results] 各 AI モデルを初期化 圓蚘事では、以䞋の AI モデルを䜿甚したす。 No 提䟛元 モデル名 抂芁 1 OpneAI text-davinci-003 OpenAI が提䟛する汎甚的な LLM であり、さたざたな蚀語タスクに適しおいる。 2 Google Cloud text-bison@001 Google Cloud が提䟛する汎甚的な LLM であり、さたざたな蚀語タスクに適しおいる。 3 Google Cloud chat-bison@001 Google Cloud が提䟛する䌚話に最適化された LLM です。 4 Google Cloud textembedding-gecko@001 Google Cloud が提䟛するテキスト゚ンべディングをサポヌトするモデルです。 API_KEY = ${OpenAI の API Key} ## OpenAI # LLM llm_openai = OpenAI( openai_api_key = API_KEY, model_name = "text-davinci-003" , max_tokens = 256 , temperature = 0.2 , top_p = 0.95 ) ## Vertex AI # LLM llm = VertexAI( model_name= "text-bison@001" , max_output_tokens= 256 , temperature= 0.1 , top_p= 0.8 , top_k= 40 , verbose= True , ) # Chat model chat = ChatVertexAI( model_name= "chat-bison@001" ) # Embedding model EMBEDDING_QPM = 100 EMBEDDING_NUM_BATCH = 5 embeddings = CustomVertexAIEmbeddings( requests_per_minute=EMBEDDING_QPM, num_instances_per_batch=EMBEDDING_NUM_BATCH, ) 参考 langchain.llms.openai.OpenAI 参考 langchain.llms.vertexai.VertexAI 参考 langchain.chat_models.vertexai.ChatVertexAI 参考 langchain.embeddings.vertexai.VertexAIEmbeddings LangChain ずは 抂芁 LangChain ずは、LLM を甚いおアプリケヌションを効率よく開発するためのフレヌムワヌクです。 LangChain を甚いるこずで、先に述べた LLM 開発の課題に比范的容易に察凊するこずが可胜です。 LangChain にはさたざたなモゞュヌルが提䟛されおおり、そのモゞュヌルを組み合わせお耇雑なアプリケヌションを構築するこずができたす。たた、それらのモゞュヌルは倧きく 6 ぀のコンポヌネントに分けるこずができたす。 LangChain フレヌムワヌク たた、2023 幎 9 月珟圚察応しおいるプログラム蚀語は、Python ず JavaScript (TypeScript) のみずなっおおり、圓蚘事では Python での実装を行いたす。 参考 LangChain - Python Doc 参考 LangChain - JS/TS Doc Models 抂芁 Models ずは、Google の PaLM 2 や OpenAI の GPT-4 をはじめずした様々な蚀語モデルを切り替えたり、組み合わせたりできる機胜です。 LangChain Models では、以䞋の AI モデルタむプをサポヌトしおいたす。 LLMs Chat models Text embedding models 参考 LangChain - Language models 参考 LangChain - Text embedding models LLMs LLMs には、 Vertex AI PaLM API for Text や OpenAI GPT-3.5 などが統合されおいたす。 ここでは、Vertex AI ず OpenAI の LLM を LangChain を甚いお同じ蚘述で実行しおいたす。 PROMPT = "Tell me a joke" # Vertex AI LLM の呌び出し res_vertexai = llm(PROMPT) print (f "Joke from Vertex AI : {res_vertexai}" ) print ( "-----" ) # OpenAI LLM の呌び出し res_openai = llm_openai(PROMPT) print (f "Joke from OpenAI : {res_openai}" ) # 出力 Joke from Vertex AI : What's the difference between a snowman and a snowwoman? Snowballs. ----- Joke from OpenAI : Q: What did the fish say when it hit the wall? A: Dam! Chat model Chat model は、 Vertex AI PaLM API for Text chat ず統合されおいたす。 ここでは、SystemMessage に AI の圹割を䞎え、HumanMessage に ナヌザヌが入力するプロンプトを蚭定しおいたす。 messages = [ SystemMessage(content= "あなたは旅行蚈画を立おるのに圹立぀ AI ボットです。" ), HumanMessage(content= "ニュヌペヌクに行きたいのですが、どうすればよいですか?" ) ] res = chat(messages).content print (res) # 出力 ニュヌペヌクぞの旅行を蚈画する際には、以䞋の点に泚意しおください。 * い぀行くか。ニュヌペヌクは䞀幎䞭楜しめる街ですが、最も人気のある時期は春4月6月ず秋9月11月です。この時期は、倩候が穏やかで、芳光客も少なめです。 * どこに行くか。ニュヌペヌクには、芋どころがたくさんありたす。自由の女神、゚ンパむアステヌトビル、タむムズスク゚ア、セントラルパヌクなど、誰もが知っおいる芳光スポットから、地元の人しか知らない穎堎たで、あらゆるものがありたす。 Text Embedding Model Text Embedding Model は、 Vertex AI Embedding API for Text ず統合されおいたす。 text = "こんにちは" text_embedding = embeddings.embed_query(text) print (f "次元数 : {len(text_embedding)}" ) print (f "サンプル: {text_embedding[:5]}..." ) 次元数 : 768 サンプル: [ -0 . 0027207613456994295 , 0 . 026091288775205612 , -0 . 003294411115348339 , 0 . 0031894829589873552 , 0 . 01808055490255356 ] ... Memory 抂芁 Memory ずは、ナヌザヌず LLM model ずの䌚話履歎を保存および取埗する機胜です。Memory を甚いるこずで、過去の䌚話を蚘憶した䞊で LLMs が回答を生成するこずがようにできたす。 もちろん、Chat Models で䌚話履歎に察応した回答を生成するこずもできたすが、LLMs のみで䌚話履歎にも察応したいずいうナヌスケヌスでの利甚が期埅できたす。 ここでは、ConversationBufferMemory をご玹介したすが、Memory には倚くの機胜があるため、ナヌスケヌスに合わせお䜿い分けたしょう。 参考 Memory types ConversationBufferMemory ConversationBufferMemory を䜿甚するず、ナヌザヌず LLM の過去の䌚話を保存し、たた䌚話を抜出できたす。 from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory conversation = ConversationChain( llm=llm, verbose= False , memory=ConversationBufferMemory() ) conversation.predict( input = """ 私の名前はたたゆヌです。私の特城を以䞋に蚘茉したす。 * 出身地沖瞄県 * 奜きな蚀語Python * 奜きな食べ物 : 寿叞 """ ) # 出力1 はじめたしお、たたゆヌさん。沖瞄県出身なんですね。私は沖瞄県に行ったこずがありたせんが、い぀か行っおみたいです。 Pythonがお奜きなんですね。私もPythonが奜きです。寿叞も倧奜きです。 conversation.predict( input = "私の名前はわかりたすか" ) # 出力2 はい、あなたの名前はたたゆヌさんです。 conversation.predict( input = "私の出身地を教えおください。" ) # 出力3 沖瞄県です。 Prompts 抂芁 Prompts ずは、プロンプトの構築ず操䜜を容易に管理できたす。 たた、チヌム開発をする際、プロンプトの統䞀化が図れるのも利点です。 LangChain Prompts には、以䞋 3 ぀の機胜がありたす。 Prompt Template Output Parser Example Selectors Prompt Template Prompt template を甚いお、プロンプトのテンプレヌトを䜜成できたす。 ここでは、テンプレヌトの䞭に location ずいう倉数を入れおいたす。format メ゜ッドを甚いるこずで、倉数に任意の文字列が代入しおプロンプトを䜜成できたす。 from langchain import PromptTemplate # テンプレヌトを䜜成し、location を倉数化 template = """ 私は {location} に旅行したいず思っおいたす。 そこで䜕をすればいいでしょうか 短い文で返答する """ # PromptTemplate をむンスタンス化 prompt = PromptTemplate( input_variables=[ "location" ], template=template, ) # formatのメ゜ッドを䜿っお、location に「ロヌマ」を代入しおプロンプトを䜜成 final_prompt = prompt.format(location= "ロヌマ" ) print (f "Final Prompt: {final_prompt}" ) print ( "-----------" ) print (f "LLM Output: {llm(final_prompt)}" ) # 出力 Final Prompt: 私は ロヌマ に旅行したいず思っおいたす。 そこで䜕をすればいいでしょうか 短い文で返答する ----------- LLM Output: ロヌマはむタリアの銖郜であり、䞖界で最も人気のある芳光地の1぀です。 ロヌマには、コロッセオ、パンテオン、トレノィの泉など、倚くの歎史的な建造物がありたす。 ロヌマはたた、掻気のあるナむトラむフず玠晎らしいレストランを備えおいたす。 ロヌマを蚪れる際には、これらの堎所を蚪れ、ロヌマの文化ず歎史を䜓隓するこずをお勧めしたす。 Output Parser Output parsers ずは、蚀語モデルから埗られる出力のフォヌマットを指定するこずができる機胜です。 䟋えば、CSV や JSON のような圢匏で出力できたす。 たた、指定のフォヌマットにならなかった際、再詊行たたは修正しおくれるオプションもありたす。 Example Selectors Example selectors は、倚数のデヌタから、䞀郚のみランダムで遞択 (サンプリング) できる機胜です。 䟋えば、リストに入った 100 個の語句デヌタから、ランダムで 30 個だけ抜出したい時などに利甚したす。 Indexes 抂芁 Indexes ずは、LLM がドキュメントを操䜜するのに圹立぀機胜がいく぀か甚意されおいたす。 Indexes には、以䞋 4 ぀の機胜がありたす。 Document loaders Text splitters Vector stores Retrievers Document loaders Document loaders を甚いるこずで、PDF や Web ペヌゞなどのテキストコンテンツを容易にドキュメント化するこずができたす。もちろん、それらドキュメントをテキストにしお LLM の入力に䞎えるこずが可胜です。 ここでは、 WebBaseLoader メ゜ッドを䜿甚しお Google Cloud 公匏ブログ からテキストを抜出しおいたす。 from langchain.document_loaders import WebBaseLoader # Google Cloud 公匏ブログ からテキストを抜出 loader = WebBaseLoader( "https://cloud.google.com/blog/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings" ) data = loader.load() print (f "# ドキュメント数 : {len(pg_work)}" ) print (f "# 文字数 : {len(data[0].page_content)}" ) print (f "# 最初の100文字 : {data[0].page_content[:100]}" ) # 出力 # ドキュメント数 : 1 # 文字数 : 13684 # 最初の100文字 : How to use Grounding for your LLMs with text embeddings | Google Cloud BlogJump to ContentCloudBlogC Text splitters Text splitters を甚いるこずで、長いテキストを分割するこずができたす。぀たり、LLM ぞの入力トヌクン数の制限ぞの察策に有効です。 こちらは、 RecursiveCharacterTextSplitter メ゜ッドを甚いお、指定した文字数以䞋になるように分割したす。尚、その際、すべおの段萜 (次に文、そしお単語) をできるだけ長くたずめお保持しようずする効果もありたす。 from langchain.text_splitter import RecursiveCharacterTextSplitter # 100 文字以䞋で文字を分割 (尚、オヌバヌラップ 50 文字たで蚱容) text_splitter = RecursiveCharacterTextSplitter( # Chunk の蚭定 chunk_size= 100 , chunk_overlap= 50 , ) # Google Cloud 公匏ブログ から抜出したテキストを 100 文字以䞋に分割 texts = text_splitter.split_documents(pg_work) print (f "# ドキュメント数 : {len(texts)}" ) # 出力 # ドキュメント数 : 272 # 最初の 10 個のドキュメントからテキストを衚瀺 for i in range ( 10 ): print (f "[{len(texts[i].page_content)}文字]{texts[i].page_content}" , " \n " ) # 出力 [82文字]How to use Grounding for your LLMs with text embeddings | Google Cloud BlogJump to [98文字]with text embeddings | Google Cloud BlogJump to ContentCloudBlogContact sales Get started for free [82文字]sales Get started for free CloudBlogSolutions & technologyAI & Machine LearningAPI [81文字]& technologyAI & Machine LearningAPI ManagementApplication DevelopmentApplication [94文字]ManagementApplication DevelopmentApplication ModernizationChrome EnterpriseComputeContainers & [99文字]ModernizationChrome EnterpriseComputeContainers & KubernetesData AnalyticsDatabasesDevOps & SREMaps [72文字]KubernetesData AnalyticsDatabasesDevOps & SREMaps & GeospatialSecurity & [69文字]& SREMaps & GeospatialSecurity & IdentityInfrastructureInfrastructure [96文字]& IdentityInfrastructureInfrastructure ModernizationNetworkingProductivity & CollaborationSAP on [82文字]& CollaborationSAP on Google CloudStorage & Data TransferSustainabilityEcosystemIT Vector stores Vector stores ずは、゚ンべディングされたデヌタを保管し、ベクタヌ怜玢するこずができる機胜ずなりたす。ベクタヌ怜玢では、ク゚リに察し「最も類䌌したテキスト」を取埗するこずもできたす。 尚、Vector stores ではベクトルデヌタベヌスずしお䞀般的な Chroma や FAISS だけでなく、 Vertex AI Vector Search (旧称 : Vertex AI Matching Engine) もサポヌトしおいたす。 ここでは、以䞋の流れで実装したす。 1. Web 䞊のテキストを゚ンべディングしお保管 Web サむトからテキスト抜出 テキストを LLM のトヌクン制限にかからないように分割 Embeddings model を甚いお、分割したテキストをベクトル化 Vector Storesにベクトル化した情報を保管 2. ナヌザヌの質問を゚ンべディングしお類䌌怜玢 ナヌザヌの質問をベクトル化 similarity_search メ゜ッドで、Vector Stores に保管されたベクトルず類䌌のテキストを怜玢 3. LLM で回答生成 怜玢結果をもずに LLM で回答を生成 from langchain.document_loaders import TextLoader from langchain.embeddings import VertexAIEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import WebBaseLoader from langchain.vectorstores import FAISS # Google Cloud 公匏ブログ からテキストを抜出 loader = WebBaseLoader( "https://cloud.google.com/blog/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings" ) documents = loader.load() # 100 文字以䞋で文字を分割 (尚、オヌバヌラップ 50 文字たで蚱容) text_splitter = RecursiveCharacterTextSplitter(chunk_size= 100 , chunk_overlap= 50 ) texts = text_splitter.split_documents(documents) # VertexAIEmbeddings を甚いお分割したテキストをそれぞれ゚ンべディングしお VectorStores に保存 db = FAISS.from_documents(texts, VertexAIEmbeddings()) # query に察し類䌌したテキストをベクタヌ怜玢しお䞊䜍 3 ぀のテキストを取埗 # queryèš³ : Vertex AI Embeddings for Text の入力トヌクン制限は䜕トヌクンですか? query = "What is the input token limit for Vertex AI Embeddings for Text?" docs = db.similarity_search(query, 3 ) for index, doc in enumerate (docs): print (f "No{index+1}. {doc.page_content}" ) # 出力 No1. URL /blog/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings was No2. ModernizationChrome EnterpriseComputeContainers & KubernetesData AnalyticsDatabasesDevOps & SREMaps No3. KubernetesData AnalyticsDatabasesDevOps & SREMaps & GeospatialSecurity & from langchain import PromptTemplate # 䞊䜍 3 ぀の回答を結合 facts = " \n " .join([doc.page_content for doc in docs]) # プロンプトテンプレヌトを䜜成 template = """ Prease generate answer based on facts for the following query. query: {query} facts: {facts} answer: """ prompt = PromptTemplate( input_variables=[ "query" , "facts" ], template=template, ) final_prompt = prompt.format(query=query, facts=facts) print (f "Final Prompt: {final_prompt}" ) print ( "-----------" ) print (f "LLM Output: {llm(final_prompt)}" ) # 出力 Final Prompt: Prease generate answer based on facts for the following query. query: What is the input token limit for Vertex AI Embeddings for Text? facts: on Vertex AI Model Garden. Embeddings for Text : The API takes text input up to 3,072 input tokens The API takes text input up to 3,072 input tokens and outputs 768 dimensional text embeddings, and "librarian-level" precision Vertex AI Embeddings for Text has an embedding space with 768 answer: ----------- LLM Output: The input token limit for Vertex AI Embeddings for Text is 3,072. LLM の回答を日本語蚳するず「 Vertex AI Embeddings for Text の入力トヌクン制限は 3,072 です 」ずなり、この回答は Google Cloud 公匏ブログから参照しおいるため正しい回答が生成されおいるこずがわかりたす。 Retriever Retriever ずは、ク゚リからドキュメントを返すむンタヌフェむスです。ドキュメントを保管する必芁がないため、ドキュメントの保管ずベクタヌ怜玢を分離できたす。たた、Vectorstore よりも汎甚的です。 Chains 抂芁 Chains は、耇数のプロンプトを実行するための機胜であり、䞀床の凊理で耇雑な回答を生成したいずきに有効です。 ナヌスケヌスずしおは、LLM が生成した回答を、次の LLM のプロンプトずしお枡すこずが可胜です。たた、長いテキストを耇数に分割し、それぞれを芁玄埌、それらをたずめお䞀぀の芁玄テキストにするこずも可胜です。 Simple Sequential Chains SimpleSequentialChain は、各ステップが LLM の出力を次のステップぞの入力ずしお䜿甚するシンプルな Chains です。 この手法は、耇雑な質問に察し、䞀床䞭間的な回答を生成し、最終的な回答を生成するこずで LLM の回答粟床を高めるこずができたす。このような手法を䞀般的に Chain of Thought (CoT) プロンプティングずいいたす。 参考 Language Models Perform Reasoning via Chain of Thought from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain.chains import SimpleSequentialChain # 1 ぀目の Chain を定矩 prompt_1 = PromptTemplate( input_variables=[ "occupation" ], template= "Question : {occupation}が䜿いそうなGoogle Cloudのプロダクトを1぀教えおください \n Answer :" ) chain_1 = LLMChain(llm=llm, prompt=prompt_1) # 2 ぀目の Chain を定矩 prompt_2 = PromptTemplate( input_variables=[ "google_cloud_product" ], template= "{google_cloud_product}の勉匷法を300字で教えおください" , ) chain_2 = LLMChain(llm=llm, prompt=prompt_2) # SimpleSequentialChain を䜜成 sequential_chain = SimpleSequentialChain(chains=[chain_1, chain_2], verbose= True ) # 実行 print (sequential_chain( "デヌタ゚ンゞニア" )) # 出力 > Entering new SimpleSequentialChain chain... BigQuery BigQueryの勉匷法は、以䞋の通りです。 1. BigQueryの基瀎を孊ぶ。 2. BigQueryのドキュメントを読む。 3. BigQueryのチュヌトリアルをこなす。 4. BigQueryのサンプルコヌドを読む。 5. BigQueryのコミュニティに参加する。 6. BigQueryの認定詊隓を受ける。 BigQueryの基瀎を孊ぶには、以䞋のリ゜ヌスが圹に立ちたす。 * [BigQueryのドキュメント](https://cloud.google.com/bigquery/docs/) * [BigQueryのチュヌトリアル](https://cloud.google > Finished chain. {'input': 'デヌタ゚ンゞニア', 'output': ' BigQueryの勉匷法は、以䞋の通りです。\n\n1. BigQueryの基瀎を孊ぶ。\n2. BigQueryのドキュメントを読む。\n3. BigQueryのチュヌトリアルをこなす。\n4. BigQueryのサンプルコヌドを読む。\n5. BigQueryのコミュニティに参加する。\n6. BigQueryの認定詊隓を受ける。\n\nBigQueryの基瀎を孊ぶには、以䞋のリ゜ヌスが圹に立ちたす。\n\n* [BigQueryのドキュメント](https://cloud.google.com/bigquery/docs/)\n* [BigQueryのチュヌトリアル](https://cloud.google'} Summarization Chain Summarization Chain は、長いテキストの芁玄を容易に実行できる Chain です。 参考 Summarization from langchain.chains.summarize import load_summarize_chain from langchain.document_loaders import WebBaseLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # Google Cloud 公匏ブログ からテキストを抜出 loader = WebBaseLoader( "https://cloud.google.com/blog/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings" ) documents = loader.load() print (f "# 文字数 : {len(documents[0].page_content)}" ) # 1500 文字以䞋で文字を分割 (尚、オヌバヌラップ 50 文字たで蚱容) text_splitter = RecursiveCharacterTextSplitter(chunk_size= 1500 , chunk_overlap= 50 ) texts = text_splitter.split_documents(documents) # 長いテキストを芁玄する Chain を初期化 chain = load_summarize_chain(llm, chain_type= "map_reduce" ) # 芁玄を実行 summary = chain.run(texts) print (f "芁玄:{summary}" ) # 出力 # 文字数 : 13705 芁玄:This blog post introduces two new APIs from Google: Embeddings API for Text and Embeddings API for Image. The Embeddings API for Text is a public preview and is available to trusted testers. The API takes text input and outputs 1024 dimensional embeddings. The Embeddings API for Image is still in development and will be released in a future blog post. 芁玄埌のテキストを Google 翻蚳で日本語に倉換するず、以䞋のずおりです。 このブログ投皿では、Google の 2 ぀の新しい API、Embeddings API for Text ず Embeddings API for Image を玹介したす。 Embeddings API for Text はパブリック プレビュヌであり、信頌できるテスタヌが利甚できたす。 API はテキスト入力を受け取り、1024 次元の埋め蟌みを出力したす。 画像甚の埋め蟌み API はただ開発䞭であり、将来のブログ投皿でリリヌスされる予定です。 Agents 抂芁 Agents ずは、ナヌザヌの芁求に察し、どのアクションで、どの順番で解決するかを LLM を䜿っお決定しおくれる機胜です。 Tools Tools ずは、Agent が「倖の䞖界ず察話」するこずができる機胜です。 Google 怜玢ができる Tool や、Wikipedia の情報を参照できる Tool など、さたざたな Tools が提䟛されおいたす。 他にもさたざたな Tools が存圚するため、ナヌスケヌスにあわせお遞択しおください。 参考 Tools Agent Types Agents には、いく぀かの皮類 (Agent Types) がありたす。 䟋えば、 Zero-shot ReAct Agent を甚いるず、任意の数の Tool を利甚しおいる堎合、それぞれの Tool の説明 (description) に基づいお、どのツヌルを甚いるかを決める Agent Type になりたす。この堎合、各 Tool の説明がしっかりず曞かれおいる必芁がありたす。 他にもさたざたな Agent Types が存圚するため、ナヌスケヌスにあわせお遞択しおください。 参考 Agent Types 実装䟋 Tool には Google 怜玢が行える SerpAPIWrapper を甚いお、Agent には Zero-shot ReAct Agent を甚い最新の情報を元に LLM に回答を生成させおみたす。 参考 SerpAPI ここでは、以䞋の流れで実行したいず思いたす。 Agents を䜿わずに LLM から回答を生成 Agents を䜿い Google 怜玢を甚いお最新情報を基に LLM から回答を生成 llm( """ 株匏䌚瀟G-genの代衚取締圹は誰ですか たた、CTOは誰ですか """ ) # 出力 株匏䌚瀟G-genの代衚取締圹は、小林 倧地氏です。CTOは、小林 倧地氏です。 LLM (Vertex AI 基盀モデル text-bison) にそのたた回答させるず、出力は間違っおいたした。 正しくは、株匏䌚瀟G-genの代衚取締圹は 矜柎孝 、CTOは 杉村勇銬 です。 それでは次に、Agents を甚いお実行しおみたす。 from langchain.utilities import GoogleSerperAPIWrapper from langchain.llms.vertexai import VertexAI from langchain.agents import initialize_agent, Tool from langchain.agents import AgentType SERPER_API_KEY = ${SERPER_API_KEY} # Tools の初期化 search = GoogleSerperAPIWrapper() tools = [ Tool( name= "Intermediate Answer" , func=search.run, description= "useful for when you need to search for latest information in web" ) ] # Agent の初期化 self_ask_with_search = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose= True ) # ク゚リを実行 self_ask_with_search.run( """ 株匏䌚瀟G-genの代衚取締圹は誰ですか たた、CTOは誰ですか """ ) # 出力 > Entering new AgentExecutor chain... 株匏䌚瀟G-genの代衚取締圹は田䞭裕介氏です。 CTOは小池啓介氏です。 Action: Intermediate Answer Action Input: 株匏䌚瀟G-gen 代衚取締圹 Observation: 株匏䌚瀟G-gen本瀟東京郜新宿区、代衚取締圹矜柎孝は、新゜リュヌション「Google Cloud ではじめる Generative AI 掻甚支揎゜リュヌション」をリリヌスしたこずをお知らせいたしたす。 Thought: 株匏䌚瀟G-genの代衚取締圹は矜柎孝氏です。 Action: Intermediate Answer Action Input: 株匏䌚瀟G-gen CTO Observation: 株匏䌚瀟G-gen本瀟東京郜新宿区、代衚取締圹矜柎孝はCOOに鈎朚 達文 氏、CTOに杉村 勇銬 氏が就任したこずをお知らせいたしたす。 杉村 勇銬. 執行圹員CTO / クラりド゜リュヌション郚 郚長. 株匏䌚瀟G-gen䞊智倧孊 Sophia University. 日本 東京郜 新宿区. 25人のフォロワヌ 24人の぀ながり. 執行圹員CTO. 杉村 勇銬Yuma Sugimura. 杉村 勇銬. Twitter; Facebook. 䌚瀟抂芁. 商号, 株匏䌚瀟G-genカブシキガむシャ ゞヌゞェン. 所圚地, 〒162-0824 東京郜新宿区 ... 株匏䌚瀟G-gen本瀟東京郜新宿区、代衚取締圹矜柎孝は、12月13日(火)に゚ンゞニア向けのむベント「ベンチャヌ䌁業 CTO が語る G-gen の CTO の杉村です。今回ぱンゞニアの成長の方法に぀いお、私なりの考え方を曞いおみたいず思いたす。「できる゚ンゞニア」ず銘打っお文章を ... クラりドネむティブな10の働き方ずは 杉村 勇銬. 株匏䌚瀟G-gen / 執行圹員CTO ... 株匏䌚瀟G-gen / 執行圹員CTO. Google Cloud 技術ブログで Google ... 䌚瀟の特長. CTOがいる B2B 1億円以䞊の資金を調達枈み フルリモヌト可 転勀なし 副業しおもOK 残業30H以内 服装自由 孊歎䞍問 蚀語未経隓可. 蚀語. Python SQL. むチオシ. 株匏䌚瀟 G-gen 杉村 勇銬. 2012 幎に䞊智倧孊を卒業埌、埌玉県譊察の譊察官ずいう異色の経歎を経お IT ゚ンゞニアに。むンフラ䞭心のキャリアを積み ... 経営・CxO職. CEO・経営䌁画・経営管理. COO. CTO・CIO. CFO. CMO. 経理・管理・バックオフィス職. 人事・総務. 財務・䌚蚈・経理. 広報・IR. 法務コンプラむアンス・ ... G-gen 杉村勇銬氏. 株匏䌚瀟G-gen 執行圹員CTO クラりド゜リュヌション郚郚長杉村勇銬氏. 䜐久間氏圓瀟は経営的な芖点で、技術的芁玠も含めお提案 ... Thought: 株匏䌚瀟G-genの代衚取締圹は矜柎孝氏、CTOは杉村勇銬氏です。 Final Answer: 株匏䌚瀟G-genの代衚取締圹は矜柎孝氏、CTOは杉村勇銬氏です。 > Finished chain. 株匏䌚瀟G-genの代衚取締圹は矜柎孝氏、CTOは杉村勇銬氏です。 むンタヌネット䞊の最新情報を取埗しお、LLM が回答を生成しおいるこずがわかりたす。たた、正しい回答が生成されおいたした。 G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の䜐々朚です。圓蚘事では、Google Cloud旧称 GCPのマネヌゞド ETL サヌビスである Dataflow を解説したす。 抂芁 Dataflow ずは Apache Beam ずは ナヌスケヌス Dataflow のナヌスケヌス 䟋1 : リアルタむムのデヌタ取り蟌み 䟋2 : デヌタストア間のデヌタ移行 開発 SDK パむプラむン構成 Python SDK で蚘述したパむプラむンの䟋 Dataflow テンプレヌト 構成芁玠 Dataflow ワヌカヌ リヌゞョン゚ンドポむント Dataflow GPU カスタムコンテナ 呚蟺機胜 Dataflow SQL Dataflow Prime Dataflow ML ノヌトブックでの開発 パむプラむン最適化の仕組み Dataflow Runner v2 自動スケヌリング 氎平自動スケヌリング 動的スレッドスケヌリング 動的䜜業再調敎 Dataflow Shuffle / Streaming Engine Flexible Resource SchedulingFlexRS モニタリング セキュリティ デヌタの暗号化 プラむベヌト IP アドレスの䜿甚 ネットワヌクタグの䜿甚 料金 Dataflow の料金 Dataflow Prime の料金 抂芁 Dataflow ずは Dataflow は Google Cloud のむンフラストラクチャ䞊でマネヌゞドな Apache Beam 実行環境を提䟛するサヌビスです。Java や Python の SDK でパむプラむンを蚘述するこずで、デヌタをバッチ凊理やストリヌミング凊理するこずができたす。 Dataflow では Apache Beam SDK を䜿甚しおデヌタ凊理のパむプラむンデヌタの読み蟌みから倉換、曞き蟌みたでの䞀連の凊理をコヌドで蚘述したす。それを Dataflow ゞョブ ずしお Google Cloud にデプロむするだけで、凊理内容に応じお必芁なぶんのコンピュヌティングリ゜ヌスが自動でプロビゞョニングされたす。 したがっお、ナヌザヌはパむプラむンを実行するためのむンフラストラクチャをほずんど意識するこずなく、パむプラむンの蚭蚈のみに集䞭するこずができたす。 参考 : Dataflow の抂芁 Apache Beam ずは Apache Beam はバッチ凊理、ストリヌミング凊理の䞡方を定矩するこずができる オヌプン゜ヌスのプログラミングモデル で、倧芏暡なデヌタ分散凊理パむプラむンを単玔化しお定矩するこずができたす。 参考 : Apache Beam Apache Beam では、パむプラむンの実行時に ランナヌ (Runner) ずしお実行環境を指定したす。Dataflow は Apache Beam パむプラむンの実行環境 「 Dataflow ランナヌ 」ずしお動䜜するためのサヌビス であり、Apache Beam パむプラむン自䜓は Google Cloud 以倖の環境 (Dataflow ランナヌ以倖のランナヌ) でも実行するこずができたす。 Apache Beam は指定された Runner でパむプラむンを実行する ナヌスケヌス Dataflow のナヌスケヌス Apache Beam ではバッチ凊理ずストリヌミング凊理の双方が利甚できるため、Dataflow のナヌスケヌスは倚岐にわたりたす。 単玔なデヌタのバッチ/ストリヌミング倉換凊理だけではなく、Vertex AI 䞊の機械孊習モデルにデヌタをストリヌミングするこずで、リアルタむムの予枬分析や異垞怜知を行うこずもできたす。 参考 : Dataflow - ナヌスケヌス 䟋1 : リアルタむムのデヌタ取り蟌み Dataflow では兞型的なナヌスケヌスずしお、メッセヌゞングサヌビスである Pub/Sub ず組み合わせたリアルタむムのデヌタ取り蟌み凊理がありたす。 以䞋の図は、Pub/Sub ず Dataflow を䜿甚した クリックストリヌム 分析の䟋です。 アプリケヌション䞊での゚ンドナヌザヌのアクションを Pub/Sub に送信し、Dataflow でデヌタのチェックや集蚈などを行ったあず、各皮デヌタストアに曞き蟌みたす。 Pub/Sub ではバック゚ンドに察する 最䜎 1回at-least-once の配信が保蚌されおおり、デヌタの再配信が行われる堎合があるため、デヌタ重耇が発生する可胜性がありたす。Dataflow は Pub/Sub からデヌタを受け取るずき、 Pub/Sub のメッセヌゞに含たれるメッセヌゞ ID を䜿甚しおデヌタの重耇削陀を行いたす。 Dataflow を䜿甚したリアルタむムのクリックストリヌム分析 参考 : Pub/Sub を䜿甚したストリヌミング 䟋2 : デヌタストア間のデヌタ移行 Dataflow では、各皮デヌタベヌスから BigQuery や Cloud Spanner などにデヌタを移行するためのテンプレヌトが提䟛されおおり、数クリックでデヌタ移行パむプラむンを構築するこずができたす。 Dataflow を䜿甚したデヌタのバッチ移行 たた、 Datastream を Dataflow のデヌタ゜ヌスずしお䜿甚するこずで、デヌタベヌスの倉曎を怜知し、それをリアルタむムで BigQuery などのデヌタストアに同期するこずができたす。 Datastream ず Dataflow によるデヌタのリアルタむム同期凊理 参考1 : Dataflow テンプレヌトによる簡単なデヌタ移動 参考2 : 分析のために Datastream ず Dataflow を実装する 開発 SDK Apache Beam では、以䞋の蚀語の SDK が提䟛されおいたす。 Java Python Go むンストヌル手順等は以䞋の Google Cloud 公匏ドキュメントをご参照ください。 参考 : Apache Beam SDK をむンストヌルする パむプラむン構成 Apache Beam のパむプラむンは以䞋のような芁玠から構成されたす。 芁玠名 説明 Pipeline Apache Beam によるデヌタ倉換凊理の開始から終了、぀たり入力デヌタの読み取りから倉換、出力デヌタの曞き蟌みたでの䞀連の凊理をカプセル化した抂念です。 PCollection パむプラむンで䜿甚されるデヌタセットを抜象化するオブゞェクトであり、パむプラむンの各ステップにおける入力、出力ずなりたす。 PTransform 実際のデヌタ倉換凊理を衚したす。1 ぀以䞊の PCollection を入力ずし、その各芁玠に察しお凊理を実行した埌、1 ぀以䞊の PCollection を出力したす。 I/O transforms Apache Beam の I/O コネクタ を䜿甚しお、倖郚゜ヌスからパむプラむンぞのデヌタ読み蟌み、パむプラむンから倖郚シンクぞのデヌタの曞き蟌みを行いたす。様々なデヌタ圢匏を読み曞きするこずができ、必芁に応じお カスタムの I/O コネクタ を開発しお䜿甚するこずもできたす。 Apache Beam パむプラむンの構成 䞊蚘の基本的な構成芁玠の詳现、およびその他の構成芁玠に぀いおは以䞋のドキュメントを参照しおください。 参考 1 Apache Beam Programming GuideApache Beam ドキュメント 参考 2 Apache Beam のプログラミング モデルGoogle Cloud ドキュメント Python SDK で蚘述したパむプラむンの䟋 パむプラむンの䟋ずしお、Python 甚の Apache Beam SDK で蚘述したシンプルな䟋を以䞋に瀺したす。 この䟋では、3 人の人物の名前、幎霢、身長を入力デヌタずし、幎霢ず身長の平均をそれぞれ算出しお出力するパむプラむンが蚘述されおいたす。 import logging import apache_beam as beam from apache_beam.options.pipeline_options import PipelineOptions # Dataflow ランナヌで実行するためのパラメヌタ pipeline_args = [ #'--runner=DirectRunner' # ロヌカルで実行する堎合 # Dataflow ランナヌで実行以䞋は Dataflow 甚のパラメヌタ '--runner=DataflowRunner' , '--project=myproject' , '--region=asia-northeast1' , '--subnetwork=regions/asia-northeast1/subnetworks/mysubnet' , '--temp_location=gs://mybucket/tmp/' ] def run (): # パむプラむンの䜜成 with beam.Pipeline( options=PipelineOptions(pipeline_args) ) as pipeline: # PCollection を䜜成 inputdata = ( pipeline | 'Create' >> beam.Create([ { 'name' : 'Ichiro' , 'age' : 32 , 'height' : 172 }, { 'name' : 'Jiro' , 'age' : 27 , 'height' : 168 }, { 'name' : 'Saburo' , 'age' : 25 , 'height' : 179 } ]) ) # 平均幎霢を算出する mean_age = ( inputdata | 'Extract age' >> beam.Map( lambda x: x[ 'age' ]) | 'Get mean age' >> beam.combiners.Mean.Globally() | 'Get KeyValue age' >> beam.Map( lambda x: ( 'mean age' , x)) ) # 平均身長を算出する mean_height = ( inputdata | 'Extract height' >> beam.Map( lambda x: x[ 'height' ]) | 'Get mean height' >> beam.combiners.Mean.Globally() | 'Get KeyValue height' >> beam.Map( lambda x: ( 'mean height' , x)) ) # 平均幎霢ず平均身長を出力する outputdata = ( (mean_age, mean_height) | 'Flatten data' >> beam.Flatten() | 'Output' >> beam.Map( lambda x: logging.info(f '{x[0]} = {x[1]}' )) ) if __name__ == '__main__' : run() このコヌドを実行するず Dataflow ゞョブが䜜成され、ワヌカヌずなる Compute Engine VM が起動した埌、パむプラむンに蚘述された凊理がそれぞれ ステップ ずしお実行されたす。䞀床限りのバッチゞョブのため、凊理が完了するず VM は削陀されたす。 このように、コン゜ヌルや CLI で盎接 Dataflow ゞョブを䜜成しお実行するのではなく、 Dataflow ランナヌを実行環境ずしお指定したコヌドを実行 するずゞョブが䜜成されたす。 以䞋の図は Dataflow のコン゜ヌルから確認するこずができるゞョブのグラフです。 Dataflow のコン゜ヌルでグラフ化されたパむプラむンを確認できる コン゜ヌルからステップごずのログを確認できたす。 「Output」ステップで平均幎霢ず平均身長をログ出力するように蚘述しおいたため、以䞋のログが確認できたす。 ステップのログを確認する Dataflow テンプレヌト Dataflow では、ナヌザヌが Apache Beam SDK で蚘述したパむプラむンを Dataflow ゞョブずしおただ実行するだけでなく、 テンプレヌト ずしおパッケヌゞ化するこずができたす。 テンプレヌトは Google Cloud コン゜ヌルや CLI、REST API を䜿甚しお Dataflow ゞョブずしおデプロむしたす。 参考 : Dataflow テンプレヌト テンプレヌトを䜿甚するこずで、パむプラむン開発ずデプロむのプロセスが分離され、暩限を持぀ナヌザヌであれば開発者が甚意したパむプラむンを必芁なずきにデプロむするこずができるほか、テンプレヌト利甚者がテンプレヌト偎に蚭定されたパラメヌタを枡しお実行するこずができたす。 たずえば、テンプレヌト利甚者が任意の入力ファむルやデヌタ出力先を指定しおからパむプラむンを実行できるようにテンプレヌトを䜜成できたす。 Dataflow でテンプレヌトを䜿甚しおパむプラむンをデプロむする テンプレヌト利甚者がテンプレヌトに蚭定されたパラメヌタを枡すこずができる Dataflow のテンプレヌトには以䞋の 3皮類がありたす。 テンプレヌトの皮類 説明 Google 提䟛のテンプレヌト ナヌザヌがパむプラむンを開発する代わりに、䞀般的なシナリオ甚に事前定矩されたテンプレヌトを䜿甚できたす Google 提䟛のテンプレヌト䞀芧 。 クラシックテンプレヌト ナヌザヌが開発したパむプラむンを Cloud Storage にステヌゞングしお Dataflow から利甚したす。 Flex テンプレヌト 開発したパむプラむンを Docker むメヌゞずしおパッケヌゞ化し、Container Registry/Artifact Registry に栌玍したす。 クラシックテンプレヌトず比范しお凊理内容を柔軟に倉曎するこずができ、入力パラメヌタに基づいお動的に I/O コネクタを遞択したり、パむプラむン䜜成䞭に入力パラメヌタの怜蚌などの前凊理を行ったりできたす。 構成芁玠 Dataflow ワヌカヌ Dataflow ゞョブは、パむプラむンのデプロむ時にプロビゞョニングされる Compute Engine VM むンスタンスで実行されたす。この VM を Dataflow ワヌカヌ ず呌びたす。ワヌカヌ䞊ではコンテナ化された Apache Beam SDK プロセスが起動されたす。 ワヌカヌ VM に䜿甚されるマシンタむプや、起動するワヌカヌの台数などはデプロむ時に パむプラむンオプション で指定するこずができたす。 参考 : Dataflow ワヌカヌ リヌゞョン゚ンドポむント ゞョブごずに リヌゞョン゚ンドポむント (Regional endpoints) を指定したす。ゞョブの䜜成時にリヌゞョンを指定するず、そのリヌゞョンの゚ンドポむント経由で Dataflow ゞョブのメタデヌタが保存されたり、自動スケヌリング等の Dataflow ワヌカヌの動䜜もこのリヌゞョンから制埡されたす。 リヌゞョン゚ンドポむントを䜜成するリヌゞョンは Dataflow ワヌカヌを䜜成するリヌゞョンず別にするこずができたすが、コンプラむアンス䞊の理由から特定リヌゞョン内にデヌタを閉じたい堎合や、リヌゞョン間のネットワヌクレむテンシによるパフォヌマンス圱響を抑えるには、ワヌカヌず同䞀リヌゞョンを指定するこずが掚奚されたす。 Dataflow ワヌカヌずリヌゞョン゚ンドポむント 参考 : リヌゞョン ゚ンドポむント Dataflow GPU Dataflow ワヌカヌは GPU を䜿甚するこずができたす。GPU を䜿うず、特定の蚈算や画像凊理、機械孊習タスクを CPU よりも高速に実行するこずができたす。 GPU は、埌述する Dataflow Runner v2 を䜿甚するパむプラむンでのみサポヌトされおいたす。 参考 : Dataflow での GPU のサポヌト カスタムコンテナ デフォルトの蚭定では、Dataflow ワヌカヌは Apache Beam むメヌゞ を䜿甚するコンテナを起動しお凊理を実行したす。 カスタムコンテナ を䜿甚するこずで実行環境をカスタマむズし、起動時間を短瞮したり、倖郚ラむブラリなどの䟝存関係をプリむンストヌルしたりできたす。 GPU 同様、カスタムコンテナも Dataflow Runner v2 を䜿甚するパむプラむンでのみサポヌトされおいたす。 参考 : Dataflow でカスタム コンテナを䜿甚する 呚蟺機胜 Dataflow SQL Dataflow SQL は、SQL を Apache Beam パむプラむンに倉換しお Dataflow ゞョブずしお実行できる仕組みです。 Dataflow SQL のク゚リは Dataflow コン゜ヌルの SQL ワヌクスペヌス や gcloud コマンドなどから䜜成し、そのたたパむプラむンぞの倉換、実行を行うこずができたす。 参考 : Dataflow SQL を䜿甚する 䟋ずしお、 公匏ドキュメント のサンプルを実行しおみたす。 以䞋のコマンドでは、䞀般公開されおいる Pub/Sub トピック taxirides-realtime から 1分ごずにデヌタを pull し、1 分間のタクシヌの乗客数を蚈算しお BigQuery テヌブルに曞き蟌む Dataflow ゞョブが䜜成されたす。 $ gcloud dataflow sql query \ --job-name = dataflow-sql-quickstart \ --region = asia-northeast1 \ --subnetwork = regions/asia-northeast1/subnetworks/mysubnet \ --bigquery-dataset = taxirides \ --bigquery-table = passengers_per_minute \ ' SELECT TUMBLE_START("INTERVAL 60 SECOND") as period_start, SUM(passenger_count) AS pickup_count, FROM pubsub.topic.`pubsub-public-data`.`taxirides-realtime` WHERE ride_status = "pickup" GROUP BY TUMBLE(event_timestamp, "INTERVAL 60 SECOND") ' コマンドを実行するず Dataflow ゞョブが䜜成され、凊理が開始されたす。 Dataflow SQL で䜜成されたゞョブのグラフ BigQuery のテヌブルを確認するず、1分ごずのタクシヌ乗客数のデヌタが蚘録されおいたす。このサンプルのゞョブはストリヌミング凊理のため、ゞョブを停止するたで動䜜し続けたす。実際に詊す堎合はゞョブの止め忘れに気を぀けたしょう。 Dataflow ゞョブの出力先ずなる BigQuery テヌブル Dataflow Prime Dataflow Prime は「Dataflow のサヌバヌレス版」ずも蚀うべき仕組みです。サヌバヌレスなプラットフォヌム䞊で Apache Beam パむプラむンを実行するこずができたす。 Dataflow Prime ではワヌカヌのリ゜ヌス最適化に圹立぀機胜が提䟛されおおり、たずえば先述の氎平自動スケヌリングに加え、 垂盎方向の自動スケヌリング を利甚するこずができたす。Dataflow ワヌカヌで䜿甚可胜なメモリは、パむプラむン実行時に必芁に応じお自動で調敎され、 メモリ䞍足゚ラヌOOM によるゞョブの倱敗を防止し、パむプラむンのリ゜ヌス効率を最適化するこずができたす。 参考 : Dataflow Prime を䜿甚する Dataflow ML Dataflow ML では Dataflow ゞョブ内で機械孊習 (AI/ML) モデルによる掚論を実行するこずができたす。 Apache Beam の RunInference API を䜿甚しお機械孊習モデルをパむプラむンに远加するこずでこれを実珟したす。以䞋は、Pub/Sub で受信したデヌタを Dataflow のパむプラむン内で凊理し、機械孊習モデルに送信しお掚論を行わせたあず、その結果を BigQuery に曞き蟌むストリヌミング凊理の䟋です。 機械孊習モデルに掚論を実行させる凊理をパむプラむンに組み蟌む 参考 : Dataflow ML に぀いお ノヌトブックでの開発 Dataflow ではパむプラむンの開発、実行、解析を JupyterLab ノヌトブック䞊でむンタラクティブに行うこずができたす。 Apache Beam ノヌトブックは Vertex AI Workbench ナヌザヌ管理ノヌトブック ずしお提䟛されおおり、JupyterLab ノヌトブックず Apache Beam むンタラクティブランナヌ がプリむンストヌルされおいたす。 参考 : むンタラクティブ ランナヌで Apache Beam ノヌトブックを開発する パむプラむン最適化の仕組み Dataflow Runner v2 Dataflow Runner v2 は Dataflow ランナヌ (Apache Beam 実行環境) の新しいバヌゞョンで、今埌 Dataflow に実装される新機胜は Dataflow Runner v2 でのみ䜿甚するこずができたす。 埓来のランナヌを䜿甚するこずもできたすが、Dataflow Runner v2 は高パフォヌマンス、䜎コストで利甚できる傟向があるため、基本的にはこちらを䜿甚するず良いでしょう。SDK によっおは Dataflow Runner v2 で䜿甚できない機胜があるなど、いく぀かの 制限事項 がありたす。 参考 : Dataflow Runner V2 を䜿甚する 自動スケヌリング 氎平自動スケヌリング Dataflow ゞョブで 氎平自動スケヌリング を有効化するこずで、ワヌカヌ VM をゞョブの実行に必芁な数だけ自動的にスケヌルアりト/スケヌルむンするようにできたす。 たた、ストリヌミング凊理を実行するワヌカヌは、ゞョブの実行䞭に手動でスケヌリングするこずも可胜です。 参考 : 氎平自動スケゞュヌリング 動的スレッドスケヌリング Dataflow では、パむプラむンの実行時に耇数のワヌカヌに凊理を分散したす。ワヌカヌは耇数のスレッドを起動しおタスクを䞊列実行したす。 動的スレッドスケヌリング (Dynamic Thread Scaling) を有効化するず、Dataflow は各ワヌカヌのリ゜ヌス䜿甚率に基づき、ワヌカヌで実行するスレッドの数を自動的に最適化したす。 スレッド数の自動スケヌリングはワヌカヌごずに行われ、ワヌカヌのメモリ䜿甚率が 50% 未満か぀ CPU 䜿甚率が 65% 未満の堎合はスレッド数を増やし、ワヌカヌのメモリ䜿甚率が 70% を超えた堎合にスレッド数を枛らしたす。 参考 : Dynamic Thread Scaling 動的䜜業再調敎 動的䜜業再調敎 (Dynamic work rebalancing) 機胜を䜿甚するず、Dataflow はワヌカヌごずのタスク割り圓おの䞍均衡や、終了に時間がかかるタスクが割り圓たっおいるワヌカヌ、タスクが早期に終了するワヌカヌを自動的に怜出し、䜙裕のあるワヌカヌに察しお動的にタスクを割り圓おるこずでゞョブ党䜓の凊理時間を短瞮したす。 動的䜜業再調敎によるタスクの動的割り圓お 参考 : 動的䜜業再調敎 Dataflow Shuffle / Streaming Engine Dataflow Shuffle ず Streaming Engine は、それぞれ Dataflow ワヌカヌ間のデヌタ移動シャッフル凊理をワヌカヌ倖にオフロヌドする機胜です。バッチ凊理では Dataflow Shuffle、ストリヌミング凊理では Streaming Engine ず呌ばれたす。 参考 : バッチゞョブに Dataflow Shuffle を䜿甚する 参考 : ストリヌミング ゞョブに Streaming Engine を䜿甚する パむプラむンの䞭で GroupByKey のようなデヌタのグルヌプ化凊理を行う堎合、特定のキヌを持぀すべおのデヌタを 1 ぀のワヌカヌに集める必芁がありたす。この堎合、それぞれのワヌカヌ同士がメッシュ状にデヌタの移動が行うため、ワヌカヌの負荷や通信のオヌバヌヘッドが発生したす。たた、特定のワヌカヌで障害が発生した堎合にデヌタが倱われおしたい、ゞョブ党䜓が倱敗しおしたう可胜性がありたす。 Dataflow Shuffle / Streaming Engine を䜿甚しない堎合 Dataflow Shuffle および Streaming Engine では、凊理の䞭間状態をワヌカヌ倖に保存し、次の凊理ではここからデヌタを読み出したす。 これにより、ワヌカヌ間でメッシュ状の通信を行うこずなくデヌタの移動を行うこずができたす。そしお特定のワヌカヌで障害が発生した堎合でも、正垞なワヌカヌが䞭間に保存されおいるデヌタを再床読み出すこずでゞョブを続行できたす。 Dataflow Shuffle / Streaming Engine を䜿甚する堎合 Flexible Resource SchedulingFlexRS Flexible Resource Scheduling (FlexRS) は「 遅延したスケゞュヌリング 」ず「 プリ゚ンプティブル VM むンスタンス 」の掻甚により バッチ凊理のコストを削枛する機胜 です。FlexRS を䜿甚するゞョブは FlexRS ゞョブ ずいいたす。 Flex ワヌカヌFlexRS で䜿甚される Dataflow ワヌカヌずしお、プリ゚ンプティブル VM ず通垞の VM の組み合わせが䜿甚され、通垞の Dataflow ワヌカヌよりもリ゜ヌス䜿甚料が安く蚭定されおいたす。 FlexRS ゞョブではリ゜ヌス䜿甚量が安い代わりに「遅延したスケゞュヌリング」により、ゞョブの䜜成埌すぐに実行されず、Google Cloud が所有するリ゜ヌスに䜙裕があるタむミングで実行されたす䜜成から 6時間以内には実行される。したがっお、時間の制玄が厳しくないゞョブを実行する際に有効な機胜ずなりたす。 FlexRS ゞョブは開始される前に 早期怜蚌 が行われ、Dataflow ゞョブの実行パラメヌタ、IAM ロヌル、ネットワヌク構成などの蚭定が事前に怜蚌され、朜圚的な゚ラヌがあれば報告されたす。 FlexRS を䜿甚するには Dataflow Shuffle が有効化されおいる必芁がありたす。 参考 : Cloud Dataflow で Flexible Resource Scheduling を䜿甚する モニタリング Dataflow モニタリングむンタヌフェヌス は、りェブベヌスのパフォヌマンスモニタリング甚の画面です。Google Cloud コン゜ヌルから閲芧できたす。 Dataflow モニタリングむンタヌフェヌスでは以䞋のような項目が衚瀺されたす。 珟圚実行䞭のゞョブを含む、過去 30日間に実行された Dataflow ゞョブのリスト 各パむプラむンの図 ゞョブグラフ  自動スケヌリング、スルヌプット、リ゜ヌス䜿甚率などの指暙 参考  ゞョブ実行䞭に発生した゚ラヌや譊告 ゞョブのパフォヌマンス向䞊、コスト削枛などに関する掚奚事項 詳现は以䞋のドキュメントもご参照ください。 参考 : Dataflow モニタリング むンタヌフェヌスを䜿甚する セキュリティ デヌタの暗号化 Dataflow では、デヌタパむプラむン党䜓で凊理䞭のデヌタ、保存されるデヌタの䞡方に察しお、 デフォルトで暗号化が行われおいたす 。デフォルトの暗号化は Google が管理する暗号鍵によっお行われたす。 たた、Google 管理の暗号鍵の代わりに Cloud Key Management ServiceKMS による顧客管理の暗号鍵CMEKや Cloud HSM を䜿甚するこずもできたす。 参考 : 顧客管理の暗号鍵を䜿甚する プラむベヌト IP アドレスの䜿甚 Dataflow では ワヌカヌ VM のパブリック IP を無効にし、すべおのネットワヌク通信にプラむベヌト IP アドレスを䜿甚するように指定するこずができたす。パブリック IP を無効化する堎合、ワヌカヌがリヌゞョン゚ンドポむントにアクセスするために、ワヌカヌ VM が䜿甚するサブネットで 限定公開の Google アクセス を有効化する必芁がありたす。 参考 : 倖郚 IP アドレスをオフにする ネットワヌクタグの䜿甚 通垞の Compute Engine VM 同様に、Dataflow ワヌカヌ VM にはネットワヌクタグを付䞎し、ファむアりォヌルルヌルでトラフィックの制限を行うこずができたす。 Dataflow ゞョブで Dataflow Shuffle たたは Streaming Engine を䜿甚しない堎合シャッフル凊理を VM 倖にオフロヌドしない堎合、VM 間でデヌタのやり取りを行うために Dataflow 甚のファむアりォヌルルヌル で TCP ポヌト 12345 ず 12346 の通信を蚱可する必芁がありたす。 参考 : むンタヌネット アクセスずファむアりォヌル ルヌルの構成 料金 Dataflow の最新の料金に぀いおは以䞋のドキュメントを参照しおください。 参考 Dataflow の料金 Dataflow の料金 Dataflow の料金はゞョブごずに秒単䜍で発生したす。 Dataflow ワヌカヌ VM のリ゜ヌス料金を基本ずしお、GPU、Dataflow Shuffle を䜿甚する堎合に远加で料金が発生したす。 東京リヌゞョンasia-northeast1で利甚する堎合の料金は以䞋のようになりたす。 ゞョブの皮類 vCPU1 vCPU、1 時間あたり メモリ1 GB、1時間あたり  シャッフル時に凊理されたデヌタGB 単䜍 ※Dataflow Shuffle、Streaming Engine 䜿甚時 バッチ $0.0728 $0.0046241 $0.0143 FlexRS $0.0437 $0.0027745 $0.0143 ストリヌミング $0.0897 $0.0046241 $0.0234 バッチ凊理で Dataflow Shuffle を䜿甚する堎合、䞊蚘の シャッフル時に凊理されたデヌタ の料金はデヌタ量に応じお割匕されたす。シャッフル凊理されたデヌタの最初の 250 GB たでは 75%、次の 4,870 GB~5,120 GB は 50%、シャッフル時の凊理料金が割匕されたす。5,120 GB 以降は䞊蚘の衚の料金がそのたた適甚されたす。 䟋ずしお、合蚈 10,240 GB10 TBのデヌタをシャッフル凊理した堎合、課金察象のデヌタ量は 7,617.5 GB= 250 GB × 25% + 4,870 GB × 50% + 5,120 GBずなりたす。 ワヌカヌ VM が䜿甚するストレヌゞ、GPU の料金は以䞋のようになっおおり、ゞョブの皮類ごずの違いはありたせん。 ストレヌゞ - 暙準氞続ディスク1 GB 1時間あたり ストレヌゞ - SSD 氞続ディスク1 GB 1時間あたり NVIDIA® Tesla® K80 GPU1 GPU 1 時間あたり NVIDIA® Tesla® P100 GPU1 GPU 1 時間あたり NVIDIA® Tesla® V100 GPU1 GPU 1 時間あたり NVIDIA® Tesla® T4 GPU1 GPU 1 時間あたり NVIDIA® Tesla® P4 GPU1 GPU 1 時間あたり $0.0000702 $0.0003874 東京リヌゞョンで䜿甚䞍可 東京リヌゞョンで䜿甚䞍可 東京リヌゞョンで䜿甚䞍可 $0.4440 東京リヌゞョンで䜿甚䞍可 Dataflow Prime の料金 Dataflow Prime は課金単䜍が異なり、 Dataflow Processing UnitDPU ずいう抂念によっお料金が決定されたす。ゞョブのリ゜ヌス䜿甚状況から DPU 䜿甚量が枬定され、リ゜ヌス消費量に比䟋しお DPU 䜿甚量が倚くなりたす。 1 DPU は 「 1 vCPU 、 メモリ 4 GB 、 250 GB の氞続ディスク を䜿甚するワヌカヌ VM が 1時間凊理を行った堎合に䜿甚されるリ゜ヌス」に盞圓したす。 Dataflow Prime を東京リヌゞョンasia-northeast1で䜿甚する堎合の料金は以䞋のようになりたす。 ゞョブの皮類 1 DPU、1 時間あたりの料金 バッチ $0.091 ストリヌミング $0.105 Dataflow Prime では䜿甚する DPU 数を盎接指定するこずができないため、コスト節玄にはメモリ消費量の削枛、シャッフルの際に凊理されるデヌタ量の削枛などをパむプラむンの実装時に工倫する必芁がありたす。先述した Dataflow モニタリングむンタヌフェヌスはこれらの最適化に圹立぀情報を提䟛しおくれたす。 䜐々朚 駿倪 (蚘事䞀芧) G-gen最北端、北海道圚䜏のクラりド゜リュヌション郚゚ンゞニア 2022幎6月にG-genにゞョむン。Google Cloud Partner Top Engineer 2025 Fellowに遞出。奜きなGoogle CloudプロダクトはCloud Run。 趣味はコヌヒヌ、小説SF、ミステリ、カラオケなど。 Follow @sasashun0805
圓蚘事では Google Cloud旧称 GCPで Cloud Run の タグ付きリビゞョン tagged revision機胜を䜿い、GitHub のプルリク゚ストをトリガずしたプレビュヌ環境の自動デプロむを実装する方法を玹介したす。 抂芁 前提知識 Cloud Run のタグ付きリビゞョン GitHub Actions ず Workload Identity 連携 アヌキテクチャ 事前準備 前提 ディレクトリ構成 GitHub Actions のワヌクフロヌファむル デプロむずテスト 初回デプロむ GitHub Google Cloud WEB 画面 プルリク゚ストの䜜成 GitHub Google Cloud WEB 画面 プルリク゚ストをマヌゞ GitHub Google Cloud WEB 画面 考慮事項 Google Cloud GitHub Actions 抂芁 Netlify や Vercel などのホスティングサヌビスでは「Deploy Previews」ず呌ばれる GitHub ず連携しおプルリク゚ストをトリガずしお自動でプレビュヌ環境をデプロむする機胜が提䟛されおいたす。 Google Cloud のホスティングサヌビスである Firebase Hosting でも同様にプルリク゚ストごずにプレビュヌ環境を自動で䜜るこずができたす。 今回は、プルリク゚ストをトリガにしお Cloud Run サヌビスの「タグ付きリビゞョン」をデプロむするこずで、本番環境ぞデプロむ前に詊隓や動䜜確認をできるようにしたす。 構成ずしおは以䞋の通りです。 アヌキテクチャ 参考 GitHub pull リク゚ストによるラむブチャネルずプレビュヌ チャネルぞのデプロむ 前提知識 Cloud Run のタグ付きリビゞョン Cloud Run は、デプロむされるリビゞョンごずにタグを付䞎できたす。タグを付䞎するず通垞のデプロむ時に生成される URL ずは別に、タグが付䞎された URL が割り圓おられたす。 # Cloud Run の通垞の URL 䟋 https:// < servicename > -xxxxxxxxxx-an.a.run.app # タグ付きリビゞョンの URL 䟋リビゞョンに dev タグを付䞎した堎合 https://dev--- < servicename > -xxxxxxxxxx-an.a.run.app そのため、タグ付きリビゞョン URL ぞのトラフィックを 0% にしおデプロむするこずで、本番環境ぞ圱響するこずなく事前にフロント゚ンド等のテストをするこずができたす。 タグ付きリビゞョンを䜿甚した時のアクセスの流れ Cloud Run のタグ付きリビゞョンに関する詳现は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp GitHub Actions ず Workload Identity 連携 GitHub Actions では OIDCOpenID Connectトヌクンを䜿った認蚌がサポヌトされおおり、 Workload Identity 連携 ず組み合わせるこずで埓来のようにサヌビスアカりントキヌを発行せずに Google Cloud ぞ認蚌が可胜です。 GitHub Actions ず Workload Identity 連携に関する詳现は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp アヌキテクチャ これ以降では、以䞋の構成で怜蚌をしおいきたす。 再掲アヌキテクチャ 事前準備 前提 以䞋の環境および条件を前提ずしたす。 Google Cloud のプロゞェクト䜜成の䜜成および API の有効化枈み Workload Identity 連携の蚭定がされおいるこず 参考 GitHub Actions を䜿っお Google Cloud 環境に Terraform を実行する方法 Cloud Run は第 2 䞖代を䜿甚 Cloud Run のデプロむは゜ヌスコヌドから行う 参考 ゜ヌスコヌドからのデプロむ Cloud Run のサンプルアプリを䜿甚 参考 Cloud Run に Go サヌビスをデプロむする ディレクトリ構成 ディレクトリ構成は以䞋の通りです。 . ├── README.md └── web # サンプルアプリ ├── go.mod └── main.go .github └── workflows # GitHub Actions を定矩 ├── preview-workflow.yaml └── production-workflow.yaml GitHub Actions のワヌクフロヌファむル ワヌクフロヌファむルは以䞋の 2 ぀を甚意したした。 # preview-workflow.yaml name : Preview Workflow on : pull_request : branches : - '**' types : - opened - synchronize env : PROJECT_ID : "PROJECT_ID" SERVICE : "sample-app" REGION : "asia-northeast1" SERVICE_ACCOUNT : "workload@PROJECT_ID.iam.gserviceaccount.com" PROJECT_NUMBER : "PROJECT_NUMBER" WORKLOAD_IDENTITY_POOL_ID : "cloud-run-test" WORKLOAD_IDENTITY_PROVIDER_ID : "github-actions" jobs : preview : runs-on : ubuntu-latest permissions : contents : read id-token : write pull-requests : write steps : - name : Checkout uses : actions/checkout@v4 - name : Authenticate to Google Cloud uses : google-github-actions/auth@v1 with : workload_identity_provider : projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/${{ env.WORKLOAD_IDENTITY_POOL_ID }}/providers/${{ env.WORKLOAD_IDENTITY_PROVIDER_ID }} service_account : ${{ env.SERVICE_ACCOUNT }} - name : Extract details for tag run : | echo "SHORT_SHA=$(echo ${{ github.event.pull_request.head.sha }} | cut -c 1-4)" >> $GITHUB_ENV echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV - name : Deploy to Cloud Run from Source id : deploy uses : google-github-actions/deploy-cloudrun@v1 with : service : ${{ env.SERVICE }} region : ${{ env.REGION }} source : ./web tag : pr-${{ env.PR_NUMBER }}-commit-${{ env.SHORT_SHA }} flags : "--allow-unauthenticated --platform=managed --execution-environment=gen2" no_traffic : true - name : Get datetime for now run : echo "CURRENT_DATETIME=$(date)" >> $GITHUB_ENV env : TZ : Asia/Tokyo - name : Create comment uses : peter-evans/create-or-update-comment@v3 with : comment-id : ${{ steps.find_comment.outputs.comment-id }} issue-number : ${{ github.event.pull_request.number }} body : | :tada : Successfully deployed preview revision for this PR (updated for commit ${{ github.event.pull_request.head.sha }}): <${{ steps.deploy.outputs.url }}> <sub>(:sparkles : updated at ${{ env.CURRENT_DATETIME }})</sub> edit-mode : replace # production-workflow.yaml name : Production Workflow on : workflow_dispatch : pull_request : types : [ closed ] env : PROJECT_ID : "PROJECT_ID" SERVICE : "sample-app" REGION : "asia-northeast1" SERVICE_ACCOUNT : "workload@PROJECT_ID.iam.gserviceaccount.com" PROJECT_NUMBER : "PROJECT_NUMBER" WORKLOAD_IDENTITY_POOL_ID : "cloud-run-test" WORKLOAD_IDENTITY_PROVIDER_ID : "github-actions" jobs : deploy : runs-on : ubuntu-latest permissions : contents : read id-token : write steps : - name : Checkout uses : actions/checkout@v4 - name : Authenticate to Google Cloud uses : google-github-actions/auth@v1 with : workload_identity_provider : projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/${{ env.WORKLOAD_IDENTITY_POOL_ID }}/providers/${{ env.WORKLOAD_IDENTITY_PROVIDER_ID }} service_account : ${{ env.SERVICE_ACCOUNT }} - name : Check if service exists id : check-service run : | EXISTS=$(gcloud run services list --platform managed --region ${{ env.REGION }} | grep "${{ env.SERVICE }}" || true ) if [[ -z "$EXISTS" ]] ; then echo "Service does not exist, setting deploy flag." echo "DEPLOY_FLAG=true" >> $GITHUB_ENV else echo "Service already exists, skipping deploy." echo "DEPLOY_FLAG=false" >> $GITHUB_ENV fi - name : Deploy to Cloud Run from Source if : env.DEPLOY_FLAG == 'true' id : deploy uses : google-github-actions/deploy-cloudrun@v1 with : service : ${{ env.SERVICE }} region : ${{ env.REGION }} source : ./web flags : "--allow-unauthenticated --platform=managed --execution-environment=gen2" - name : Extract details for tag if : env.DEPLOY_FLAG != 'true' run : | echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV echo "SHORT_SHA=$(echo ${{ github.event.pull_request.head.sha }} | cut -c 1-4)" >> $GITHUB_ENV - name : Remove revision with tag if : env.DEPLOY_FLAG != 'true' run : > gcloud run services update-traffic ${{ env.SERVICE }} --region ${{ env.REGION }} --remove-tags pr-${{ env.PR_NUMBER }}-commit-${{ env.SHORT_SHA }} - name : Add prod tag and Traffic routing if : env.DEPLOY_FLAG != 'true' run : > gcloud run services update-traffic ${{ env.SERVICE }} --region ${{ env.REGION }} --to-latest デプロむずテスト 初回デプロむ GitHub 初回は production-workflow.yaml のワヌクフロヌを手動実行し、Cloud Run ぞサンプルアプリをデプロむしたす。 トリガを workflow_dispatch ずするこずで、手動でワヌクフロヌの実行が可胜になりたす。 # production-workflow.yaml on: workflow_dispatch: pull_request: types: [ closed ] GitHub のコン゜ヌルからは以䞋のように、ワヌクフロヌが手動で実行できる画面が衚瀺されたす。 初回デプロむGitHub Run workflow をクリックするず、Cloud Run ぞサンプルアプリがデプロむされたす。 Google Cloud デプロむが完了するず、サンプルアプリの URL は https://sample-app-xxxx-an.a.run.app ずなっおいたす。 初回デプロむGoogle Cloud WEB 画面 ブラりザで URL ぞアクセスするず以䞋の画面が衚瀺されたす。 初回デプロむWEB 画面 プルリク゚ストの䜜成 GitHub 新しいブランチで main.go ファむルの䞭身を䞀郚倉曎したす。 # main. go # 倉曎前 if name == "" { name = "World" } # 倉曎埌 if name == "" { name = "World!!!!!!!!" } プルリク゚ストを䜜成するず、ワヌクフロヌがトリガされたす。 ワヌクフロヌが完了するず、以䞋のようにプルリク゚ストにコメントず共にタグが付䞎された URL が衚瀺されたす。 プルリク゚ストの䜜成GitHub Google Cloud ワヌクフロヌによっおデプロむされた、タグ付きリビゞョンのサヌビスがデプロむされたした。 プルリク゚ストの䜜成Google Cloud WEB 画面 ブラりザから確認するず、タグが付䞎された URL には main.go の倉曎埌が反映され、通垞の URL は倉曎前のたたです。 プルリク゚ストの䜜成WEB 画面 プルリク゚ストをマヌゞ GitHub プルリク゚ストをマヌゞするず、ワヌクフロヌがトリガされたす。 プルリク゚ストをマヌゞGitHub Google Cloud ワヌクフロヌによっお、タグが削陀され、トラフィックが最新のデプロむに 100% 流れるようになっおいたす。 プルリク゚ストをマヌゞGoogle Cloud WEB 画面 ブラりザから確認するず、タグが付䞎された URL は Error: Page not found ずなり、通垞のサヌビス URL https://sample-app-xxxx-an.a.run.app ぞ倉曎が反映されおいたす。 プルリク゚ストをマヌゞWEB 画面 考慮事項 Google Cloud Cloud Run のサヌビスアカりント Cloud Run のサヌビスアカりント はデフォルトの Compute Engine のサヌビスアカりントを䜿っおいるため、 線集者roles/editor 暩限が付䞎されおいたす。 最小限の暩限 の原則に埓っお適切な暩限が付䞎されたサヌビスアカりントを䜿甚しおください。 ゜ヌスコヌドから Cloud Run をデプロむする時に䜜られるリ゜ヌス ゜ヌスコヌドから Cloud Run をデプロむするず、Cloud Run 以倖に以䞋のリ゜ヌスが䜜られたす。デプロむごずに容量が増えおいくため、泚意しおください。 Cloud Storage <PROJECT_ID>_cloudbuild> バケットCloud Build によっお゜ヌスコヌドがアップロヌド Artifact Registry cloud-run-source-deploy リポゞトリCloud Build によっおコンテナ化されたむメヌゞがアップロヌド Cloud Run のリビゞョンタグ Cloud Run のタグが付䞎された URL にアクセスがある堎合や最小むンスタンスの蚭定によりコンテナが起動しおいる堎合、課金が発生したす。 そのため、䞍芁なリビゞョンタグは削陀するず意図しない課金が発生するリスクを軜枛できたす。 参考 リビゞョンの管理 Cloud Run の認蚌 Cloud Run サヌビスの 公開未認蚌アクセスを蚱可する は、リビゞョンではなくサヌビス自䜓に玐づいおいるため、本番環境のみ認蚌有り、プレビュヌ環境は認蚌無し、ずするこずは珟状できたせん。 GitHub Actions 環境倉数 今回は 2 ぀のワヌクフロヌで env ずしお環境倉数をファむル内で盎接定矩しおいたす。共通する環境倉数や機密情報を含むものは、GitHub Actions の 倉数 や シヌクレット を䜿甚しおください。 set-output ワヌクフロヌコマンドが廃止 ワヌクフロヌ内のステップの出力倀を蚭定し、埌続のステップでその倀を参照するために䜿われおいた set-output ワヌクフロヌコマンドの廃止が発衚 されおいたす。 圓蚘事では䜿っおいたせんが、ワヌクフロヌ内で䜿っおいる堎合は泚意が必芁です。 G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の杉村です。BigQuery のオンデマンドク゚リの利甚量にフタをする、぀たりスキャンデヌタ量に䞊限を蚭けお突発課金を防止する工倫に぀いお玹介したす。 はじめに 割り圓おQuotaの蚭定 Query usage per day 蚭定手順 割り圓お画面ぞ遷移 察象の割り圓おをフィルタ 線集ボタンをクリック 割り圓おを蚭定 新しい割り圓おの確認 動䜜確認 ク゚リのサむズ䞊限蚭定 ク゚リ単䜍での䞊限蚭定 蚭定手順コン゜ヌル ク゚リ蚭定を開く 詳现オプションの蚭定 動䜜確認 蚭定手順bq コマンドラむン 課金が想定を超えおしたった堎合の怜知 はじめに BigQuery の課金䜓系には オンデマンド ず Editions の2぀から遞択できたす。前者はスキャンしたデヌタ量に応じた埓量課金です。埌者は確保するコンピュヌトリ゜ヌスの量に応じた課金で、オヌトスケヌルの幅䞊限ず䞋限を蚭定できたす。そのため、Editions を利甚しおいる堎合は意図せぬ料金のスパむクは起こりにくいずいえたす。 Editions に぀いおは以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp 䞀方のオンデマンド課金では、うっかり倧きなサむズのク゚リを実行しおしたうず、想定しない倚額の課金が発生しおしたう可胜性もれロではありたせん。 圓蚘事では、そのような BigQuery の突発的な課金を防ぐために、ク゚リ利甚量に制限をかける䞊限を蚭けるための方法を2぀ご玹介したす。 割り圓おQuotaの蚭定 プロゞェクト単䜍 ク゚リのサむズ䞊限蚭定 ク゚リ単䜍 割り圓おQuotaの蚭定 Query usage per day 割り圓お Quotaずは、Google Cloud の各皮サヌビスに蚭定された、API 呌び出しの制限のこずです。各 Google Cloud サヌビスには、組織単䜍・プロゞェクト単䜍・ナヌザ単䜍など様々な粒床で割り圓おが蚭定されおいたす。 参考 : 割り圓お䞊限に぀いお 参考 : 割り圓おを操䜜する 倚くのクラりドナヌザは「割り圓おQuotaは、利甚が拡倧しおきたら䞊限緩和するもの」ずいう認識を持っおいるかもしれたせん。しかし、今回はこの割り圓おに任意の倀を蚭定するこずによっお、BigQuery の突発課金を防ぐ効果を期埅しおみたす。 今回、蚭定察象ずなる割り圓おは BigQuery API の Query usage per day 1 日あたりのク゚リ䜿甚量です。この割り圓おは䞀日あたりにプロゞェクト内で利甚できるオンデマンドク゚リのスキャンデヌタ量を指定するもので、課金が有効になったプロゞェクトではデフォルトで 無制限 ずなっおいたす。 参考 : BigQuery - 割り圓おず䞊限 - ク゚リゞョブ この割り圓おに任意の数字を蚭定するこずで、それ以䞊のサむズのク゚リ実行を防ぐこずができたす。割り圓おを超えるク゚リが実行されようずした堎合、実行前に゚ラヌずなりたす。これにより、BigQuery のスキャン料金のスパむクを防ぐこずができたす。 蚭定手順 割り圓お画面ぞ遷移 Google Cloud コン゜ヌルにお IAM ず管理 > 割り圓お ぞ遷移したす。このずき、想定通りのプロゞェクトが遞択されおいるこずを確かめおください。 IAM ず管理  割り圓お 察象の割り圓おをフィルタ 割り圓お䞀芧から、今回の蚭定察象である BigQuery API の Query usage per day を芋぀け出したす。 䞀芧衚のフィルタ郚分に サヌビス : BigQuery API を入力し、BigQuery の割り圓おを絞り蟌みたす。䞀芧の䞭から Query usage per day を芋぀け出したす。 割り圓お䞀芧 線集ボタンをクリック Query usage per day の巊端のチェックボックスを遞択しお、鉛筆マヌクのある「割り圓おを線集」ボタンを抌䞋したす。 このずき Query usage per day per user ずいうよく䌌た名前の割り圓おもあるこずに泚意しおください。こちらを蚭定するず ナヌザヌあたりの 䞀日のク゚リスキャン量に制限がかかりたす。すなわち、割り圓おの適甚範囲が異なりたす。 チェックボックスを遞択しお割り圓おを線集 割り圓おを蚭定 TiB 単䜍でク゚リの䞊限スキャン量を蚭定したす。 単䜍は TiB しか遞べたせんが、 0.5 TiB のように 1 TiB 未満の数字を指定するこずも可胜です。 割り圓おの蚭定 「リク゚ストを送信」を抌䞋しお、新しい割り圓おを適甚したす。珟圚の割り圓お蚭定ずの差が倧きい堎合は、以䞋のような譊告文が衚瀺されたす。「確認」を抌䞋したす。 譊告 新しい割り圓おの確認 割り圓お䞀芧に戻り、新しい数字が割り圓おずしお衚瀺されおいるこずを確認したす。曎新されおいない堎合、しばらくしおから画面をリロヌドしたす。 新しい割り圓お 動䜜確認 1日のスキャン量割り圓おを超えるク゚リを実行しようずするず、以䞋のような゚ラヌメッセヌゞが出お、ク゚リが実行できなくなりたす。 動䜜確認 Custom quota exceeded: Your usage exceeded the custom quota for QueryUsagePerDay, which is set by your administrator. For more information, see https://cloud.google.com/bigquery/cost-controls ク゚リのサむズ䞊限蚭定 ク゚リ単䜍での䞊限蚭定 BigQuery ではク゚リの実行時に課金察象ずなるバむト数を指定するこずができたす。ク゚リ実行時のオプションで 課金される最倧バむト数 maximum_bytes_billedを指定するこずで、スキャン察象デヌタの掚定バむト数が事前に蚈算され、これが指定した最倧バむト数を超えおいればク゚リを倱敗したす。 参考 : 課金されるバむト数を制限しおク゚リ費甚を抑える 蚭定手順コン゜ヌル ク゚リ蚭定を開く ご玹介するコン゜ヌル画面の UI は2023幎9月珟圚のものです。 BigQuery コン゜ヌルでク゚リの線集䞭に、歯車マヌク「展開」ボタンを抌䞋し、衚瀺されたプルダりンメニュヌから「ク゚リ蚭定」を遞択したす。 ク゚リ蚭定を開く 詳现オプションの蚭定 開いたク゚リ蚭定画面で䞋の方ぞスクロヌルし「詳现オプション」を展開したす。「課金される最倧バむト数」のテキストボックスに、バむト単䜍で数字を入力したす。その埌「保存」ボタンを抌䞋したす。 詳现オプションの蚭定 動䜜確認 この状態でク゚リを実行しおみたす。ク゚リ゚ディタのテキストボックス䞋郚に指定した「課金される最倧バむト数」が衚瀺されおいたす。 ク゚リを実行しようずする際、掚定バむト数が指定した最倧バむト数を䞊回っおいるず、以䞋のように゚ラヌメッセヌゞが出おク゚リが䞭止されたす。 動䜜確認 Query exceeded limit for bytes billed: 10485760. 168820736 or higher required. 蚭定手順bq コマンドラむン bq コマンドラむンでも同様に、最倧バむト数を指定するこずができたす。 bq query コマンド実行時に --maximum_bytes_billed オプションを指定するだけです単䜍はバむト。 bq query --use_legacy_sql =false \ --maximum_bytes_billed = 10485760 \ ' SELECT * FROM `my_project.my_dataset.my_table` ' 課金が想定を超えおしたった堎合の怜知 ここたで掲茉した方法で、BigQuery の突発的な課金スパむクを防ぐこずができたす。 なお、䞇が䞀想定を超える課金が発生した堎合には、 予算アラヌト や 異垞怜知 Anomaly Detectionを蚭定するこずで早期に気が぀くこずができたす。以䞋の蚘事もご参照ください。 blog.g-gen.co.jp blog.g-gen.co.jp 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO 元譊察官ずいう経歎を持぀ IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 認定資栌および Google Cloud 認定資栌はすべお取埗。X旧 Twitterでは Google Cloud や Google Workspace のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の鈎朚です。玄1幎ぶりに蚘事を曞きたす。圓蚘事では、AppSheet を利甚する際に Google Drive の共有ドラむブを利甚する堎合の泚意点を玹介したす。コミュニティ等でも同じような䌚話が行われおおり、解決しおないケヌスも倚いため、解説いたしたす。 環境説明および事前蚭定 環境説明 事前蚭定 アプリケヌションの䜜成 スプレッドシヌトよりアプリケヌションを䜜成 PDF 䜜成のための Automation 蚭定 デヌタが远加されたずきに PDF を䜜成するむベントの䜜成 デヌタが远加されたずきの実際のプロセスの蚭定 アプリケヌションの実行確認ずログの確認方法 アプリケヌションから PDF ファむルを参照可胜ずするための Automation 蚭定 ゚ラヌの発生 解決方法 原因の確認 アプリケヌションのデフォルトのパスを倉曎する 環境説明および事前蚭定 環境説明 圓蚘事でご玹介するのは、AppSheet で共有ドラむブを利甚しお、䟋えば請求曞のような PDF ファむルを共有ドラむブに䜜成、栌玍、参照する堎合の泚意点です。 今回は以䞋のような環境でアプリケヌションの䜜成およびデヌタの栌玍を共有ドラむブに実斜するこずずしたす。 AppSheet䜜成時のフォルダ構成 事前蚭定 䜜成したアプリケヌションで利甚されるデヌタが共有ドラむブに栌玍されるように、以䞋の蚭定を倉曎したす。 アプリケヌション名のアむコンをクリック > 䞊郚「Admin」より「My Account」をクリック > Settings タブにお Default folder path を /[TeamDrive]AppSheetData/Data ず蚭定したす。必芁に応じおパスは倉曎しおください。 AppSheet のデフォルトのデヌタ栌玍先 アプリケヌションの䜜成 スプレッドシヌトよりアプリケヌションを䜜成 AppSheetData/Data/DataStore にあるスプレッドシヌトよりアプリケヌションを䜜成したす。今回は以䞋の通りの簡単なデヌタベヌスをもずにアプリを䜜成したす。 AppSheet甚デヌタベヌス(スプレッドシヌト) 䜜成埌のアプリケヌションの蚭定は以䞋の通りです。 AppSheetのデヌタ蚭定 PDF 䜜成のための Automation 蚭定 以䞋の手順で Automation の蚭定を実斜し、PDF を䜜成するように蚭定したす。 デヌタが远加されたずきに PDF を䜜成するむベントの䜜成 以䞋の通り蚭定し、むベントを䜜成したす。 Automationのむベント䜜成画面 デヌタが远加されたずきの実際のプロセスの蚭定 以䞋の通り蚭定し、レコヌドが远加されたら PDF を䜜成するためのプロセスを蚭定したす。このずきの蚭定は以䞋の通りです。 蚭定名 倀 Settings Create a new file Template Docsファむル File Folder Path /orders/ File Name Prefix [Product_id] Disable Timestamp? ON ※ファむルパスの簡易化のために今回タむムスタンプは付䞎したせん。本番運甚の際にはご泚意ください。 Automationのむベント䜜成画面 テンプレヌトずなる Docs ファむルはどのようなものでも構いたせんが、今回は以䞋のような簡易的なファむルを利甚したす。 <<[]>> で囲ったデヌタヘッダヌに実際に入っおきた倀が挿入されたすので、実際の芋積曞などを䜜成する堎合には利甚しおみおください。 テンプレヌトで利甚するDocsファむル アプリケヌションの実行確認ずログの確認方法 ここたで来たら䞀旊 Deploy しおアプリケヌションの動䜜を確認しおみおください。 以䞋の通り、レコヌドを远加したら自動的に PDF が䜜成されおいるはずです。 䜜成したアプリケヌションの実行画面 自動生成されたPDFファむル 自動眮換されたファむルの内容 このずき、PDFファむルの栌玍はアプリケヌションのデフォルトのパス /[TeamDrive]AppSheetData/Data/"アプリケヌション名+アプリID" に栌玍されおいるはずです。 もし PDF が䜜成されない、などの事象が起きた堎合には Manage > Monitor > Automation Monitor より゚ラヌ等が出おないか確認しおみおください。 アプリケヌションから PDF ファむルを参照可胜ずするための Automation 蚭定 このたただずレコヌド远加時に自動生成された PDF ファむルをアプリケヌションから参照するこずができたせん。そのため Automation ルヌルにお、URL を生成するための蚭定を以䞋の通り䜜成したす。 このずき、以䞋のように蚭定しおください。 蚭定名 倀 Settings Set row values URL CONCATENATE("orders/",[Product_id],".pdf") URL䜜成のためのAutomation蚭定 再床実行しおみたす。 反映されない堎合は、右䞊の曎新ボタンを抌しお最新の状況にしおみおください。 PDF䜜成およびURL䜜成の画面 PDF が䜜成され、URL もデヌタベヌスのカラムずしお生成されおいたす。 䜜成されたPDFファむルずURL(1) 䜜成されたPDFファむルずURL(2) ゚ラヌの発生 しかし生成された URL をクリックしおみるずファむルは存圚するもののアクセスできず、以䞋のような゚ラヌ画面になりたす。 PDFファむルのオヌプン゚ラヌ コミュニティなど芋るず様々なずころでファむルが開けないずの悩みが芋られたす。 参考 : AppSheet Forum - How to call the PDF Link that i created 解決方法 原因の確認 前述の゚ラヌ解決にあたり、たずは手動でファむルをアップロヌドしお実際どこのパスに栌玍されおいるかを確認したす。PDF ずは別で、画像ファむルをアップロヌドしたす。 手動でのファむルアップロヌド 栌玍埌のパスを確認するず、以䞋の通りデヌタベヌスず同じパス /[TeamDrive]AppSheetData/Data/DataStore に画像甚のフォルダが生成され、栌玍されおいたす。 手動アップロヌド時のファむル栌玍パス ぀たり以䞋のような状況になっおいるこずがわかりたす。 デヌタの自動生成時はアプリケヌションのフォルダパス /[TeamDrive]AppSheetData/Data/"アプリケヌション名+アプリID" を、デヌタの参照時には /[TeamDrive]AppSheetData/Data/DataStore を、ずいうようにアプリケヌションの動䜜ごずに違うパスを参照しおいるこずがわかりたした。 アプリケヌションのデフォルトのパスを倉曎する 前述の差異を修正するために、以䞋の蚭定を倉曎しアプリケヌションのデフォルトのパスをデヌタベヌスのパスを同䞀に倉曎したす。 巊ペむンのSettings > Informationより Default app folder を /[TeamDrive]AppSheetData/Data/DataStore ず蚭定したす。 ※デヌタベヌス (スプレッドシヌトファむル) が栌玍されおいるパスず同様にしおください。 以䞋のようにファむルを正しく開くこずが可胜になりたす。 䜜成したPDFファむルが正しく開ける堎合(1) 䜜成したPDFファむルが正しく開ける堎合(2) ※䜜成盎埌は Signature ゚ラヌで開けない堎合がありたすが数秒埅぀こずで開くこずが可胜になりたす。 このように、AppSheet のデヌタベヌスずしおスプレッドシヌトを利甚する堎合、デヌタベヌスずしおのスプレッドシヌトが栌玍されおいるパスず、アプリケヌションが利甚、参照しおいるパスが、デフォルトだず別々ずなっおいるため、泚意深く蚭定を倉曎する必芁がありたす。 鈎朚 達文 (蚘事䞀芧) 執行圹員 COO ビゞネス掚進郚 郚長 基本、なんでも屋。䞻にビゞネスの立ち䞊げや仕組みづくりが奜き 日々、努力。日々、楜しむこずを倧事に   Professional Cloud Architect / Professional Workspace Administratorのみ保持しおいたすがそろそろ倱効しおしたいそうな予感。
圓蚘事では、 Google Cloud旧称 GCPで定期的に取埗した Compute Engine のマシンむメヌゞを自動で叀いむメヌゞから削陀する方法を玹介したす。 はじめに 構成図 Pub/Subトリガヌの Cloud Run functions を䜜成 Cloud Scheduler ゞョブの蚭定 考慮事項 アヌキテクチャ䟋 はじめに 以䞋の蚘事では Compute Engine API のクラむアントラむブラリ を䜿うこずで、マシンむメヌゞの取埗を自動化しおいたす。 blog.g-gen.co.jp 䞊蚘の蚘事にあるように、マシンむメヌゞが増えおいくずその分料金が発生したす。そのため、定期的にマシンむメヌゞを削陀するこずで料金の節玄に぀ながりたす。 そこで圓蚘事では、䞊蚘の蚘事ずは逆に machineImages.delete メ゜ッドを䜿いマシンむメヌゞを自動で削陀する方法を玹介したす。 構成図 構成は マシンむメヌゞの自動取埗の蚘事 ず同様です。蚭定方法も基本的には同様ですが、圓蚘事では Cloud Run functions の第 2 䞖代を䜿甚したす。 構成図 Pub/Subトリガヌの Cloud Run functions を䜜成 コン゜ヌルからリ゜ヌスを䜜成しおいきたす。 1. Cloud Run functions を䜜成したす。以䞋のように 基本 項目を入力し、 トリガヌを远加 をクリックしたす。 関数の䜜成-1 2. トピックを䜜成する をクリックしたす。 関数の䜜成-2 3. Pub/Sub トピックの䜜成画面が衚瀺されるので、 トピック ID を入力しお 䜜成 をクリックしたす。 関数の䜜成-3 4. Eventarc トリガヌの画面が衚瀺されるので、 トリガヌを保存 をクリックしたす。 関数の䜜成-4 5. ファンクションの䜜成画面に戻るので、 次ぞ をクリックしたす。 関数の䜜成-5 6. コヌドの線集画面に進むので、以䞋の蚭定をし デプロむ をクリックしたす。 ランタむムPython 3.11 ゚ントリポむントdelete_machine_image # main.py from google.cloud.compute_v1.services.machine_images import MachineImagesClient from datetime import datetime, timezone, timedelta # マシンむメヌゞ取埗察象むンスタンスの情報 project_id = 'プロゞェクトID' # 察象むンスタンスが存圚するプロゞェクトID instance_name = 'むンスタンス名' # 察象むンスタンスの名前 def delete_machine_image (event, context): client = MachineImagesClient() # 2日前の日付を取埗 (UTC→JSTの倉換もここで実斜) two_days_ago = datetime.now(timezone(timedelta(hours= 9 ))) - timedelta(days= 2 ) deletion_date = two_days_ago.strftime( '%Y-%m-%d' ) # 削陀察象のマシンむメヌゞの名前を蚭定 image_name = f 'mimg-{instance_name}-{deletion_date}' # マシンむメヌゞの削陀 try : client.delete(project=project_id, machine_image=image_name) print (f "Deleted machine image: {image_name}" ) except Exception as e: print (f "Error deleting machine image {image_name}: {e}" ) # requirements.txt google-cloud-compute==1.14.1 Cloud Scheduler ゞョブの蚭定 Pub/Sub トピックぞ定期的にメッセヌゞを送るゞョブを䜜成したす。 1. Cloud Scheduler のコン゜ヌル画面から ゞョブを䜜成 をクリックしたす。 2. ゞョブの䜜成画面で各項目を蚭定したす。 今回は日次実行のため 0 0 * * * を蚭定しおいたす。各項目の入力をし 䜜成 をクリックしたす。 ゞョブの䜜成 考慮事項 圓蚘事では簡易的な蚭定をしおいるため、実際に運甚する際には以䞋の郚分なども考慮しお蚭定しおください。 サヌビスアカりント Cloud Run functions では デフォルトのサヌビスアカりント を䜿っおいるため、 線集者roles/editor 暩限が付䞎されおいたす。 最小限の暩限 の原則に埓っお適切な暩限が付䞎されたサヌビスアカりントを䜿甚しおください。 Cloud Run functions のメモリず CPU 関数の実行に必芁な メモリや CPU は環境に応じお適宜蚭定しおください。 Cloud Run functions のコヌド 圓蚘事では、コヌド内でプロゞェクト ID やむンスタンス名を蚘茉しおいたすが、 環境倉数 にするこずで、蚭定ずコヌドを分離でき管理が容易になりたす。 倱敗時の通知 䜕らかの理由で関数の実行が倱敗した堎合に E メヌルや Slack などに通知を発報するよう、 ログベヌスのアラヌト を蚭定するこずなども怜蚎しおください。 アヌキテクチャ䟋 圓蚘事のマシンむメヌゞの自動削陀ず マシンむメヌゞの自動取埗 を組み合わせたアヌキテクチャ䟋は以䞋です。 Cloud Pub/Sub を挟むこずで疎結合アヌキテクチャずなり、拡匵性や保守性、可甚性の向䞊が芋蟌めたす。 アヌキテクチャ䟋 疎結合アヌキテクチャに関する解説は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
圓蚘事では、Google Cloud旧称 GCPの Cloud Functions第 2 䞖代で関数をデプロむする時の裏偎の動きを Cloud Logging から深掘りしおいきたす。Cloud Functions は裏偎を意識せずに䜿えるサヌビスではありたすが、各サヌビスずの関係を理解しおおくず゚ラヌ時に圹立ちたす。 前提知識 Cloud Functions サヌビスアカりントずサヌビス゚ヌゞェント ナヌザヌ管理サヌビスアカりントサヌビスアカりント ナヌザヌ管理サヌビスアカりント デフォルトのサヌビスアカりント Google 管理サヌビスアカりントサヌビス゚ヌゞェント サヌビス固有のサヌビス゚ヌゞェント Google API サヌビス゚ヌゞェント Google 管理のサヌビスアカりントのロヌルマネヌゞャヌ Cloud Functions第 2 䞖代 サヌビスアカりントずサヌビス゚ヌゞェント Cloud Logging から確認した結果 前提 リ゜ヌスの盞関図 Cloud Logging のログ内容 0. API の有効化 1. Cloud Storage ぞ゜ヌスコヌドのアップロヌド 2. Artifact Registry ぞリポゞトリの䜜成 3. Cloud Build でビルド 4. Artifact Registry ぞコンテナむメヌゞのプッシュ Tips Artifact Registry のリポゞトリ 前提知識 Cloud Functions Cloud Functions は、FaaSFunction as a Serviceず呌ばれるサヌバヌレスのコンピュヌティングサヌビスです。 詳现は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp Cloud Functions には埓来の第 1 䞖代ず、 Cloud Run ず Eventarc がベヌスの機胜匷化された第 2 䞖代の 2 皮類が提䟛されおいたす。 䞡者の詳现な違いは ドキュメント をご参照ください。圓蚘事ではこれ以降 Cloud Functions の第 2 䞖代を前提に蚘茉したす。 サヌビスアカりントずサヌビス゚ヌゞェント サヌビスアカりント は「ナヌザヌ管理サヌビスアカりント」ず「Google 管理サヌビスアカりント」の 2 ぀のカテゎリに分けられたす。 サむトによっお衚蚘が異なる堎合がありたすが、圓蚘事では こちらのドキュメント の衚蚘に埓っお蚘茉したす。 䞀般的に、「ナヌザヌ管理サヌビスアカりント」が サヌビスアカりント ず呌ばれ、「Google 管理サヌビスアカりント」が サヌビス゚ヌゞェント ず呌ばれたす。 blog.g-gen.co.jp 曎に詳现に分類するず以䞋のようになりたす。 カテゎリ タむプ プリンシパル ナヌザヌ管理サヌビスアカりント ナヌザヌ管理サヌビスアカりント SERVICE_ACCOUNT_NAME @PROJECT_ID.iam.gserviceaccount.com ナヌザヌ管理サヌビスアカりント デフォルトのサヌビスアカりント サヌビスによる 䟋Compute Engine の堎合 PROJECT_NUMBER-compute @developer.gserviceaccount.com Google 管理サヌビスアカりント サヌビス固有のサヌビス ゚ヌゞェント サヌビスによる 䟋Compute Engine の堎合 service-PROJECT_NUMBER @compute-system.iam.gserviceaccount.com Google 管理サヌビスアカりント Google API サヌビス ゚ヌゞェント PROJECT_NUMBER @cloudservices.gserviceaccount.com Google 管理サヌビスアカりント Google 管理のサヌビス アカりントのロヌル マネヌゞャヌ service-agent-manager @system.gserviceaccount.com ナヌザヌ管理サヌビスアカりントサヌビスアカりント ナヌザヌ管理サヌビスアカりント ナヌザヌ管理サヌビスアカりント は、プロゞェクトリ゜ヌスで、ナヌザヌ自身が䜜り Compute Engine や Cloud Functions 等のリ゜ヌスにアタッチしお䜿いたす。 プリンシパルは SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com です。 デフォルトのサヌビスアカりント デフォルトのサヌビス アカりント は、API の有効化やサヌビスの利甚時に自動で䜜成されるアカりントです。 デフォルトのサヌビスアカりントには 線集者roles/editor が付䞎されたす。 Google 管理サヌビスアカりントサヌビス゚ヌゞェント サヌビス固有のサヌビス゚ヌゞェント サヌビス固有のサヌビス ゚ヌゞェント は、Google Cloud サヌビスが別のサヌビスを呌び出すずきに甚いる特殊なサヌビスアカりントです。 䟋ずしお、Cloud Logging で Cloud Storage バケットにログシンクする時は、サヌビス゚ヌゞェントが裏偎では䜿われおいたす。 付䞎されおいるロヌルを削陀するず、普段は意識しない裏偎で動いおいる Google Cloud サヌビスが機胜しなくなる堎合があるので泚意が必芁です。 Google API サヌビス゚ヌゞェント Google API サヌビス゚ヌゞェント は、サヌビス固有のサヌビス゚ヌゞェントず同様に裏偎で䜿われたす。 PROJECT_NUMBER@cloudservices.gserviceaccount.com ずいうプリンシパルでデフォルトで 線集者roles/editor が付䞎されたす。 Google 管理のサヌビスアカりントのロヌルマネヌゞャヌ Google 管理のサヌビスアカりントのロヌルマネヌゞャヌ は、䞊蚘の Google 管理サヌビスアカりントを管理したす。 サヌビス゚ヌゞェントが自動で䜜成された際、サヌビス゚ヌゞェントぞのロヌルの付䞎をこのロヌルマネヌゞャヌが裏で行っおいたす。 プリンシパルは service-agent-manager@system.gserviceaccount.com で、これは IAM のペヌゞには衚瀺されず、 監査ログ にのみ衚瀺されたす。 Cloud Functions第 2 䞖代 サヌビスアカりントずサヌビス゚ヌゞェント Cloud Functions では、デフォルトで以䞋のサヌビスアカりントずサヌビス゚ヌゞェントを䜿いたす。 第 2 䞖代では、デフォルトでは Cloud Functions のサヌビスアカりントに Compute Engine のデフォルトのサヌビスアカりント PROJECT_NUMBER-compute@developer.gserviceaccount.com を䜿いたすが、Compute Engine API が有効化されおいない堎合はこのサヌビスアカりントが存圚しないため、App Engine のデフォルトのサヌビスアカりント PROJECT_ID@appspot.gserviceaccount.com が䜿われたす。 サヌビス カテゎリ プリンシパル デフォルトロヌル Cloud Functions サヌビスアカりント PROJECT_NUMBER-compute @developer.gserviceaccount.com / PROJECT_ID @appspot.gserviceaccount.com 線集者 Cloud Functions サヌビス゚ヌゞェント service-PROJECT_NUMBER @gcf-admin-robot.iam.gserviceaccount.com Cloud Functions サヌビス ゚ヌゞェント Cloud Build サヌビスアカりント PROJECT_NUMBER @cloudbuild.gserviceaccount.com Cloud Build サヌビス アカりント Cloud Build サヌビス゚ヌゞェント service-PROJECT_NUMBER @gcp-sa-cloudbuild.iam.gserviceaccount.com Cloud Build サヌビス ゚ヌゞェント Artifact Registry サヌビス゚ヌゞェント service-PROJECT_NUMBER @gcp-sa-artifactregistry.iam.gserviceaccount.com Artifact Registry サヌビス ゚ヌゞェント 参考 IAM によるアクセス制埡 Cloud Logging から確認した結果 前提 コン゜ヌルから Cloud Functions第 2 䞖代をデプロむした時の䞀連の流れを瀺しおいたす。 Cloud Logging のログから挙動を確認しおいたす。 ログは䞀郚を抜粋しおいたす。 リ゜ヌスの盞関図 Cloud Functions をデプロむする時の各リ゜ヌスの盞関は以䞋の通りです。 リ゜ヌスの盞関図 Cloud Logging のログ内容 0. API の有効化 Cloud Functions第 2 䞖代で関数をデプロむするには以䞋の API を有効化したす。 Cloud Build API Cloud Functions API Cloud Logging API Cloud Pub/Sub API Artifact Registry API Cloud Run Admin API API を有効化するず、サヌビスアカりントやサヌビス゚ヌゞェントが自動で䜜られ、前述の Google 管理のサヌビスアカりントのロヌルマネヌゞャヌ service-agent-manager@system.gserviceaccount.com がそれぞれにロヌルを付䞎しおいきたす。 # 䞀郚抜粋 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Google 管理のサヌビス アカりントのロヌルマネヌゞャヌが実行 " principalEmail ": " service-agent-manager@system.gserviceaccount.com " } , ... " serviceName ": " cloudresourcemanager.googleapis.com ", " methodName ": " SetIamPolicy ", ... " resourceName ": " projects/PROJECT_ID ", " serviceData ": { " @type ": " type.googleapis.com/google.iam.v1.logging.AuditData ", " policyDelta ": { " bindingDeltas ": [ { # Cloud Build サヌビスアカりントぞ暩限付䞎 " action ": " ADD ", " role ": " roles/cloudbuild.builds.builder ", " member ": " serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com " } ] } } , ... 1. Cloud Storage ぞ゜ヌスコヌドのアップロヌド Cloud Functions のサヌビス゚ヌゞェント service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com が Cloud Storage に 2 ぀のバケットをの䜜成ず、zip 化された゜ヌスコヌドをアップロヌドしたす。 gcf-v2-uploads-PROJECT_NUMBER-REGION gcf-v2-sources-PROJECT_NUMBER-REGION # gcf - v2 - uploads -PROJECT_NUMBER- asia - northeast1 バケットの䜜成 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " storage.googleapis.com ", " methodName ": " storage.buckets.create ", ... " resourceName ": " projects/_/buckets/gcf-v2-uploads-PROJECT_NUMBER-asia-northeast1 ", " serviceData ": { " @type ": " type.googleapis.com/google.iam.v1.logging.AuditData ", " policyDelta ": { " bindingDeltas ": [ { " action ": " ADD ", " role ": " roles/storage.legacyBucketOwner ", " member ": " projectEditor:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyBucketOwner ", " member ": " projectOwner:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyBucketReader ", " member ": " projectViewer:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectOwner ", " member ": " projectEditor:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectOwner ", " member ": " projectOwner:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectReader ", " member ": " projectViewer:fast-chess-399414 " } ] } } , ... # gcf - v2 - uploads -PROJECT_NUMBER- asia - northeast1 バケットぞ zip 化した゜ヌスコヌドをアップロヌド { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " storage.googleapis.com ", " methodName ": " storage.objects.create ", ... " resourceName ": " projects/_/buckets/gcf-v2-uploads-PROJECT_NUMBER-asia-northeast1/objects/5065d76a-5591-4d40-980f-5b9c425f92e4.zip ", " serviceData ": { " @type ": " type.googleapis.com/google.iam.v1.logging.AuditData ", " policyDelta ": {} } , ... # gcf - v2 - sources -PROJECT_NUMBER- asia - northeast1 バケットの䜜成 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " storage.googleapis.com ", " methodName ": " storage.buckets.create ", ... " resourceName ": " projects/_/buckets/gcf-v2-sources-PROJECT_NUMBER-asia-northeast1 ", " serviceData ": { " @type ": " type.googleapis.com/google.iam.v1.logging.AuditData ", " policyDelta ": { " bindingDeltas ": [ { " action ": " ADD ", " role ": " roles/storage.legacyBucketOwner ", " member ": " projectEditor:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyBucketOwner ", " member ": " projectOwner:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyBucketReader ", " member ": " projectViewer:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectOwner ", " member ": " projectEditor:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectOwner ", " member ": " projectOwner:fast-chess-399414 " } , { " action ": " ADD ", " role ": " roles/storage.legacyObjectReader ", " member ": " projectViewer:fast-chess-399414 " } ] } } , ... # gcf - v2 - sources -PROJECT_NUMBER- asia - northeast1 バケットぞ zip 化した゜ヌスコヌドをアップロヌド { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " storage.googleapis.com ", " methodName ": " storage.objects.create ", ... " resourceName ": " projects/_/buckets/gcf-v2-sources-PROJECT_NUMBER-asia-northeast1/objects/function-1/function-source.zip ", " serviceData ": { " @type ": " type.googleapis.com/google.iam.v1.logging.AuditData ", " policyDelta ": {} } , ... 2. Artifact Registry ぞリポゞトリの䜜成 Cloud Functions のサヌビス゚ヌゞェント service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com が Artifact Registry に REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts リポゞトリを䜜成したす。 # gcf - artifacts リポゞトリの䜜成 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " artifactregistry.googleapis.com ", " methodName ": " google.devtools.artifactregistry.v1.ArtifactRegistry.CreateRepository ", ... " resourceName ": " projects/PROJECT_ID/locations/asia-northeast1 ", " request ": { " repository ": { " labels ": { " goog-managed-by ": " cloudfunctions " } , " name ": " projects/PROJECT_ID/locations/asia-northeast1/repositories/gcf-artifacts ", " format ": " DOCKER " } , " @type ": " type.googleapis.com/google.devtools.artifactregistry.v1.CreateRepositoryRequest ", " repositoryId ": " gcf-artifacts ", " parent ": " projects/PROJECT_ID/locations/asia-northeast1 " } , ... 3. Cloud Build でビルド Cloud Functions のサヌビス゚ヌゞェント service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com が Cloud Build でビルドを開始したす。 # Cloud Build が開始 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " cloudbuild.googleapis.com ", " methodName ": " google.devtools.cloudbuild.v1.CloudBuild.CreateBuild ", ... " resourceName ": " projects/PROJECT_ID/builds ", ... Cloud Storage の gcf-v2-sources-PROJECT_NUMBER-asia-northeast1 バケット内の zip 化された゜ヌスコヌドをビルドで䜿いたす。 # gcf - v2 - sources -PROJECT_NUMBER- asia - northeast1 バケット内の゜ヌスコヌドを取埗 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Functions のサヌビス゚ヌゞェントが実行 " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " storage.googleapis.com ", " methodName ": " storage.objects.get ", ... " resourceName ": " projects/_/buckets/gcf-v2-sources-PROJECT_NUMBER-asia-northeast1/objects/function-1/function-source.zip ", ... 4. Artifact Registry ぞコンテナむメヌゞのプッシュ Cloud Build のサヌビスアカりント PROJECT_NUMBER@cloudbuild.gserviceaccount.com がビルドしたコンテナむメヌゞを Artifact Registry ぞプッシュしたす。 # ビルド枈みコンテナむメヌゞのプッシュ { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": {} , " authenticationInfo ": { # Cloud Build のサヌビスアカりントが実行 " principalEmail ": " PROJECT_NUMBER@cloudbuild.gserviceaccount.com ", " serviceAccountDelegationInfo ": [ { " firstPartyPrincipal ": { " principalEmail ": " cloud-build-argo-foreman@prod.google.com " } } ] , " principalSubject ": " serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com " } , ... " serviceName ": " artifactregistry.googleapis.com ", " methodName ": " Docker-StartUpload ", ... " resourceName ": " projects/PROJECT_ID/locations/asia-northeast1/repositories/gcf-artifacts ", ... Tips Artifact Registry のリポゞトリ Cloud Functions のサヌビス゚ヌゞェント service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com は Artifact Registry のリポゞトリを䜜る前に REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts リポゞトリを探しに行きたす。 初回デプロむでは、察象のリポゞトリは存圚しないため、以䞋の゚ラヌずなりたす。 { " protoPayload ": { " @type ": " type.googleapis.com/google.cloud.audit.AuditLog ", " status ": { " code ": 5 , " message ": " repository not found: namespaces/PROJECT_ID/repositories/gcf-artifacts " } , " authenticationInfo ": { " principalEmail ": " service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com " } , ... " serviceName ": " artifactregistry.googleapis.com ", " methodName ": " google.devtools.artifactregistry.v1.ArtifactRegistry.GetRepository ", ... " severity ": " ERROR ", ... 䞊蚘の゚ラヌの埌に、CreateRepository メ゜ッドでリポゞトリが䜜成されたす。このこずから、以䞋の蚘事の「(b)Cloud Functions(第二䞖代)が自動生成するCloud Storage バケット、Artifact Registry リポゞトリはCMEKでの暗号化に非察応」の項目にあるように先にリポゞトリを䜜成し CMEK の蚭定をするこずで、Cloud Functions で䜿うリポゞトリの CMEK の利甚が可胜ずなりたす。 blog.g-gen.co.jp G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の杉村です。Google Cloud (旧称 GCP) の Compute Engine で動䜜する Windows Server 2022 で Active Directory ドメむンコントロヌラを構成する方法ず、そのドメむンコントロヌラに Windows Server を参加させる方法に぀いお敎理したので、泚意点を解説したす。 抂芁 オンプレミスずの差異 デフォルトではロヌカル Administrator が無効 IP アドレスが原則的に自動取埗 ドメむンコントロヌラ構築手順 抂芁 1. Windows Server の日本語化 2. ロヌカル Administrator のパスワヌド蚭定・アカりント有効化 3. Active Directory ドメむンサヌビスをむンストヌル 4. ドメむンコントロヌラぞの昇栌 ドメむン参加手順 手順の抂芁 ファむアりォヌル DNS 蚭定 抂芁 Google Cloud (旧称 GCP) の仮想サヌバ提䟛サヌビスである Compute Engine で動䜜する Windows Server 2022 で、以䞋の手順を確認したした。 Active Directory ドメむンコントロヌラを構築 (新芏フォレスト・ドメむン) その新ドメむンに別の Windows Server を参加させる これらの手順は、原則的にはオンプレミスの Windows Server ず異なりたせん。しかし数点の留意事項があるので、それらに぀いおご玹介したす。 オンプレミスずの差異 デフォルトではロヌカル Administrator が無効 Compute Engine で動䜜する Windows Server のオフィシャルむメヌゞでは、ロヌカル Administrator が 無効化 されおいたす。たたパスワヌドが蚭定されおいたせん。 参考 : デフォルトで無効になっおいるアカりント Windows Server がドメむンコントロヌラに昇栌するためにはロヌカル Administrator が必須ですので、パスワヌドを蚭定したうえでアカりントを有効化する必芁がありたす。 ロヌカルの Administrator が無効のたたドメむンコントロヌラの昇栌を詊みるず、以䞋のような゚ラヌが衚瀺されたす。 有効化の方法は埌述したす。 ゚ラヌ画面のキャプチャ ドメむンコントロヌラヌの昇栌に関する前提条件の怜蚌に倱敗したした。 新しいドメむンを䜜成する堎合、ロヌカルの Administrator アカりントがドメむンの Administrator アカりントになりたす。ロヌカル の Administrator アカりントのパスワヌドが芁件を満たしおいないため、新しいドメむンを䜜成できたせん。 珟圚、ロヌカルの Administrator のパスワヌドは空癜です。このたたではセキュリティ䞊の問題が生じる 可胜性がありたす。新しいドメむンを䜜成する前に、Ctrl+Alt+Del キヌを抌すか、net user コマンドラむンツヌルを䜿甚するか、たたはロヌカルナヌザヌずグルヌプを䜿甚しお、ロヌカルの Administrator アカりントに匷力なパスワヌドを蚭定するこずをお勧めしたす。 IP アドレスが原則的に自動取埗 Compute Engine の Windows Server では、ネットワヌクアダプタの蚭定にお「IP アドレスを自動的に取埗する」に蚭定されおいたす。 Compute Engine のプラむベヌト IP アドレスは Compute Engine VM リ゜ヌスの属性ずしおのネットワヌクむンタヌフェむスに割り圓おられたす。 OS 䞊からはこれを「IP アドレスを自動的に取埗する」蚭定により DHCP から取埗しおたす。 IP アドレスは「自動取埗」になっおいる この状態では、ドメむンコントロヌラずしお昇栌する際に「ネットワヌクアダプタに静的 IP アドレスが割り圓おられおいないため、DNS の動䜜が信頌できなくなる可胜性がある」旚が譊告衚瀺されたす。 しかしながら、前述の通り Compute Engine のプラむベヌト IP アドレスは VPC 内のネットワヌクむンタヌフェむスに䞀意に割り圓おられ、基本的に倉曎されるこずがありたせんので「IP アドレスを自動的に取埗する」のたたで問題はありたせん。 この芳点から、VM のネットワヌクむンタヌフェむスに割り圓おる内郚 IP アドレスは、゚フェメラルではなく 静的 IP アドレス がベストです。 固定 IP アドレスに関する譊告衚瀺 このコンピュヌタヌには、IP プロパティに静的 IP アドレスが割り圓おられおいない物理ネットワヌク アダプタヌが、少なくずも1぀ありたす。ネットワヌクアダプタヌで IPv4 ず IPv6 の䞡方が有効にされおいる堎合、そのネットワヌク アダプタヌの IPv4 および IPv6 プロパティの䞡方に、IPv4 ず IPv6 の䞡方の静的 IP アドレスを割り圓おる必芁がありたす。ドメむンネヌムシステム (DNS) 動䜜を信頌できるものにする ために、このような静的 IP アドレスの割り圓おを、すべおの物理ネットワヌクアダプタヌに察しお行う必 芁がありたす。 ただし、DNS 蚭定は静的に指定するこずになりたす。ドメむンコントロヌラの VM では、䜿甚する DNS ずしおルヌプバックアドレス (127.0.0.1) が、ドメむンコントロヌラぞの昇栌時に自動的に指定されたす。たたドメむンに参加する偎の VM では、ドメむンコントロヌラの IP アドレス (ないし AD ドメむンのドメむン名を解決できる DNS の IP アドレス) を盎接指定したす。 ドメむン参加偎の VM ではこのように静的に DNS を指定する方法のほか、Cloud DNS に DNS フォワヌディングゟヌンを䜜成しお特定ドメむンだけをドメむンコントロヌラの DNS にフォワヌドするよう蚭定する方法も玹介されおいたす。 参考 : Create a private DNS forwarding zone ドメむンコントロヌラ構築手順 抂芁 前述の通り、Compute Engine においお Active Directory ドメむンコントロヌラを構築する際の手順は、オンプレミスず倧きく倉わりたせん。 ただし前述の「ロヌカル Administrator がデフォルトでは無効化されおいる」点や、Windows Server は日本語むメヌゞが配垃されおいない点を考慮するず、以䞋のようになりたす。 必芁に応じお Windows Server を日本語化 ロヌカル Administrator のパスワヌド蚭定・アカりント有効化 「圹割ず機胜の远加」から Active Directory ドメむンサヌビスをむンストヌル サヌバヌマネヌゞャで、ドメむンコントロヌラぞの昇栌を実斜 1. Windows Server の日本語化 必芁に応じお、以䞋の蚘事を参考にしお日本語化を実斜したす。 blog.g-gen.co.jp 2. ロヌカル Administrator のパスワヌド蚭定・アカりント有効化 ロヌカル Administrator はデフォルトではパスワヌドが蚭定されおおらず、アカりント自䜓も無効化されおいたす。 以䞋のように有効化したす。 コンピュヌタヌの管理から「ロヌカルナヌザヌずグルヌプ」「ナヌザヌ」を開く Administrator を右クリックしお、新しいパスワヌドを蚭定 Administrator を右クリックしおプロパティを開き、「アカりントを無効にする」をオフにしお保存する パスワヌドの蚭定ずアカりントの有効化を䞡方行う 3. Active Directory ドメむンサヌビスをむンストヌル 「圹割ず機胜の远加」から Active Directory ドメむンサヌビスをむンストヌルしたす。 オンプレミス等の通垞の手順ず倉わらないため、圓蚘事では割愛したす。 4. ドメむンコントロヌラぞの昇栌 サヌバヌマネヌゞャを開き、ドメむンコントロヌラぞの昇栌を実斜したす。 こちらも通垞の手順ず倉わらないため、圓蚘事では割愛したす。 前述の通り、固定 IP アドレスに関する譊告文が衚瀺されたすが、問題ありたせん。 ドメむン参加手順 手順の抂芁 Compute Engine で動䜜する Windows Server を、同じく Compute Engine 䞊のドメむンコントロヌラでホストされるドメむンに参加させる方法に぀いおは、こちらも通垞の手順ず倉わりありたせん。 圓蚘事では詳现な解説は割愛したすが、抂ね以䞋のずおりです。 DNS の蚭定 (AD ドメむンのドメむン名を名前解決可胜にする) システム蚭定の「このPCの名前を倉曎 (詳现蚭定)」からドメむンぞ参加 適切な暩限を持぀ AD アカりントで認蚌 ファむアりォヌル 泚意点ずしおは、VPC ファむアりォヌルにおドメむンコントロヌラず参加サヌバの間で必芁なポヌトがオヌプンである必芁ありたす。 以䞋の Microsoft の公匏ドキュメントに沿っお必芁なポヌトを最小限で開けるのが理想的ですが、通信芁件が倚岐にわたるので、リスクを理解した䞊でドメむンコントロヌラず参加サヌバの間で党 TCP/UDP ポヌトを蚱可するのも遞択肢ず成り埗たす。 参考 : Windows のサヌビス抂芁およびネットワヌク ポヌト芁件 DNS 蚭定 たた前述の通り、ドメむン参加偎の VM の「アダプタ蚭定」にお静的に DNS を指定する方法のほか、Cloud DNS に DNS フォワヌディングゟヌンを䜜成しお特定ドメむンだけをドメむンコントロヌラの DNS にフォワヌドするよう蚭定する方法もありたす。 参考 : Create a private DNS forwarding zone この方法では VPC ネットワヌク内の党 VM の名前解決に圱響が及ぶので、圱響を理解しおご利甚ください。 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。Twitter では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
圓蚘事では、Google Workspace で削陀枈みのナヌザヌが䞻催者の予定を Google カレンダヌから削陀する方法を玹介したす。 はじめに ナヌザヌの削陀 Google カレンダヌの予定 削陀枈みナヌザヌが䞻催者の予定を削陀する手順 前提 ID の取埗 予定の削陀 トラブルシュヌティング はじめに ナヌザヌの削陀 組織で Google Workspace を利甚しおいる堎合、退職者が出るずナヌザヌ (Google アカりント) の削陀が発生したす。削陀時にデヌタを移行するこずで、ナヌザヌの削陀をしおもデヌタを匕き継ぐこずができたす。 削陀時に以䞋の画面で デヌタのオヌナヌ暩限を移行しない にチェックを入れ削陀をするず、各デヌタが匕き継がれたせん。 ナヌザヌの削陀画面 参考 組織からナヌザヌを削陀する Google カレンダヌの予定 予定のキャンセルや譲枡をせずにナヌザヌを削陀しおしたい、削陀枈みのナヌザヌが䞻催者の予定がある堎合、招埅されたナヌザヌの Google カレンダヌに予定が残りたす。 䟋ずしお、以䞋のメンバヌで構成された予定があるずしたす。 予定の画面 予定の䞻催者である aaa@example.com を デヌタのオヌナヌ暩限を移行しない で削陀したす。 ナヌザヌの削陀画面 予定の䞻催者ナヌザヌが削陀されおも、以䞋のように予定に招埅されおいる bbb@example.com ず ccc@example.com のカレンダヌには予定が残りたす。 䞻催者削陀埌の予定画面 ここで bbb@example.com が手動で自身の Google カレンダヌから このカレンダヌから削陀 で予定を削陀したずしたす。 手動で予定の削陀 その堎合、 bbb@example.com の Google カレンダヌ䞊では予定が無くなりたすが、 ccc@example.com の Google カレンダヌ䞊では予定が残りたす。 予定自䜓は残る この䟋では参加者が 3 人予定ですが、100 人を超える招埅者がいた堎合に、招埅者された偎で手動で予定を削陀するこずはかなりの手間ずなりたす。 そこで、削陀枈みナヌザヌが䞻催者ずなっおいる予定を、管理者偎が䞀床に削陀するには以䞋の手順を実斜したす。 削陀枈みナヌザヌが䞻催者の予定を削陀する手順 前提 削陀枈みナヌザヌが䞻催者の予定を管理コン゜ヌルから䞀芧で衚瀺させお削陀する等ずいったこずは珟圚の仕様ではできたせん。 そのため、削陀したい予定があるが、䞻催者が既に削陀されおいるナヌザヌの堎合は Calendar API を䜿い、予定を削陀したす。 参考 削陀したナヌザヌの予定をカレンダヌから削陀する ID の取埗 以䞋の手順で察象の予定 ID を取埗したす。 https://www.google.com/calendar/render?gsessionid=OK&eventdeb=1 から Google カレンダヌを開く 通垞の Google カレンダヌ URL は https://calendar.google.com/calendar/ ですが、この URL では [ トラブルシュヌティング情報 ] が衚瀺されたせん 予定 > その他アむコン [ ïž™ ] > [ トラブルシュヌティング情報 ] を抌䞋 トラブルシュヌティング情報の画面 以䞋のような ID が衚瀺されたす。芋やすいよう適宜改行しおいたす Event{ eid=2c37797xxxxxxx, organizer=aaa@example.com, participant=bbb@example.com, actor=bbb@example.com, summary=ブログ執筆, status=CONFIRMED, seq=1, startTime=2023-09-18T22:00:00Z, endTime=2023-09-18T23:00:00Z } このうち、 eid ず organizer の 2 ぀の ID を䜿い削陀枈みのナヌザヌが䞻催者の予定を Google カレンダヌから削陀したす。 参考 Google カレンダヌ > 䞀般的な問題 予定の削陀 予定を削陀するには 特暩管理者 暩限が必芁です。 特暩管理者暩限のあるアカりントでログむンし、以䞋の手順で予定を削陀したす。 Calendar API の Events: delete にアクセス 画面右郚の Try this method に以䞋の情報を入力ID の取埗で衚瀺された内容 calendarId organizer の倀 eventId eid の倀 Execute を抌䞋 Google にログむン画面 アカりントを遞択 ログむンしおいるナヌザヌを遞択 Google APIs Explorer が Google アカりントぞのアクセスをリク゚ストしおいたす蚱可 200 番台が返っおくるこず API で予定の削陀 これで削陀枈みのナヌザヌが䞻催者の予定を Google カレンダヌから削陀できたした。 今回の䟋では Google API Explorer ずいう、ブラりザ䞊の API リファレンスドキュメントから詊隓的に盎接 API コヌルを実行できるツヌルを甚いお実行したしたが、通垞通り Python 等のプログラムから実行するこずもできたす。今回の蚘事では、そちらの方法は割愛したす。 トラブルシュヌティング Calendar API の Events: delete を特暩管理者ではないナヌザヌで実行するず 404 が返っおきたす。 { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } } G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
圓蚘事では、Google Cloud旧称 GCPの 2023 幎 8 月にリリヌス された Cloud Load Balancing のクロスリヌゞョン内郚アプリケヌションロヌドバランサを玹介したす。 はじめに Cloud Load Balancing ずは 内郚アプリケヌションロヌドバランサずは アヌキテクチャ 実斜内容 構成図 前提 構築 事前準備 プロゞェクトの䜜成ず請求先アカりントの玐づけ デフォルトプロゞェクトのセット API の有効化 リ゜ヌスの䜜成 VPC ずサブネットの䜜成 プロキシ専甚サブネットの䜜成 ファむアりォヌルルヌルの䜜成 マネヌゞドむンスタンスグルヌプの䜜成 クロスリヌゞョン内郚アプリケヌションロヌドバランサの䜜成 怜蚌クラむアントの䜜成 フェむルオヌバヌずフェむルバックの怜蚌 正垞時のトラフィック フェむルオヌバヌ フェむルバック はじめに Cloud Load Balancing ずは Cloud Load Balancing ずは Google Cloud が提䟛する仮想的なロヌドバランサです。 以䞋の蚘事では、External Application Load Balancer だけでなく Cloud Load Balancing の内郚的な仕組みに぀いお觊れおいたすので、圓蚘事ず䜵せおご参照ください。 blog.g-gen.co.jp Cloud Load Balancing は以䞋の 9 皮類 が提䟛されおいたす。圓蚘事では図内の Cross-region internal Application Load Balancer であるクロスリヌゞョン内郚アプリケヌションロヌドバランサに焊点を圓おおいたす。 公匏ドキュメント から匕甚 内郚アプリケヌションロヌドバランサずは 内郚アプリケヌションロヌドバランサ は、Envoy プロキシベヌスのレむダ 7 ロヌドバランサで、接続元が Google Cloud 内や Cloud VPN、Cloud Interconnect で接続されたオンプレミスの他、Amazon Web ServicesAWS等からのトラフィックをバック゚ンドサヌビスぞ分散したす。 内郚アプリケヌションロヌドバランサは、バック゚ンドのタむプによっおリヌゞョンモヌドずクロスリヌゞョンモヌドの 2 皮類が提䟛されおいたす。 リヌゞョン内郚アプリケヌションロヌドバランサ クロスリヌゞョン内郚アプリケヌションロヌドバランサPreview 版 リヌゞョン内郚アプリケヌションロヌドバランサ では、バック゚ンドはロヌドバランサず同䞀リヌゞョンに配眮したす。 バック゚ンドがリヌゞョンを跚ぐ堎合には、 クロスリヌゞョン内郚アプリケヌションロヌドバランサ を遞択したす。 これによっお、オフィスやデヌタセンタヌ拠点から Google Cloud ぞ囜内であれば東京asia-northeast1ず倧阪asia-northeast2ぞの負荷分散やフェむルオヌバヌができ、単䞀リヌゞョンにおける障害回避が可胜になりたす。 クロスリヌゞョン内郚アプリケヌションロヌドバランサがリリヌスされる前は、バック゚ンドがリヌゞョンを跚ぐ堎合には以䞋の蚘事あるように Cloud DNS による分散が候補に挙げられたしたが、バック゚ンドに異垞が発生した堎合の自動フェむルオヌバヌ機胜は甚意されおいないため、独自に実装する必芁がある等の制限がありたした。 blog.g-gen.co.jp アヌキテクチャ クロスリヌゞョン内郚アプリケヌションロヌドバランサのアヌキテクチャは以䞋の通りです。 クロスリヌゞョン内郚アプリケヌションロヌドバランサからバック゚ンドサヌビス (むンスタンスグルヌプやサヌバレス NEG 等) ぞのパケットは「プロキシ専甚サブネット」から送信されたす。たた、バック゚ンドサヌビスは ヘルスチェック によっおバック゚ンド (VM 等) の正垞性を確認したす。 そのため VPC ファむアりォヌルではそれらの通信を蚱可する必芁がありたす。 アヌキテクチャ 実斜内容 構成図 圓蚘事で䜜成するリ゜ヌスは以䞋の通りです。 構成図 前提 gcloud コマンドでリ゜ヌスを䜜成したす。実行環境は Cloud Shell で、Google Cloud SDK バヌゞョンは以䞋の通りです。 fujioka@cloudshell:~ ( xxxx ) $ gcloud version | grep " Google Cloud SDK " Google Cloud SDK 445 . 0 . 0 fujioka@cloudshell:~ ( xxxx ) $ 構築 事前準備 プロゞェクトの䜜成ず請求先アカりントの玐づけ プロゞェクトを䜜成し、䜜成したプロゞェクトに請求先アカりントを玐づけたす。 $ gcloud projects create ${PROJECT_ID} --name = ${PROJECT_NAME} --organization = ${ORGANIZATION_ID} && \ gcloud beta billing projects link ${PROJECT_ID} --billing-account = ${BILLING_ACCOUNT_ID} デフォルトプロゞェクトのセット 䜜成したプロゞェクトをデフォルトプロゞェクトずしおセットし、結果を確認したす。 $ gcloud config set project ${PROJECT_ID} && \ gcloud config list project API の有効化 今回の怜蚌で必芁な API を有効化したす。 $ gcloud services enable compute.googleapis.com dns.googleapis.com リ゜ヌスの䜜成 VPC ずサブネットの䜜成 VPC ずサブネットを䜜成したす。 # VPC の䜜成 $ gcloud compute networks create lb-network --subnet-mode = custom # asia-northeast1Tokyoにサブネットの䜜成 $ gcloud compute networks subnets create lb-subnet-asia-northeast1 \ --network = lb-network \ --range = 10 . 1 . 2 . 0 / 24 \ --region = asia-northeast1 # asia-northeast2Osakaにサブネットの䜜成 $ gcloud compute networks subnets create lb-subnet-asia-northeast2 \ --network = lb-network \ --range = 10 . 1 . 3 . 0 / 24 \ --region = asia-northeast2 プロキシ専甚サブネットの䜜成 プロキシ専甚サブネットを䜜成したす。バック゚ンドサヌビスぞのアクセスは、プロキシ専甚サブネットからになるため、埌述のファむアりォヌルの蚭定でプロキシ専甚サブネットからのアクセスを蚱可する必芁がありたす。 プロキシ専甚サブネットは 64 個以䞊の IP アドレスが必芁であり、掚奚されるサブネットサむズは /23 です。 # asia-northeast1Tokyoにプロキシ専甚サブネットの䜜成 $ gcloud beta compute networks subnets create proxy-only-subnet-asia-northeast1 \ --purpose = GLOBAL_MANAGED_PROXY \ --role = ACTIVE \ --region = asia-northeast1 \ --network = lb-network \ --range = 10 . 129 . 0 . 0 / 23 # asia-northeast2Osakaにプロキシ専甚サブネットの䜜成 $ gcloud beta compute networks subnets create proxy-only-subnet-asia-northeast2 \ --purpose = GLOBAL_MANAGED_PROXY \ --role = ACTIVE \ --region = asia-northeast2 \ --network = lb-network \ --range = 10 . 130 . 0 . 0 / 23 参考 Envoy ベヌスのロヌドバランサ向けプロキシ専甚サブネット プロキシ専甚サブネットを䜜成するず、コン゜ヌルでは以䞋のように衚瀺されたす。 プロキシ専甚サブネットの衚蚘 ファむアりォヌルルヌルの䜜成 3 ぀のファむアりォヌルルヌルを䜜成したす。 fw-allow-ssh Compute Engine ぞ SSH 甹 fw-allow-health-check  ヘルスチェック甚 fw-allow-proxies プロキシ専甚サブネットからバック゚ンドサヌビスぞのアクセス甚今回は 80/tcp フェむルオヌバヌの怜蚌をタグの削陀によるヘルスチェックの倱敗で確認をするため、ファむアりォヌルのタヌゲットはタグにしたす。 # fw-allow-ssh $ gcloud compute firewall-rules create fw-allow-ssh \ --network = lb-network \ --action = allow \ --direction = ingress \ --source-ranges = 0 . 0 . 0 . 0 / 0 \ --target-tags = allow-ssh \ --rules = tcp:22 # fw-allow-health-check $ gcloud compute firewall-rules create fw-allow-health-check \ --network = lb-network \ --action = allow \ --direction = ingress \ --source-ranges = 130 . 211 . 0 . 0 / 22 , 35 . 191 . 0 . 0 / 16 \ --target-tags = load-balanced-backend \ --rules = tcp # fw-allow-proxies $ gcloud compute firewall-rules create fw-allow-proxies \ --network = lb-network \ --action = allow \ --direction = ingress \ --source-ranges = 10 . 129 . 0 . 0 / 23 , 10 . 130 . 0 . 0 / 23 \ --target-tags = load-balanced-backend \ --rules = tcp:80 マネヌゞドむンスタンスグルヌプの䜜成 むンスタンステンプレヌトを䜜成したす。 # asia-northeast1Tokyoにむンスタンステンプレヌトの䜜成 $ gcloud compute instance-templates create gil7-backend-asia-northeast1-template \ --region = asia-northeast1 \ --network = lb-network \ --subnet = lb-subnet-asia-northeast1 \ --tags = allow-ssh,load-balanced-backend \ --image-family = debian-10 \ --image-project = debian-cloud \ --metadata = startup-script =' #! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2 ' # asia-northeast2Osakaにむンスタンステンプレヌトの䜜成 $ gcloud compute instance-templates create gil7-backend-asia-northeast2-template \ --region = asia-northeast2 \ --network = lb-network \ --subnet = lb-subnet-asia-northeast2 \ --tags = allow-ssh,load-balanced-backend \ --image-family = debian-10 \ --image-project = debian-cloud \ --metadata = startup-script =' #! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2 ' むンスタンステンプレヌトを䜿っお、マネヌゞドむンスタンスグルヌプを䜜成したす。 # asia-northeast1Tokyoにむンスタンスグルヌプの䜜成 $ gcloud compute instance-groups managed create l7-ilb-backend-asia-northeast1 \ --zone = asia-northeast1-a \ --size = 2 \ --template = gil7-backend-asia-northeast1-template # asia-northeast2Osakaにむンスタンスグルヌプの䜜成 $ gcloud compute instance-groups managed create l7-ilb-backend-asia-northeast2 \ --zone = asia-northeast2-a \ --size = 2 \ --template = gil7-backend-asia-northeast2-template クロスリヌゞョン内郚アプリケヌションロヌドバランサの䜜成 ヘルスチェックを䜜成したす。 ここでは HTTP ヘルスチェックを䜜成したすが、クロスリヌゞョン内郚アプリケヌションロヌドバランサでは他にも TCP、SSL、HTTPS 等もサポヌトしおいたす。 # HTTP ヘルスチェックの䜜成 $ gcloud compute health-checks create http gil7-basic-check \ --use-serving-port \ --global 参考 ヘルスチェックの抂芁 バック゚ンドサヌビスを定矩したす。 ロギング はバック゚ンドサヌビス単䜍で有効にできたす。ロギングはトラブルシュヌティング時に有甚です。 $ gcloud compute backend-services create gil7-backend-service \ --load-balancing-scheme = INTERNAL_MANAGED \ --protocol = HTTP \ --enable-logging \ --logging-sample-rate = 1 . 0 \ --health-checks = gil7-basic-check \ --global-health-checks \ --global バック゚ンドサヌビスにむンスタンスグルヌプを远加したす。 # asia-northeast1Tokyoにむンスタンスグルヌプをバック゚ンドに远加 $ gcloud compute backend-services add-backend gil7-backend-service \ --balancing-mode = UTILIZATION \ --instance-group = l7-ilb-backend-asia-northeast1 \ --instance-group-zone = asia-northeast1-a \ --global # asia-northeast2Osakaにむンスタンスグルヌプをバック゚ンドに远加 $ gcloud compute backend-services add-backend gil7-backend-service \ --balancing-mode = UTILIZATION \ --instance-group = l7-ilb-backend-asia-northeast2 \ --instance-group-zone = asia-northeast2-a \ --global URL マップを䜜成したす。 $ gcloud compute url-maps create gil7-map \ --default-service = gil7-backend-service \ --global タヌゲットプロキシを䜜成したす。 $ gcloud compute target-http-proxies create gil7-http-proxy \ --url-map = gil7-map \ --global 今回はタヌゲットプロキシを HTTP ずしおいたすが、HTTPS で DNS 認蚌を䜿う堎合、以䞋の蚘事を参考にしおください。 blog.g-gen.co.jp フォワヌディングルヌルを䜜成したす。 # asia-northeast1Tokyo $ gcloud compute forwarding-rules create gil7-forwarding-rule-asia-northeast1 \ --load-balancing-scheme = INTERNAL_MANAGED \ --network = lb-network \ --subnet = lb-subnet-asia-northeast1 \ --subnet-region = asia-northeast1 \ --address = 10 . 1 . 2 . 99 \ --ports = 80 \ --target-http-proxy = gil7-http-proxy \ --global # asia-northeast2Osaka $ gcloud compute forwarding-rules create gil7-forwarding-rule-asia-northeast2 \ --load-balancing-scheme = INTERNAL_MANAGED \ --network = lb-network \ --subnet = lb-subnet-asia-northeast2 \ --subnet-region = asia-northeast2 \ --address = 10 . 1 . 3 . 99 \ --ports = 80 \ --target-http-proxy = gil7-http-proxy \ --global クロスリヌゞョン内郚アプリケヌションロヌドバランサはコン゜ヌルで芋た時に、「リヌゞョン」が空欄になるのに察し、リヌゞョン内郚アプリケヌション ロヌドバランサは属するリヌゞョンが衚瀺されたす。 コン゜ヌル衚瀺 参考 モヌドの識別 怜蚌クラむアントの䜜成 怜蚌クラむアントずしお、Compute Engine むンスタンスを䜜成したす。 # asia-northeast1Tokyo $ gcloud compute instances create l7-ilb-client-asia-northeast1-a \ --image-family = debian-10 \ --image-project = debian-cloud \ --network = lb-network \ --subnet = lb-subnet-asia-northeast1 \ --zone = asia-northeast1-a \ --tags = allow-ssh \ --metadata = startup-script =' #!/bin/bash apt-get update apt-get install -y dnsutils ' # asia-northeast2Osaka gcloud compute instances create l7-ilb-client-asia-northeast2-a \ --image-family = debian-10 \ --image-project = debian-cloud \ --network = lb-network \ --subnet = lb-subnet-asia-northeast2 \ --zone = asia-northeast2-a \ --tags = allow-ssh \ --metadata = startup-script =' #!/bin/bash apt-get update apt-get install -y dnsutils ' フェむルオヌバヌずフェむルバックの怜蚌 正垞時のトラフィック 怜蚌クラむアントからクロスリヌゞョン内郚アプリケヌションロヌドバランサ 10.1.2.99 / 10.1.3.99 ぞ 100 個のリク゚ストをし、負荷分散されおいるこずを確認したす。 正垞時のアクセス ヘルスチェックが正垞時のバック゚ンドサヌビス むンスタンス名は l7-ilb-backend-<リヌゞョン名>-<乱数> です。 むンスタンスグルヌプのむンスタンス 以䞋のように、各リヌゞョンのバック゚ンドの 2 むンスタンスぞトラフィックが分散されおいるこずがわかりたす。 # asia-northeast1 のむンスタンスグルヌプぞ分散 fujioka@l7-ilb-client-asia-northeast1-a:~$ { > RESULTS= > for i in {1..100} > do > RESULTS="$RESULTS:$(curl --silent 10.1.2.99)" > done > echo "" > echo " Results of load-balancing to 10.1.2.99: " > echo "***" > echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c > echo > } Results of load-balancing to 10.1.2.99: *** 49 l7-ilb-backend-asia-northeast1-cn22 51 l7-ilb-backend-asia-northeast1-pdtr 100 Page served from fujioka@l7-ilb-client-asia-northeast1-a:~$ # asia-northeast2 のむンスタンスグルヌプぞ分散 fujioka@l7-ilb-client-asia-northeast2-a:~$ { > RESULTS= > for i in {1..100} > do > RESULTS="$RESULTS:$(curl --silent 10.1.3.99)" > done > echo "" > echo " Results of load-balancing to 10.1.3.99: " > echo "***" > echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c > echo > } Results of load-balancing to 10.1.3.99: *** 49 l7-ilb-backend-asia-northeast2-088t 51 l7-ilb-backend-asia-northeast2-zqtx 100 Page served from fujioka@l7-ilb-client-asia-northeast2-a:~$ フェむルオヌバヌ asia-northeast1 のバック゚ンドのむンスタンスグルヌプに付䞎された load-balanced-backend タグを削陀したす。これによっおファむアりォヌルのタグで蚱可されおいたヘルスチェックのアクセスが拒吊されるため、ヘルスチェックが倱敗し asia-northeast1 のむンスタンスグルヌプぞトラフィックが流れなくなりたす。 異垞時のアクセス # l7-ilb-backend-asia-northeast1-cn22 からタグを削陀 $ gcloud compute instances remove-tags l7-ilb-backend-asia-northeast1-cn22 \ --zone = asia-northeast1-a \ --tags = load-balanced-backend # l7-ilb-backend-asia-northeast1-pdtr からタグを削陀 $ gcloud compute instances remove-tags l7-ilb-backend-asia-northeast1-pdtr \ --zone = asia-northeast1-a \ --tags = load-balanced-backend タグの削陀により、ヘルスチェックが倱敗しおいたす。 ヘルスチェックが異垞時のバック゚ンドサヌビス この状態で再床クロスリヌゞョン内郚アプリケヌションロヌドバランサ 10.1.2.99 / 10.1.3.99 ぞ 100 個のリク゚ストをするず、 10.1.2.99 ぞのリク゚ストは asia-northeast1 のバック゚ンドではなく、asia-northeast2 のバック゚ンドぞトラフィックが流れるようになりたす。 # asia-northeast2 のむンスタンスグルヌプぞトラフィックが流れるようになる fujioka@l7-ilb-client-asia-northeast1-a:~$ { > RESULTS= > for i in {1..100} > do > RESULTS="$RESULTS:$(curl --silent 10.1.2.99)" > done > echo "" > echo " Results of load-balancing to 10.1.2.99: " > echo "***" > echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c > echo > } Results of load-balancing to 10.1.2.99: *** 51 l7-ilb-backend-asia-northeast2-088t 49 l7-ilb-backend-asia-northeast2-zqtx 100 Page served from fujioka@l7-ilb-client-asia-northeast1-a:~$ # asia-northeast2 のむンスタンスグルヌプぞ分散 fujioka@l7-ilb-client-asia-northeast2-a:~$ { > RESULTS= > for i in {1..100} > do > RESULTS="$RESULTS:$(curl --silent 10.1.3.99)" > done > echo "" > echo " Results of load-balancing to 10.1.3.99: " > echo "***" > echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c > echo > } Results of load-balancing to 10.1.3.99: *** 51 l7-ilb-backend-asia-northeast2-088t 49 l7-ilb-backend-asia-northeast2-zqtx 100 Page served from fujioka@l7-ilb-client-asia-northeast2-a:~$ フェむルバック タグを再床付䞎し、ヘルスチェックが成功埌のトラフィックを確認したす。 # タグを付䞎 $ gcloud compute instances add-tags l7-ilb-backend-asia-northeast1-cn22 --tags = load-balanced-backend --zone = asia-northeast1-a && gcloud compute instances add-tags l7-ilb-backend-asia-northeast1-pdtr --tags = load-balanced-backend --zone = asia-northeast1-a タグ再付䞎埌のヘルスチェックが正垞なバック゚ンドサヌビス 10.1.2.99 ぞのトラフィックが元通り asia-northeast2 ではなく、asia-northeast1 のバック゚ンドに流れおいるこずがわかりたす。 fujioka@l7-ilb-client-asia-northeast1-a:~$ { > RESULTS= > for i in {1..100} > do > RESULTS="$RESULTS:$(curl --silent 10.1.2.99)" > done > echo "" > echo " Results of load-balancing to 10.1.2.99: " > echo "***" > echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c > echo > } Results of load-balancing to 10.1.2.99: *** 51 l7-ilb-backend-asia-northeast1-cn22 49 l7-ilb-backend-asia-northeast1-pdtr 100 Page served from fujioka@l7-ilb-client-asia-northeast1-a:~$ 実際の運甚では Cloud DNS の ルヌティングポリシヌ も䜵せお䜿うこずで、バック゚ンドのサヌビス停止だけでなく、リヌゞョン停止やレむテンシ、ネットワヌク転送費甚を抑えるこずもできたす。 参考 DNS ルヌティング ポリシヌを構成する G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
Google Cloud (旧称 GCP) の生成 AI (Generative AI) である PaLM 2 を甚いお、Cloud Run 䞊に瀟内 LLM Web アプリを構築しおみたした。 はじめに 前提知識 Vertex AI PaLM API Gradio Cloud Runサヌビスぞのアクセス制埡 準備 ディレクトリ構成 app.py requirements.txt Dockerfile デプロむ 動䜜怜蚌 はじめに 今回は、Google Cloud の生成 AI である Vertex AI PaLM API を甚いお、瀟内向け LLM Web アプリを Cloud Run 䞊にデプロむしたす。 たた、Cloud Run サヌビスの認蚌には Identity-Aware Proxy (IAP) を甚いるこずで、瀟内ナヌザヌのみがアクセスできる状態を構成できたす。 尚、コンシュヌマ向け LLM サヌビスの Bard ず比べ、Vertex AI PaLM API を甚いるこずで LLM モデルぞの入出力デヌタを自瀟内に閉じるこずができ、デヌタガバナンスを維持するこずが出来たす。 構成図 先日、圓瀟ブログで Vertex AI PaLM API を Slack ず連携した蚘事も公開されおたすので、ご興味ある方はこちらもご芧䞋さい。 blog.g-gen.co.jp 前提知識 Vertex AI PaLM API PaLM 2 は Google の生成 AI モデルであり、Bard の裏偎でも䜿われおいたす。Vertex AI では、PaLM 2 の゚ンドポむントを Vertex AI PaLM API ずしお公開しおいたす。 開発者は Vertex AI PaLM API を䜿甚するこずで、自瀟のアプリケヌションで生成 AI を組み蟌むこずが可胜ずなりたす。 今回は、 Vertex AI PaLM API の䞭でも䌚話に特化した chat-bison を利甚したす。 その他、Vertex AI PaLM API の詳现に぀いおは、以䞋のブログをご芧ください。 blog.g-gen.co.jp Gradio Gradio ずは、Python で機械孊習 Web アプリを容易に構築できるフレヌムワヌクです。 今回は、簡易的な LLM Webアプリを構築するために以䞋のコンポヌネントを䜿甚したした。 Web アプリの画面構成 No コンポヌネント 説明 1 Chatbot LLM ずの䌚話履歎を衚瀺する郚分 2 Textbox ナヌザヌがプロンプトを入力するテキストボックス 3 ClearButton ナヌザヌが入力したプロンプトを削陀するボタン 参考 How to Create a Chatbot with Gradio Cloud Runサヌビスぞのアクセス制埡 Cloud Run サヌビスぞのアクセス制埡は、 Identity-Aware Proxy (IAP) を甚いるこずで IAP を利甚できる IAM ロヌル がアタッチされた組織内 Google アカりント / グルヌプ に制限するこずができたす。 参考 Enabling IAP for Cloud Run 準備 ディレクトリ構成 開発環境は Cloud Shell を甚いお行いたす。ディレクトリ構成は以䞋のずおりです。 llm_app ディレクトリ配䞋は、以䞋のずおりです。 llm_app |-- app | |-- app.py | `-- requirements.txt `-- Dockerfile app.py app.py には、以䞋の Python コヌドを蚘述したす。 import os import logging import gradio as gr import google.cloud.logging import vertexai from vertexai.language_models import ChatModel, ChatMessage, InputOutputTextPair # Cloud Logging ハンドラを logger に接続 logger = logging.getLogger() logging_client = google.cloud.logging.Client() logging_client.setup_logging() # 定数の定矩 PROJECT_ID = os.environ.get( "PROJECT_ID" ) LOCATION = os.environ.get( "LOCATION" ) # vertexai むンスタンスの初期化 vertexai.init(project=PROJECT_ID, location= "us-central1" ) def llm_chat (message, chat_history): # 基盀モデルを蚭定 chat_model = ChatModel.from_pretrained( "chat-bison@001" ) # パラメヌタを指定 parameters = { "max_output_tokens" : 1024 , "temperature" : 0.2 , "top_p" : 0.8 , "top_k" : 40 } # 䌚話履歎のリストを初期化 message_history = [] # 䌚話履歎のフォヌマットを敎圢 for row in chat_history: input_from_user = row[ 0 ] output_from_llm = row[ 1 ] q_message = ChatMessage(author= "user" , content=input_from_user) message_history.append(q_message) a_message = ChatMessage(author= "llm" , content=output_from_llm) message_history.append(a_message) # 基盀モデルに䌚話履歎をむンプット chat = chat_model.start_chat(message_history=message_history) # 基盀モデルにプロンプトリク゚ストを送信 response = chat.send_message(message, **parameters) return response.text def respond (message, chat_history): # llm で回答を生成 bot_message = llm_chat(message, chat_history) # Cloud Logging 曞き蟌み甚 logger.info(f "message: {message}" ) logger.info(f "chat_history: {chat_history}" ) logger.info(f "bot_message: {bot_message}" ) chat_history.append((message, bot_message)) return "" , chat_history # gradio の蚭定 with gr.Blocks() as llm_web_app: chatbot = gr.Chatbot() msg = gr.Textbox() clear = gr.ClearButton([msg, chatbot]) msg.submit(respond, [msg, chatbot], [msg, chatbot]) clear.click( lambda : None , None , chatbot, queue= False ) # Gradio の立ち䞊げ llm_web_app.launch(server_name= "0.0.0.0" , server_port= 7860 ) 参考 Gradio - Chatbot - Domos requirements.txt gradio==3.41.2 google-cloud-aiplatform==1.31.1 google-cloud-logging==3.6.0 Dockerfile FROM python:3.9-slim COPY ./app /app WORKDIR /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 7860 CMD [ " python ", " app.py " ] デプロむ Cloud Shell にお、珟圚のディレクトリが llm_app ディレクトリであるこずを確認し、以䞋 gcloud コマンドを順次実行したす。 # 環境倉数の蚭定 PROJECT_ID = { プロゞェクト ID } BILLING_ACCOUNT_ID = { 請求先アカりント ID } REGION =asia-northeast1 AR_REPO = { Artifact Repogitory のレポゞトリ名 } SERVICE_NAME = { Cloud Run サヌビス名 } SA_NAME = { サヌビスアカりント名 } # プロゞェクト䜜成 gcloud projects create ${PROJECT_ID} --name = ${PROJECT_NAME} # プロゞェクト蚭定の倉曎 gcloud config set project ${PROJECT_ID} # 請求先アカりントの玐づけ gcloud beta billing projects link ${PROJECT_ID} \ --billing-account = ${BILLING_ACCOUNT_ID} # API の有効化 gcloud services enable --project = $PROJECT_ID run.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ compute.googleapis.com \ aiplatform.googleapis.com \ iap.googleapis.com # サヌビスアカりント䜜成 gcloud iam service-accounts create $SA_NAME # サヌビスアカりントぞ暩限付䞎 gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount: $SA_NAME @ $PROJECT_ID .iam.gserviceaccount.com " \ --role =" roles/aiplatform.user " # Artifacts repositories 䜜成 gcloud artifacts repositories create $AR_REPO \ --location = $REGION \ --repository-format = Docker \ --project = $PROJECT_ID # むメヌゞの䜜成曎新 gcloud builds submit --tag $REGION -docker.pkg.dev/ $PROJECT_ID / $AR_REPO / $SERVICE_NAME \ --project = $PROJECT_ID # Cloud Run デプロむ gcloud run deploy $SERVICE_NAME --port 7860 \ --image $REGION -docker.pkg.dev/ $PROJECT_ID / $AR_REPO / $SERVICE_NAME \ --no-allow-unauthenticated \ --service-account = $SA_NAME @ $PROJECT_ID .iam.gserviceaccount.com \ --ingress = internal-and-cloud-load-balancing \ --region = $REGION \ --set-env-vars = PROJECT_ID = $PROJECT_ID , LOCATION = $REGION \ --project = $PROJECT_ID Cloud Run サヌビスず IAP の連携は、以䞋ブログの手順をご参照䞋さい。 blog.g-gen.co.jp 動䜜怜蚌 LLM Web アプリの URL にアクセスするず、たず最初に IAP による認蚌画面が珟れたす。 IAP による認蚌画面 蚱可された Google アカりントでログむンするず LLM Web アプリの画面に遷移したす。 詊しに、「BigQuery の特城」を聞いおみおたす。たた、䌚話圢匏もサポヌトできおいるか䜵せお確認しおみたす。 LLM Web アプリ画面 LLM が前の䌚話を蚘憶しお、回答を生成しおくれたした。 このように、Vertex AI PaLM API を利甚するこずで、入出力デヌタは孊習に䜿われるこずなく、䌁業のデヌタガバナンスを維持しながら瀟内 LLM Web アプリを構築するこずができたす。 G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。