TECH PLAY

SCSKクラウドソリューション

SCSKクラウドソリューション の技術ブログ

1141

こんにちは。SCSKの島村です。 Vertex AI(Gemini API)にて利用できる『関数呼び出し機能(Function Calling API )』についてご存知でしょうか?? 関数呼び出しを利用することで、LLMから 関連性の高いコンテキストに沿った回答 を提供することが可能となります。 本記事では、 『 Function Calling API 』について色々と調査し、実際に触ってみましたので、その魅力について少しだけご紹介させていただければと思います。 Function Calling APIとは?? 『Function Calling』とは、  LLMが質問の内容や文脈から必要な関数(外部の関数やAPI)を判断し呼び出すことで、回答の幅をさらに広げる機能 です。 従来のLLMは、与えられたプロンプトに対して、既に学習しているデータに基づき回答を生成することが主な役割でした。 しかし、Function Callingによって、LLMは単なるテキスト生成にとどまらず、以下のようなことができるようになります。 外部データの取得: 天気予報、株価、ニュース記事など、リアルタイムの情報を取得 計算: 複雑な計算やデータの分析を実行 外部サービスとの連携: 翻訳サービス、画像生成サービスなど、様々な外部サービスと連携してより高度なタスクを実行 Fanction Calling(関数呼び出し)を使用することで、生成 AI モデルに提供するための情報を外部もから取得可能となります。 Function Call(関数呼び出し)とモデル返答までのフロー:Google Cloudドキュメントより 詳細については、以下、Google Cloud公式ドキュメントからご確認ください。 関数呼び出し  |  Vertex AI の生成 AI  |  Google Cloud 利用ステップ Verte AI Geminiにて『Fanction Calling』を利用する手順は以下となります。 モデルを初期化する 。 ユーザー プロンプトを定義する 。 関数宣言を使用して、 使用可能な一連の関数を定義、記述する 。 ユーザーのプロンプトと関数宣言をモデルに送信する 。 モデルから出力された構造化データを使用して、 関数を呼び出す 。 関数の出力をモデルに提供する 。   Function Callingを実際に試してみた。 今回は「Function Calling API」を利用して、あらかじめ用意した簡単な関数を呼び出すことを試してみます。 実際の出力結果の一部を先にお見せします。 簡単な算数の問題をLLMに解かせてみました。 外部の関数を参考にして、LLMは回答を生成していることが分かります。 今回は簡単な算数の問題を例に試してみましたが、LLMに複雑な計算を実行してもらう場合、ハルシネーションの抑制にもつながる機能だと感じました。 Fanction Callingを実装してみる(コード例) 今回はコードについても少しだけ解説してみます。 1. 必要なモジュールのインポート import requests from vertexai.generative_models import (   Content,   FunctionDeclaration,   GenerationConfig,   GenerativeModel,   Part,   Tool, ) 2. プロジェクトの設定と言語モデル(Vertex AI)を使うための準備 import vertexai PROJECT_ID = ! gcloud config get-value project PROJECT_ID = PROJECT_ID[0] LOCATION = "us-central1" # @param {type:"string"} vertexai.init(project=PROJECT_ID, location=LOCATION) 3. LLMから呼び出す関数を定義(今回は簡単に「加算」「乗算」を実施する関数を作成します。) def add_fun(x,y):   print("---加算関数を呼び出しました.---")   return int(x)+int(y)  def multiply_func(x,y):   print("---乗算関数を呼び出しました.---")   return int(x)*int(y) 4. LLMから呼び出すための関数宣言 ・入力から判断するための「説明」と「取得する変数」を定義します。 詳細はリンクをご確認ください。: 関数宣言の例 add_function = FunctionDeclaration(   name="add",   description="質問から計算方法を判別し、加算を算出します。",   parameters={       "type": "object",       "properties": {           "x": {"type": "string", "description": "x."},           "y": {"type": "string", "description": "y."},       },   }, ) multiply_function = FunctionDeclaration(   name="multiply",   description="質問から計算方法を判別し、乗算を算出します。",   parameters={       "type": "object",       "properties": {           "x": {"type": "string", "description": "x."},           "y": {"type": "string", "description": "y."},       },   }, ) 5. Geminiモデル側の設定 tool = Tool(   function_declarations=[       add_function,       multiply_function,   ], ) model = GenerativeModel(   model_name="gemini-1.5-pro-001",   generation_config=GenerationConfig(temperature=0),   system_instruction=[       """       計算に関する質問の場合、自分で計算を行わないでください。       その他の質問の場合、ユーザーの質問に正しく答えてください。       """,   ],   tools=[tool], ) 6. おまけ)定義した2つの関数を直列に利用したい場合を想定して、レスポンスを再帰的に呼び出すための設定 def handle_response(response):   if response.candidates[0].function_calls:       function_call = response.candidates[0].function_calls[0]   else:       print(response.text)       return   if function_call.name == "add":       x_args = function_call.args.get('x')       y_args = function_call.args.get('y')       z_add = add_fun(x_args,y_args)  # Assuming a single string argument       response = chat.send_message(           Part.from_function_response(               name=function_call.name,               response={                   "content": z_add,               },           ),       )       return handle_response(response)   elif function_call.name == "multiply":       x_args = function_call.args.get('x')       y_args = function_call.args.get('y')       # Call your function       z_add = multiply_func(x_args,y_args)       response = chat.send_message(           Part.from_function_response(               name=function_call.name,               response={                   "content": z_add,               },           ),       )       return handle_response(response)   else:         print(function_call) 7. チャットモデルの開始 chat = model.start_chat() 以上で作成は完了です。 作成したモデルを利用して、実際にいくつか試してみます。↓↓↓ 質問の内容を理解し、計算(「乗算」「加算」)が必要な場合には適切に外部関数を呼び出していることが確認できます。 また、Fanction Callされた際のレスポンスを覗いてみると、、、、 利用した関数名( function_call { name: “multiply” } ・・・)が記載されていることが分かります。   最後に 今回は『 Function Calling API 』について実際のデモともにご紹介させていただきました。 簡単な計算問題を外部関数として定義し、LLMから呼び出して回答を補足する。  そんなデモを実感頂けたと思います。 外部データに対してAPIを経由してアクセスすることもでき、LLMの回答も大きく広がるそんな機能ではないでしょうか。 色んな関数を定義し、LLMのからの回答の幅を広げていくことができる『 Function Calling API 』のご紹介でした。 今後とも、AIMLに関する情報やGoogle CloudのAIMLサービスのアップデート情報を掲載していきたいと思います。 最後まで読んでいただき、ありがとうございました!!!
アバター
こんにちは。SCSKの吉田です。 今回は、ServiceNowⓇのNow Assist in Virtual Agentに関する記事となります。  生成AIが搭載されたチャットボット機能を活用して、どのように身の回りの業務を効率化できるか検証してみました。 本記事は執筆時点(2024年9月)の情報です。最新の情報は製品ドキュメントを参考にしてください。   Now Assist in Virtual Agentとは Now Assist in Virtual Agentは、ServiceNowのVirtual Agent(チャットボット)に生成AI機能が追加されたものになります。 これにより、ユーザーは会話形式でのVirtual Agent利用が可能となり、ナレッジの検索やサービスカタログのリクエストなどをより簡単に行えるようになりました。 時間を問わず利用可能なセルフサービスを提供することで、ユーザーの自己解決率を向上し、ヘルプデスクへの問い合わせ削減が期待できます。 ちなみに、ユーザーが自己解決し、チケットの作成を回避できた割合を「deflection rate」と呼び、Virtual Agentの導入効果を測定する上で重要な指標となります。 deflection rateの測定方法についても、勉強した内容を別記事でアウトプット予定です。 また、開発者目線でもメリットがあり、これまではVirtual Agentが返答する内容を事前に定義する必要がありましたが、生成AIが回答を生成してくれるので、構築に要する時間も短縮できそうです。 Now Assist in Virtual Agentを使ってみる まずは、前回の記事で作成したユーザーのアカウント登録申請をVirtual Agentから実施してみます。 ServiceNowⓇのNow Assistを活用してカタログアイテム(申請フォーム)とフローを効率的に作成する ServiceNowのNow Assistの機能を活用して、申請書とフローを作成してみました。非常に効率的に作成することができたので、そのプロセスをご紹介します。 blog.usize-tech.com 2024.08.27 Virtual Agentに「ユーザーアカウントを登録したい」とチャットすると、インスタンス内の存在するサービスカタログやナレッジを検索して、いくつかの候補を提示してくれます。 前回作成した「User Registration Request」がヒットしました。 申請を開始すると、「User Registration Request」フォーム内の各質問項目をVirtual Agentが会話形式で質問してくるので、チャット上で回答していきます。 入力内容を間違えた場合も、どの項目を修正したいか伝えることで、Virtual Agentが変更を反映してくれます。 最後に申請予定の内容を表示してくれるので、中身に問題なければSubmitして申請は完了です。 Virtual Agentと会話した通りに申請が作成されたことが確認できました。   身の回りの困り事をVirtuakl Agentで解決してみる シナリオ 【イベント】 新しい社員が自部署に配属される 【困りごと】 PCの調達など色々と準備が必用なのは認識しているけど、 何をすればよいか分からない、何処から申請すればよいか分からない。。 → Virtual Agentに必要なタスクを教えてもらおう、ついでに申請もまとめてVirtual Agentにやってもらおう 実践 今回「User Onboarding」という会話のフローを簡易的に作成してみました。 「User Onboarding」と入力すると、Virtual Agentが社員配属時に必要な申請の要否を順番に質問してくれるので、回答していきます。 回答した内容が一覧で表示されます。 今回はPC、業務携帯電話、名刺、個人ロッカーを用意したいと回答しました。 続いて、前の会話で必用と回答したものに対し、具体的な要望を質問されるので回答していきます。 (例)PCを調達するためにOS、CPU、ストレージを聞かれています。 (例)業務用携帯電話を調達するために、OS、ストレージ、本体のカラーを聞かれています。 申請毎に内容のサマリが表示されるので、問題なければSubmitを選択すれば申請が完了します。 その後、名刺、個人ロッカーについても同様に質問されるので、回答していけば申請は全て完了です。 結果を確認してみると、新しく部署に配属される社員向けに4つの申請をまとめて行うことができました。   開発内容 前セクションのVirtual Agentの会話内容のほとんどは生成AIによって生成されたものであり、非常に簡単に実装できました。 例えば前半でユーザーに対して各種申請の要否を確認している部分は、以下画像のDetailed descriptionにユーザーへ質問したいことを簡単に記載しているのみとなります。 記載した説明をもとに生成AIが会話文を考えてくれました。(もちろん、自分自身で会話文を事前に定義することも可能です)   後半の申請を行う部分に関しては、標準機能の「Request catalog item(LLM)」というトピックブロックと事前に作成したカタログアイテムを紐づけるのみとなります。 ユーザーへ質問したり、最終的に申請をあげる部分は開発不要になります。   まとめ Now Assist in Virtual Agentを触ってみて「何をすればよいのか分からない」という人に対して非常に便利なサービスを提供できると感じました。 今回の記事のように、業務上発生する様々なイベント(海外出張、育児休暇など)ごとに、Virtual Agentの会話フローを作成すれば、従業員体験の向上、ヘルプデスクへの問い合わせ削減など様々な良い効果がありそうです。 さらに生成AIの導入により、自然言語で検索をかけることも可能なので、実施したいことが不明瞭な人でも目的のナレッジやカタログアイテムにたどり着きやすくなったのではないかと思います。 ServiceNow ServiceNowは、企業の生産性向上や業務プロセス改善を支えるサービスマネジメントクラウドソリューションです。従業員満足度・顧客満足度の向上、業務効率化を強力に支援します。 www.scsk.jp
アバター
こんにちは。SCSKの江木です。 これまでDialogflow CXでAgentを構築していて、困ったことが多々ありました。 今回はこれまでの経験をもとに、スムーズな開発と高品質なチャットボットを実現するためのTipsをいくつかまとめました。 本記事がAgentを作成するためのヒントになれば幸いです。 Dialogflow CXとは Dialogflow CXとは、自然言語による対話をシステムに組み込む際に使えるプラットフォームです。高度なチャットボットや音声アシスタントを構築するためのツールであり、複雑な会話の流れや多様なユーザーの質問に柔軟に対応できることが特徴です。 Dialogflow CXの基本については以下のブログにまとめているので、ご参照ください。 Dialogflow CXの基本を整理してみました 今回は、Dialogflowの基礎知識を改めて整理して紹介していきます。この基礎知識があれば、Dialogflow CXでAgentを構築できるようになるので、最後までご覧ください。 blog.usize-tech.com 2024.09.09 Agentを作成するときのTips Route Groupを使いこなせ! Route Groupは、Routeを使いまわしたいときに使います。同じintentで遷移先が同じRouteが異なるPageで存在したとき、それぞれのページでRouteを作るよりも、Route Groupを使うことで開発を時間短縮することができます!! Route Groupは以下の手順で新たに作成することができます。設定の仕方はRouteと同様にintentとTransitionを設定すると、動作します。 Pageの詳細 [Add state handler]をクリック [Route groups]にチェックして、[Apply]をクリック [Route groups]右の[+]をクリック [Route group]の[Create new route group]を選択 Parameterを使いこなせ! Parameterを使うことで、Agentの実装の幅が大きく広がります。本節ではParameterについて説明した後、実装例について紹介していきます。 Parameterについて Dialogflow CXにおけるParameterは、セッション中にエンドユーザーが入力した値を取得または参照するときに使用します。Parameterには以下の3種類が存在します。 Intent parameter Form parameter Session parameter それぞれのParameterについて説明します。 Intent parameter Intentが一致した時にエンドユーザーが入力した値を抽出し、Intent parameterに設定されます。 以下のFlowを使用して、Intent parameterの取得方法を紹介します。 Page1の設定は以下の通りです。 curryというRouteに、curryというintentを設定しています。 以下のように、curryというintentにTraining phraseを入力し、curryという名前のIntent parameterを設定します。 続いて、Page2のFulfilmentにて、Intent parameterを取得します。   テストしてみると、以下のようにIntent parameterを取得できていることがわかります。 Form parameter Form parameterは 参照で使用されず 、パラメータの入力ステータスの確認で使われます。つまり、「$page.params.パラメータ名」といった記述はできません。 「$page.params.status = “FINAL”」のように現在のページですべてのパラメータが入力されているのか確認するために使用します。 以下のように、Conditionで設定することが多いです。 Session parameter 実行時に任意のパラメータが設定されると、Session parameterに設定されます。 Session parameterはPageのParameterで設定することが多いですが、Route、eventhandler、PageのFulfillmentのParameter presetsでも設定することができます。 以下のFlowを用いて、Session parameterの取得方法を紹介します。 Page1の設定は以下の通りです。 Parameterにdrinkというパラメータが設定されています。このパラメータに値が入ったときにSession parameterに値が入ります。 続いて、Page2のFulfilmentにて、Session parameterを取得します。 テストしてみると、以下のようにSession parameterを取得できていることがわかります。 Parameterを使った実装例 以下のフローチャートのようなコンサートのチケット申し込みを行うチャットボットを作る例を考えます。 また、以下の2つの機能が含まれるようにチャットボットを作成します。 チケットの確認を行う際に、申し込むチケットによってチャットボットの応答が変わる チケット申し込みと確認におけるループの上限回数が3回である 以降、上から機能1、機能2と記載します。 このフローチャートに従って作成したFlowは以下の通りになります。 このFlowにおけるPageの役割は以下の通りです。 Select Ticket 申し込むチケットをユーザーに選択させる 「男性アイドルグループMと女性アイドルグループWのどちらのチケットが欲しいですか?「M」か「W」で教えてください。」とユーザーに質問する Ticket Confirm 申し込むチケットの確認を行う 作成したFlowとPageについての説明が終了したところで、次は機能1と機能2をどのように実装したのかを説明します。 機能1 Intent parameterを使って、実装していきます。 以下のようにIntentを設定します。 「M」、「W」と入力されたときにきちんとIntent parameterに値が入るように設定しました。 先ほど設定したIntentであるticket.mとticket.wをSelect TicketページのRouteであるticket.mとticket.wに設定します。 次にこのIntent parameterを参照します。Ticket ConfirmページのパラメータであるresponseのAgent responsesという項目で下記のようにIntent parameterによって、チャットボットの返答が変わるように設定します。 ※パラメータであるresponseはエンドユーザーの返答である「はい」か「いいえ」を格納するために設定しています。「はい」ならばEnd Sessionページへ、「いいえ」ならSelect Ticketページに遷移するように設定しています。 機能1の実装は以上になります。 機能2 Session parameterを使って、実装していきます。 ループカウントするためのパラメータを用意するため、Start PageのルートであるtrueのParameter presetsにordercountというSession parameterを定義します。 ※trueは必ず遷移するルートで、遷移先はSelect Ticketに設定しています。 続いて、チケットの確認を行うたびにordercountがインクリメントされるように設定します。Select TicketページのFulfillmentのParameter presetsで以下のように設定します。 また、Select Ticketページのルートに、ordercountが4になったとき(つまり、3回申し込み確認を終えたとき)にEnd Sessionに遷移するようなルートを設定します。 ※ここでAgent responsesで「男性アイドルグループMと女性アイドルグループWのどちらのチケットが欲しいですか?「M」か「W」で教えてください。」と返答する条件として「ordercount < 3」と設定しているのは4回質問しないようにするためです。 機能2の実装は以上になります。 他の細かい設定は説明がかなり長くなってしまうので、今回は割愛させていただきます。 Start Pageのintentに注意しろ! Start Pageに設定したRouteのIntentはすべてのPageに伝播されます。 ある特定のPageからの遷移を設定したいときは、Start PageにIntentを設定しないように気を付けてください。 冒頭で紹介したブログにて作成した、以下のAgentで実際に挙動を確かめてみます。 AgentのPageに設定した項目の一部を以下に示します。 Page Fulfillment Route intent Training phrase Transition Start Page – store.location store.location 任意のお店の場所を聞く フレーズ Store Location store.hour store.hour 任意の営業時間を聞く フレーズ Store Hours Store Location Agent says: 東京都************です。その他ご用件はございますでしょうか。 Route Group: Closing – – – Store Hours Agent says: 月曜日から土曜日まで9:00 -19:00 で営業しています。日曜祝日は定休日です。その他ご用件はございますでしょうか。 Route Group: Closing – –   次にRoute Groupの設定を示します。 Route Group intent Training phrase Transition Closing closing いいえ、ありません等の否定のフレーズ End Session   それではAgentに会話してみます。お店の場所を聞いた後に、試しに営業時間を時間を尋ねたところ、以下のようにAgentが返答を返してきました。 Store LocationからStore Hoursへ遷移するようなRouteを設定していないのに、遷移してしまいました。Start Pageに設定したintentが効いているのが確認できますね!! おわりに いかがだったでしょうか。 今回はDialogflow CXでAgentを作成するときのTipsを紹介しました。 私が開発していて躓いたポイントを盛り込んでいるので、参考にしていただければと思います。 本記事が皆様のお役にたてば幸いです。 最後まで読んでいただきありがとうございました。
アバター
こんにちは。SCSKのふくちーぬです。 AWS Systems Managerのフリートマネージャーを利用して、Windowsサーバにブラウザベースでのリモート接続している方多いかと思います。今回は閉域網環境において、ローカル-サーバ間においてファイル共有するためにAWS Tools for Windows PowerShellを用いる方法をご紹介します。 AWS Tools for Windows PowerShellとは AWS Tools for Windows PowerShellは、PowerShell向けのサービスです。PowerShellからAWSサービスを利用するためのコマンドツール群です。 AWS Tools for PowerShellとは何ですか? - AWS Tools for PowerShell AWS Tools for PowerShell は、 によって公開される機能に基づいて構築された PowerShell モジュールのセットです AWS SDK for .NET。 AWS Tools for PowerShell を使用す... docs.aws.amazon.com Winsows Server 2022においては、”4.1.628″のバージョンがインストール済みとなります。 AWS Windows AMI version history - AWS Windows AMIs Find historical details about AWS Windows AMI version releases. docs.aws.amazon.com   アーキテクチャー Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。 運用者は、フリートマネージャーを利用してEC2に接続します。 運用者は、マネジメントコンソールやAPIを利用してS3にアクセスしファイルのやり取りをします。 プライベートサブネット内のEC2は、VPCエンドポイント経由でS3にアクセスしファイルのやり取りをします。   完成したCloudFormationテンプレート 以下のテンプレートをデプロイしてください。 AWSTemplateFormatVersion: 2010-09-09 Description: CFN template EC2 Parameters: ResourceName: Type: String AMIId: Type: String Resources: # ------------------------------------------------------------# # S3 # ------------------------------------------------------------# S3BucketFor: Type: AWS::S3::Bucket DeletionPolicy: Delete Properties: BucketName: !Sub ${ResourceName}-s3-bucket AccessControl: Private PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: !Sub ${ResourceName}-VPC # ------------------------------------------------------------# # Private Subnet # ------------------------------------------------------------# PrivateSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: ap-northeast-1a MapPublicIpOnLaunch: false Tags: - Key: Name Value: !Sub ${ResourceName}-subnet-Private-1a PrivateSubnet1c: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.11.0/24 AvailabilityZone: ap-northeast-1c MapPublicIpOnLaunch: false Tags: - Key: Name Value: !Sub ${ResourceName}-subnet-Private-1c # ------------------------------------------------------------# # Route Table and Routes # ------------------------------------------------------------# PrivateRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: PrivateRouteTable PrivateSubnet1aAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1a RouteTableId: !Ref PrivateRouteTable PrivateSubnet1cAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1c RouteTableId: !Ref PrivateRouteTable # ------------------------------------------------------------# # VPC Endpoint # ------------------------------------------------------------# ssmEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Join - '' - - com.amazonaws. - !Ref 'AWS::Region' - .ssm SubnetIds: - !Ref PrivateSubnet1a - !Ref PrivateSubnet1c VpcId: !Ref VPC VpcEndpointType: Interface SecurityGroupIds: - !Ref VPCeSecurityGroup PrivateDnsEnabled: true ec2messagesEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Join - '' - - com.amazonaws. - !Ref 'AWS::Region' - .ec2messages SubnetIds: - !Ref PrivateSubnet1a - !Ref PrivateSubnet1c VpcId: !Ref VPC VpcEndpointType: Interface SecurityGroupIds: - !Ref VPCeSecurityGroup PrivateDnsEnabled: true ssmmessagesEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Join - '' - - com.amazonaws. - !Ref 'AWS::Region' - .ssmmessages SubnetIds: - !Ref PrivateSubnet1a - !Ref PrivateSubnet1c VpcId: !Ref VPC VpcEndpointType: Interface SecurityGroupIds: - !Ref VPCeSecurityGroup PrivateDnsEnabled: true S3VpcEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Join - '' - - com.amazonaws. - !Ref 'AWS::Region' - .s3 VpcId: !Ref VPC VpcEndpointType: Gateway RouteTableIds: - !Ref PrivateRouteTable # ------------------------------------------------------------# # Security Group # ------------------------------------------------------------# SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: For EC2 VpcId: !Ref VPC VPCeSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: VpcId: !Ref VPC GroupDescription: For VPCEndpoint SecurityGroupIngress: - SourceSecurityGroupId: !Ref SecurityGroup IpProtocol: tcp FromPort: 443 ToPort: 443 # ------------------------------------------------------------# # IAM Role and Instance Profile # ------------------------------------------------------------# SSMRole: Type: AWS::IAM::Role Properties: RoleName: !Sub ${ResourceName}-ec2-role AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - arn:aws:iam::aws:policy/AmazonS3FullAccess InstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref SSMRole # ------------------------------------------------------------# # EC2 Key Pair # ------------------------------------------------------------# KeyPair: Type: AWS::EC2::KeyPair Properties: KeyName: !Sub ${ResourceName}-key # ------------------------------------------------------------# # EC2 Instance # ------------------------------------------------------------# EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro ImageId: !Ref AMIId SubnetId: !Ref PrivateSubnet1a IamInstanceProfile: !Ref InstanceProfile SecurityGroupIds: - !Ref SecurityGroup KeyName: !Ref KeyPair Tags: - Key: Name Value: !Sub ${ResourceName}-ec2    AWS Tools for Windows PowerShellを利用したローカル⇒サーバへのファイル共有 まず、ローカルからサーバ(EC2)へのファイル転送手順です。 S3へのアップロード まずはローカルのファイルをS3にアップロードします。 今回は、AWS-CLIの導入を対象とします。 AWS CLIの最新バージョンのインストールまたは更新 - AWS Command Line Interface AWS CLI をシステムにインストールまたは更新する手順。 docs.aws.amazon.com ローカルPC上でWindows (64 ビット) 用のインストーラをダウンロードします。 対象ファイルをS3に格納しておきます。 キーペアの値を確認し、EC2に接続 下記記事を参考に、同様の手順でEC2にフリートマネージャー経由で接続します。 フリートマネージャー経由でのWindowsサーバ接続時に、PowerShellのキーボード入力機能を動作させるためには AWS Systems Managerのフリートマネージャーを利用して、Windowsサーバにブラウザベースでのリモート接続している方多いかと思います。その際に、PowerShellでキーボード入力が機能しなかった事象が発生しましたので対処策をお話します。 blog.usize-tech.com 2024.09.09 Read-S3Objectコマンドの実行 PowerShellを開き、コピー&ペーストを使って下記コマンドを実行します。 Read-S3Object -BucketName <Bucket Name> -Key <Object Key> -File <Local File Path> 今回の場合は、以下のようなコマンドとなります。 Read-S3Object -BucketName fukuchi-s3-bucket -Key AWSCLIV2.msi -File C:\Users\Administrator\Downloads\AWSCLIV2.msi  Read-S3Object -BucketName <String> -Key <String> -File <String> -Version <String> -ModifiedSinceDate <DateTime> -UnmodifiedSinceDate <DateTime> -UtcModifiedSinceDate <DateTime> -UtcUnmodifiedSinceDate <DateTime> -ServerSideEncryptionCustomerMethod <ServerSideEncryptionCustomerMethod> -ServerSideEncryptionCustomerProvidedKey <String> -ServerSideEncryptionCustomerProvidedKeyMD5 <String> -ChecksumMode <ChecksumMode> -ClientConfig <AmazonS3Config> -UseAccelerateEndpoint <SwitchParameter> -UseDualstackEndpoint <SwitchParameter> -ForcePathStyleAddressing <Boolean> サーバ上にダウンロードできれば下記画面が表示されます。 AWS-CLIの導入 インストーラーをダブルクリックし、画面の指示に従って進めます。 “Next”を押下します。 チェックボックスにチェックを付与して、”Next”を押下します。 “Next”を押下します。 “Install”を押下します。 無事にインストールが完了しました。”Finish”を押下すると、画面が閉じます。 コマンドプロンプトを開き、下記のコマンドを実行します。 aws --version AWS-CLIをインストールすることができました。   AWS Tools for Windows PowerShellを利用したサーバ⇒ローカルへのファイル共有 今度は、サーバ(EC2)からローカルへのファイル転送手順です。 ファイルの作成 サーバ上の任意の場所でファイルを作成してください。 今回は、notepadを利用して”test.txt”ファイルを作成しておきました。 Write-S3Objectコマンドの実行 PowerShellを開き、コピー&ペーストを使って下記コマンドを実行します。 Write-S3Object -BucketName <Bucket Name> -Key <Object Key> -File <Local File Path> 今回の場合は、以下のようなコマンドとなります。 Write-S3Object -BucketName fukuchi-s3-bucket -Key "test.txt" -File "C:\Users\Administrator\Documents\test.txt" Write-S3Object -BucketName <String> -Key <String> -File <String> -CannedACLName <S3CannedACL> -PublicReadOnly <SwitchParameter> -PublicReadWrite <SwitchParameter> -ContentType <String> -StorageClass <S3StorageClass> -StandardStorage <SwitchParameter> -ReducedRedundancyStorage <SwitchParameter> -ServerSideEncryption <ServerSideEncryptionMethod> -ServerSideEncryptionKeyManagementServiceKeyId <String> -ServerSideEncryptionCustomerMethod <ServerSideEncryptionCustomerMethod> -ServerSideEncryptionCustomerProvidedKey <String> -ServerSideEncryptionCustomerProvidedKeyMD5 <String> -Metadata <Hashtable> -HeaderCollection <Hashtable> -TagSet <Tag[]> -ChecksumAlgorithm <ChecksumAlgorithm> -ConcurrentServiceRequest <Int32> -CalculateContentMD5Header <Boolean> -PartSize <FileSize> -IfNoneMatch <String> -Force <SwitchParameter> -ClientConfig <AmazonS3Config> -UseAccelerateEndpoint <SwitchParameter> -UseDualstackEndpoint <SwitchParameter> -ForcePathStyleAddressing <Boolean> S3上にアップロードできれば下記画面が表示されます。 S3コンソールを確認し、該当のファイルが格納されていますね。その後は、マネジメントコンソール等を利用してS3内のファイルをローカルにダウンロードすればOKです。   まとめ 閉域網環境のEC2(Windows)でも、AWS Tools for Windows PowerShellがインストール済みのため、各種AWSのAPIを利用することができます。 AWS Tools for PowerShell Reference docs.aws.amazon.com   最後に いかがだったでしょうか。 AWS Tools for Windows PowerShellを利用すれば、閉域網環境でも容易にファイル共有ができました。普段はAWS-CLIを使う機会が多いですが、これを機に積極的に利用してみようと思います。 本記事が皆様のお役にたてば幸いです。 ではサウナラ~🔥
アバター
こんにちは。SCSKの磯野です。 Dataplexにはデータリネージ機能があります。BigQueryでどのように加工したときがリネージ対象なのか、調べてみました。 データリネージとは? データリネージ とは、データがいつ、どこで、どのように取得され、今の状態にあるのかを追跡し、データの流れを可視化する機能です。データリネージは、DataPlex の機能名ではありますが、Google Cloud に限らず一般的に使われる用語です。   BigQueryでどのように加工したときにリネージされる? 公式ドキュメント には、以下の記載があります。 BigQuery プロジェクトでデータリネージを有効にすると、Dataplex によって次のリネージ情報が自動的に記録されます。 次の BigQuery ジョブの結果として新しいテーブルが作成されます。 コピージョブ Cloud Storage URI を使用して Cloud Storage から許可された形式でデータを読み込む 読み込みジョブ * Google 標準 SQL で次のデータ定義言語(DDL)を使用する クエリジョブ CREATE TABLE CREATE TABLE AS SELECT CREATE TABLE COPY CREATE TABLE CLONE CREATE TABLE FUNCTION CREATE TABLE LIKE CREATE VIEW CREATE MATERIALIZED VIEW Google 標準 SQL で次のデータ操作言語(DML)ステートメントを使用した結果としての既存のテーブル 次にリストされたテーブルタイプのいずれかに関連付けられた  SELECT 。 BigQuery ビュー BigQuery マテリアライズド ビュー BigQuery 外部テーブル INSERT SELECT MERGE 更新 削除 検証対象 実際にどのように加工するとリネージされるのか、以下の4パターンを調べてみました。 Python(BigQuery API、pandas) ※実行基盤はCloudRunまたはVertex AI Workbench Python( BigQuery DataFrame ) ※実行基盤はCloudRunまたはVertex AI Workbench magicコマンド ※実行基盤はVertex AI Workbench Dataform Python(BigQuery API、pandas) CloudRun・Vertex AI Workbenchの両方で試しましたが、リネージされませんでした。 from google.cloud import bigquery import pandas as pd import google.cloud.logging log_client = google.cloud.logging.Client() log_client.setup_logging() client = bigquery.Client() def main(): query = """ SELECT PassengerId, Survived, Name FROM xxx_dataset.transfer_titanic """ df = client.query(query).to_dataframe() client.load_table_from_dataframe(df,"xxx_dataset.dataplex_test_table_by_vertexai_pandas") if __name__ == '__main__': main() Python(BigQuery DataFrame) CloudRun・Vertex AI Workbench、どちらの環境でもリネージされました。 ※BigQuery DataFrameは2024年9月時点でプレビュー版であるため注意 import bigframes.pandas as bpd import google.cloud.logging log_client = google.cloud.logging.Client() log_client.setup_logging() def main(): query = """ SELECT PassengerId, Survived, Name FROM xxx_dataset.transfer_titanic_test_copy2 """ df = bpd.read_gbq(query) df.to_gbq("xxx_dataset.dataplex_test_table_by_vertexai_bpd", if_exists='replace') if __name__ == '__main__': main() magicコマンド Vertex AI Workbenchで実行したところ、リネージされました。 %%bigquery CREATE TABLE `dxr-poc.xxx_dataset.dataplex_test_magic` CLONE `dxr-poc.xxx_dataset.transfer_titanic_test_copy3`; Dataform 下記に従って検証したところ、リネージされました。 SQL ワークフローを作成して実行する  |  Dataform  |  Google Cloud   さまざまなユースケース スクレイピング等でGCP環境外のデータをBigQueryに格納する場合 リネージ対象はGCP環境内のみ。一度GCSを経由すれば、GCSーBigQuery間のみリネージされます。 プロジェクトをまたぐ場合 両方のプロジェクトにて以下のAPIが有効にされていればリネージ可能です。 Google Cloud Data Catalog API Data Lineage API   結論 GCP外のデータをリネージすることはできないものの、データ取得時に一度GCSへ格納しつつ、BigQuery DataFrameを使うことでデータリネージが可能でした。 pandas APIはリネージの対象外でした。 BigQuery DataFrameを使うことでリネージは可能ですが、実行基盤を特定することはできませんでした。また、実行の度にリネージが作成されるため、視認性は低いです。 Dataformやmagicコマンドはリネージの対象でした。 すべてのリネージ情報は  30 日間のみ システムに保持されます。 →定期実行しているものであれば問題ないですが、スポット実行のテーブルのリネージは消えてしまうため注意が必要です。 補足 カスタムリネージ について Dataplexがメタデータの自動収集の対象外としている処理については、リネージも自動作成できませんが、カスタムリネージを作成することで、表示することは可能です。 データリネージについて  |  Data Catalog のドキュメント  |  Google Cloud リネージが作成されるまで、少しタイムラグがあります。今回の検証では、ジョブが終わってから約10分ほどで生成されました。 ※公式ドキュメントには下記の記載があります。 BigQuery リネージは、BigQuery ジョブが完了してから 24 時間以内に表示されます。 リネージ情報は、関連するデータソースを削除した後も保持されます。つまり、BigQuery テーブルとその Data Catalog エントリを削除しても、API を使用して最大  30 日間 は、そのテーブルのリネージを読み取ることができます。
アバター
こんにちは。SCSKの江木です。 以前、以下の記事を執筆しましたが、Dialogflow CX自体が初めてでわかりくいという方もいらっしゃったかもしれません。 Dialoglflow CXのWebhookを使ってTranslation APIを叩いてみた Dialogflow CXで構築しているチャットボットに翻訳機能を追加するために、WebhookでTranslation APIを叩く方法を紹介します。 blog.usize-tech.com 2024.02.26 そこで今回は、Dialogflowの基礎知識を改めて整理して紹介していきます。 この基礎知識があれば、Dialogflow CXでAgentを構築できるようになるので、最後までご覧ください。 Dialogflowとは? CCAIサービスの1つで、仮想エージェントを備えた、自然な会話を実現するAIです。一言でいうと、チャットボット兼ボイスボット(以下、チャットボットと省略して記載します。)を作ることができるサービスです。DialogflowにはCXとESの2種類が存在します。 Dialogflow CX 大規模なエージェントや非常に複雑なエージェントに適した高度なエージェントタイプを提供 Dialogflow ES 小規模エージェントとシンプルなエージェントに適した標準エージェントタイプを提供 Dialogflow CXについて GUI Dialogflow CXのGUIは以下のようになっております。 右側の[Build]タブ、[Manage]タブからAgentの設定をすることができます。また、左側の[Test Agent]でテストを行うこともできます。 用語 続いて、Dialogflow CXを触るうえで理解する必要がある用語解説していきます。 Agents Dialogflow CXで作成する チャットボット のことです。Dialogflow CXでは様々なロケーションにエージェントを作ることができます。また、1つのプロジェクトで複数のエージェントを作成することもできます。 Flows 複雑な会話に関して、複数のトピックを取り扱うための仕組みです。 会話の流れや分岐 を視覚化したもので、Page同士のつながりを見ることができます。開始時にはDefault Start FlowというFlowが存在します。以下の図全体がFlowです。 Pages 会話の各ステップを表したものです。PageにはEntry fulfillmentやRoutes(後述します)を設定します。以下の赤枠で囲った部分がPageです。 Entry fulfillment そのPageに遷移したときにAgentが発言するメッセージです。下図の例ですと、Start PageからStore Hoursに遷移したとき、Entry fulfillmentに設定されている「月曜日から土曜日まで9:00-19:00mで営業していま…」をAgentが発言します。 Routes 会話のFlowを制御するためのもので、PageからPage(またはFlow)への遷移を決定します。Routeにはintentsを設定します。このRouteで以下の図の矢印がRouteです。 Intents エンドユーザー(チャットボットを利用する人)の 意図(言葉) を分類します。以下の図のように「Training phrases」という項目でエンドユーザーが発言する言葉を学習させます。 Agentの作り方 Agentの作り方の基本を紹介していきます。 まず、Dialogflow CXのコンソールにアクセスし、[Create Agent]を押下します。 自由にカスタマイズしたいので、[Build your own]を選択します。 Agentの設定を行います。言語はjaにしてください。設定が完了したら、[Create]を押下してください。 Agent作成画面が立ち上がりました。 FlowやPageを作りたい場合は、[Build]タブから、IntentやEntity、外部との連携をしたい場合は[Manage]タブからAgentの機能を開発していきます。 実際に作成したAgentをもとに、会話の流れをつかんでみる 今回はDialogflow CXのハンズオンをもとにAgentを作成しました。ハンズオンの詳細が知りたい方は以下のサイトをご参照ください 【Dialogflow cx】はじめてみよう google cloud dialogflow cx 編 【Dialogflow cx】はじめてみよう google cloud dialogflow cx 編 - Download as a PDF or view online for free www.slideshare.net 作成したAgentは以下の通りです。ここでは下図のStart PageからStore Hoursへ遷移するときの発言の流れを例に説明します。 Start PageにはStore Hoursに遷移するためにstore.hoursという名前のRouteを設定しています。また、store.hoursにはstore.hoursという名前のintentを設定しています。設定は以下の通りです。 Start Pageからの遷移先であるStore HoursのEntry fulfilmentには以下の通りの設定をしています。 以上の設定を踏まえると、Agentとの会話の流れは以下の通りです。 Start Pageからスタート エンドユーザが営業時間を聞くようなフレーズを入力 intentであるstore.hoursのTraining phrasesに登録されたフレーズに類似したフレーズがエンドユーザーから入力されたため、store.hoursというRouteが選択される Routeであるstore.hoursの遷移先はStore Hoursであるため、Start PageからStore Hoursへ遷移 Store HoursのEntry fulfillmentに登録した、「月曜日から土曜日まで9:00 -19:00 で営業しています。日曜祝日は定休日です。その他ご用件はございますでしょうか。」というフレーズをAgentが発言 一般化してみる Agentとの会話の流れを一般化してまとめてみます。 上のようなフローがあるとき、Agentとの会話の流れは以下の通りとなっています。 Page Aからスタート。Page AのFufillmentのAgent saysで設定された「こんにちは」というフレーズをAgentが発言。 エンドユーザがフレーズを入力 Page AのRoute1に設定されたIntentのTraining phrasesに登録されたフレーズに類似したフレーズがエンドユーザーから入力されるとRoute1が選択される Route1のTransition(遷移先)はPage Bであるため、Page AからPage Bへ遷移 Page AのEntry fulfillmentのAgent saysに設定した、「遷移したよ」というフレーズをAgentが発言 FufillmentやRoute以外にもPageには様々な設定項目があり、Agentに柔軟な発言をさせることができますが、遷移の基礎は上記の通りになります。 おわりに 今回はDialogflow CXの基本を整理してみました。 今回紹介した内容でも十分Agentを作ることができますが、自由度は低いです。 今後の記事では、紹介していない機能や生成AIの機能、Dialogflow CXでAgentを作成するときのTipsについて紹介できたらと思います。 最後まで読んでいただきありがとうございました。
アバター
こんにちは。SCSKのふくちーぬです。 AWS Systems Managerのフリートマネージャーを利用して、Windowsサーバにブラウザベースでのリモート接続している方多いかと思います。その際に、PowerShellでキーボード入力が機能しなかった事象が発生しましたので対処策をお話します。 アーキテクチャー Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。 運用者は、フリートマネージャーを利用してEC2に接続します。 完成したCloudFormationテンプレート 以下のテンプレートをデプロイしてください。 AWSTemplateFormatVersion: 2010-09-09 Description: CFN template EC2 Parameters: ResourceName: Type: String AMIId: Type: String Resources: # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: !Sub ${ResourceName}-VPC # ------------------------------------------------------------# # Internet Gateway # ------------------------------------------------------------# InternetGateway: Type: AWS::EC2::InternetGateway AttachGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway # ------------------------------------------------------------# # Public Subnet # ------------------------------------------------------------# PublicSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: ap-northeast-1a MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub ${ResourceName}-subnet-1a # ------------------------------------------------------------# # Route Table and Routes # ------------------------------------------------------------# PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: PublicRouteTable PublicRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway PublicSubnet1aAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet1a RouteTableId: !Ref PublicRouteTable # ------------------------------------------------------------# # Security Group # ------------------------------------------------------------# SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: For EC2 VpcId: !Ref VPC # ------------------------------------------------------------# # IAM Role and Instance Profile # ------------------------------------------------------------# SSMRole: Type: AWS::IAM::Role Properties: RoleName: !Sub ${ResourceName}-ec2-role AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore InstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref SSMRole # ------------------------------------------------------------# # EC2 Key Pair # ------------------------------------------------------------# KeyPair: Type: AWS::EC2::KeyPair Properties: KeyName: !Sub ${ResourceName}-key # ------------------------------------------------------------# # EC2 Instance # ------------------------------------------------------------# EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro ImageId: !Ref AMIId SubnetId: !Ref PublicSubnet1a IamInstanceProfile: !Ref InstanceProfile SecurityGroupIds: - !Ref SecurityGroup KeyName: !Ref KeyPair Tags: - Key: Name Value: !Sub ${ResourceName}-ec2   本事象の確認 キーペアの値を確認し、EC2に接続 Systems Manager パラメータストアにアクセスし、キーペアの値をメモしておく。 上記の値を利用して管理者パスワードを復号します。 フリートマネージャーを利用し管理者パスワードを入力し、EC2に接続します。 PowerShellでキーボード入力が機能しないことを確認 PowerShellを開き、キーボードで文字の入力を試みますが動作しません。 ※メモ帳内の文字をコピー&ペーストで、PowerShellに貼り付けることはできます。   解決策 PowerShellにて、PSReadlineモジュールをインストールすることで解決できます。 モジュールのインストール PSReadLineモジュールは、コマンド ラインを編集させるためのモジュールとなります。このモジュールのおかげで、コマンド履歴を追ったりすることができます。 PSReadLineのバージョン2.2.2以上をインストールします。 キーボード入力機能は利用できないため、コピー&ペーストを使って下記コマンドを実行します。 Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.2.2 -Force  Yes/Noの確認プロンプトが表示されたら、”Y”を入力します。この際も、コピー&ペーストを使って入力することに注意してください。 PowerShellでキーボード入力が機能することを確認 再度、PowerShellを開きます。キーボードから任意の文字を入力してみます。 無事にキーボード入力が機能しましたね。   まとめ Windows Server 2022では、PowerShell でキーボードが正常に機能するためにはPSReadLine のバージョン 2.2.2 以上が必要です。 本制約は、フリートマネージャー利用時特有のものとなります。 キーボード機能用 PSReadLine モジュールバージョン PowerShell でキーボードが正しく機能することを確認するには、Windows Server 2022 を実行しているノードに PSReadLine モジュールバージョン 2.2.2 以降がインストールされていることを確認してください。古いバージョンを使用している場合は、以下のコマンドを使用して、必要なバージョンをインストールできます。 Remote Desktop を使用して Windows Server マネージドインスタンスに接続する - AWS Systems Manager Fleet Manager を使用して RDP 経由で Windows Server マネージド EC2 インスタンスに接続します。 docs.aws.amazon.com Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.2.2 -Force  代替策として、以下の方法もございますので併せてご検討いただければと思います。 プライベートなRDP接続 EC2 Instance Connect Endpoint経由でのRDP接続   最後に いかがだったでしょうか。 フリートマネージャー利用時には、WindowsサーバのモジュールをアップデートすることでPowerShellを正常に機能させることができます。 本記事が皆様のお役にたてば幸いです。 ではサウナラ~🔥
アバター
こんにちは。SCSKの山口です。 本ブログでは、前回のブログで作成したBigQuery MLの線形回帰モデルの性能を評価してみたいと思います。 [前回ブログ]モデル作成・予測結果 【GCP】BigQuery MLを触りたいときに読むブログ 今回はBigQuery MLを使って機械学習モデルの作成、テストをやってみます。 AI/MLの知識はあまりないがとにかくBigQuery MLを触ってみたい方、BigQuery MLでモデルを作成して推論してみたい方にぜひ読んでいただきたいブログです。 blog.usize-tech.com 2024.09.06 前回のブログで線形回帰モデルの作成・予測をした結果、下記の出力を得ました。 従業員数 モデル予測結果(原材料費) 正解値(原材料費) 476 1344.5283231034557 1564 この結果は果たしてどうなのでしょうか、、?モデルの予測精度はどうなのでしょうか、、? これを今回は計測したいと思います。   モデル評価 BigQuery ML モデルの評価の概要  |  Google Cloud cloud.google.com 作成したモデルの評価は、 「ML.EVALUATE関数」 を用いることで可能です。 選択したモデルタイプによって、他の評価関数を使用することで様々な評価指標を得ることができます。詳細は 公式ドキュメント をご覧ください。 今回はモデルタイプとして線形回帰を選択したので、ML.EVALUATE関数で評価してみます。 下記SQLを実行します。 SELECT * FROM ML.EVALUATE(MODEL `yamaguchi_test_bqml.test_model_liner_reg`,   (   SELECT     IFNULL(cost_manufacturing, 0) AS cost_mf,     IFNULL(cost_material, 0) AS label,     IFNULL(cost_employees, 0) AS cost_emp,     IFNULL(manufacturing_line, 0) AS manu_line,     IFNULL(manufacturing_efficiency, 0) AS manu_eff,     IFNULL(employees, 0) AS emp   FROM     `scsksdv-dev-dais.yamaguchi_test_bqml.test` )); 実行結果 公式ドキュメントを見ると、線形回帰のモデルでは、ML.EVALUATE関数を実行することで下記の指標が得られます。 mean_absolute_error:平均絶対誤差 mean_squared_error:平均二乗誤差 mean_squared_log_error:平均二乗対数誤差 median_absolute_error:絶対誤差の中央値 r2_score:R2スコア explained_variance:説明分散   回帰モデルの評価指標 平均絶対誤差:MAE SCSK AI AutoML 「誰でも」「簡単に」AIを利用できるようにするために、SCSKでは、H2O Driverless AIやLearning Center Forecastなど、データサイエンティストによる機械学習モデル作成を自動化・高速化するソリューションを... www.scsk.jp 平均絶対誤差(MAE)は、各行で[予測値 – 正解値]の絶対値(=絶対誤差)を取り、その平均を出したものです。 以下の式で表されます。 MAEの代表的な特性は下記のとおりです。 0以上の値 小さいほど良い結果となる 外れ値に対して脆弱 今回の結果で言うと、MAE=190くらいなので、 「予測値と正解値が平均して190くらい離れている」 ということになります。 評価で使用したtestテーブルに外れ値を加えてMAEの値を見てみましょう。 21行目に原材料費が外れ値となるようなデータを追加しました。 この状態で再度モデルを評価してみると、 MAEの値がかなり大きくなりました。 このようにたった一つでも 外れ値のデータが入ってしまうと値が大きくなってしまう のがMAEの弱点です。 平均二乗誤差:MSE SCSK AI AutoML 「誰でも」「簡単に」AIを利用できるようにするために、SCSKでは、H2O Driverless AIやLearning Center Forecastなど、データサイエンティストによる機械学習モデル作成を自動化・高速化するソリューションを... www.scsk.jp 平均二乗誤差(MSE)は下記の式で表されます。 先ほどのMAEとかなり似た式ですが、予測値と正解値の差を二乗している点が違いです。 誤差を二乗しているため、より大きな誤差が発生していると値が大きくなります。すなわち、 間違いをより重要視した指標 ということになります。 この指標も 値が小さいほど良い結果 となります。 お気づきの方も多いかもしれないですが、MSEは MAEよりも外れ値に対して脆弱 です。 誤差を二乗しているため、その分外れ値に対しても弱くなってしまうわけですね。 平均二乗対数誤差:MSLE [損失関数/評価関数]平均二乗対数誤差(MSLE:Mean Squared Logarithmic Error)/RMSLE(MSLEの平方根)とは? 用語「平均二乗対数誤差」について説明。損失関数/評価関数の一つで、各データに対して「予測値の対数と正解値の対数との差(=対数誤差)」の二乗値を計算し、その総和をデータ数で割った値(=平均値)を表す。 atmarkit.itmedia.co.jp 平均二乗対数誤差(MSLE)は、各行で 予測値の対数と正解値の対数の差(=対数誤差)の二乗 を計算し、その平均を出したものです。 0に近いほど良い結果 となります。 下記の式で表されます。 数学では、底が同じ対数の引き算は割り算に変換することができます。これに着目すると、上記の式は 「予測値/正解値」 の形に変換することができます。 すなわちMSLEは、 予測値/正解値の比率に着目した指標 であるということが言えます。 比率に着目することで、 誤差が大きくなっても過大に評価しないこと が可能です。 そのため、MAE,MSEの弱点であった、 外れ値への脆弱性をある程度克服した指標 と言えます。 絶対誤差中央値:MedAE [評価関数]中央絶対誤差(MedAE:Median Absolute Error)とは? 用語「中央絶対誤差」について説明。評価関数の一つで、各データに対して「予測値と正解値の差(=誤差)」の絶対値を計算していき、それら全ての計算結果における中央値を表す。 atmarkit.itmedia.co.jp そのまま略すと「MAE」となり平均絶対誤差と混同してしまうので「MedAE」と略すのが一般的のようです。 MedAEは、各行で[予測値 – 正解値]の絶対値(=絶対誤差)を計算し、 小さい順に並べた際の中央値 を出したものです。 下記の式で表されます。 この値も、 0に近いほど良い結果 となります。 決定計数:R2スコア SCSK AI AutoML 「誰でも」「簡単に」AIを利用できるようにするために、SCSKでは、H2O Driverless AIやLearning Center Forecastなど、データサイエンティストによる機械学習モデル作成を自動化・高速化するソリューションを... www.scsk.jp R2スコアは、回帰モデルを評価する際に 「最も直感的な基準」 だと言われています・ これまで説明した指標はすべて誤差を見るものでしたが、ここでやっと モデルの性能(良し悪し) を測ることのできる指標が登場します。 複数のモデルの性能を比較する際にもよく使われる指標で、 モデルがどれだけデータをうまく説明できているか を表現してくれる値です。 テストの点数に置き換えると理解しやすいです。 数学のテストの点数が高い:数学についてよく理解できており、説明できる。 英語のテストの点数が悪い:英語についてよく英買いできておらず、説明できない。 下記の式で表されます。 SSEとSSTについてみていきます。 残差平方和:SSE 各行に対して、 観測値(正解値)と予測値の差 を二乗した値を総和したもの MSE の平均を求めないバージョン 正解値と予測値がどれくらい離れているかを示す 二乗平均:SST 各行に対して、 観測値(正解値)と全観測値の平均との差 を二乗した値を総和したもの 分散 の平均を求めないバージョン 正解データ自体の平均からのばらつき具合を示す これを抑えたうえでr2スコアの公式をもう一度見ると、 予測値に正解データの平均値を用いた ” 単純なモデル ” と ” 作成したモデル ” を比較(前者で後者を割る)する という作りになっていることがわかります。このことから、 r2スコアは非常に単純なモデルと比較した際のパフォーマンスを示している と言えいます。 R2スコアは、 1に近づくほど良い結果 となります。 説明分散:EV [評価関数]分散説明率(Explained variance score)とは? 用語「分散説明率」について説明。線形回帰モデルなどの評価関数の一つで、回帰式のモデルが「観測データの分散」のうちどれくらいの割合を説明するかを表す。決定係数R2の代わりに用いられることがある。 atmarkit.itmedia.co.jp 説明分散(ここではEVと略します。)は、R2スコアと同様にモデルの性能を測ることができる指標です。 正解データの散らばり(分散)のうち、モデルがどのくらいの割合を説明できるか を表現する指標です。 下記の式で表されます。 式のつくりを見ていきますが、視覚的に把握するために図式化します。 オレンジ色:モデル予測できた割合 紺色:モデル予測できなかった(誤差)割合 です。 EV値では上図のオレンジ色の部分を以下の流れで表現します。 EV値は、 1に近づくほど良い結果 となります。   作成したモデルの性能はどうなの? 必要な知識が揃ったところで、今回作成した線形回帰モデルの性能を見てみたいと思います。 R2スコアとEV値を見てみると、 R2スコア:0.568692977058064 EV値:0.58093681298823574 という結果でした。だいたい60点くらいの性能のモデルですね。   まとめ 今回は線形回帰モデルを評価してみました。 複数の指標を組み合わせて評価することが非常に重要だと感じました。 ほとんど指標の説明に費やしてしまいましたが、今後はモデルの性能を向上させるための方法を調べてみたいなと思っています。
アバター
こんにちは。SCSKの山口です。 今回はBigQuery MLを使って機械学習モデルの作成、テストをやってみます。 こんな方にオススメの記事です。 ・とにかくBigQuery MLを触ってみたい ・BigQuery MLでモデルを作成してみたい ・BigQuery MLでモデルを使って推論してみたい 筆者はこんな人です。 ・Google Cloud歴:約2年 ・BigQueryのコンソール操作には慣れている ・ SQLが少し書ける ・AI/MLの知識はあまりない 今回のブログでは、BigQuey MLを試すために最低限必要な事項にフォーカスして書きます。 より詳細な概念、知識に関しては後続のブログをお待ちください。 BigQuery ML BigQuery ML とは  |  Google Cloud cloud.google.com まずはBigQuery MLについて紹介します。 BigQuey MLでは、 GoogleSQLクエリ を使用して、 MLモデルの作成と実行 を行うことができます。 BigQuey MLを使用する最大のメリットは、 AI/MLのプログラミング経験が少ないデータアナリストでも、SQLの知識とツールでモデルの構築・評価ができる点 にあるといえます。 大規模なデータセットでAI/MLタスクを実行するには、各フレームワークに対する高度なプログラミング技術と知識が必要になります。 そのため データをよく理解しているアナリスト が、プログラミング経験が少ないばかりにソリューション開発から除外されてきましたが、BigQuey MLはそれを解決してくれます。 BigQuey MLは、下記の方法で使用できます。 Google Cloudコンソール bqコマンドラインツール BigQuery REST API BigQueryに統合されたColab Enterpriseノートブック Jupyter ノートブックやビジネス インテリジェンス プラットフォームなどの外部ツール 今回は、Google Cloudコンソール(BigQuery画面)でBigQuey MLを触ってみます。 また、BigQuery MLでは 下記のモデル が内部でトレーニング済みで、BigQuery MLに組み込まれています。 線形回帰 ロジスティック回帰 K平均法クラスタリング 行列分解 主成分分析(PCA) 時系列 上記以外にも様々なモデルが使用可能です。詳細は こちら の公式ドキュメントをご参照ください。 今回は、 線形回帰 のモデルを使用して予測を行います。   BigQuey ML使ってみた では、さっそく触ってみます。 事前準備 今回は、モデルのトレーニング用とテスト用で二つのテーブルを用意しました。(※同一データは含んでいない) スキーマ情報(2テーブル共通) training:80行 test:20行 モデルを作成し推論するにあたって、下記を決めておきます。 目的変数:予測したいデータ 説明変数:予測するために使用するデータ 今回は 目的変数を「cost_material:原材料費」 とし、 説明変数をその他のカラム とします。 モデル作成・トレーニング 下記SQLを実行して、モデルを作成します。 CREATE OR REPLACE MODEL `yamaguchi_test_bqml.test_model_liner_reg` OPTIONS(model_type='linear_reg') AS SELECT IFNULL(cost_manufacturing, 0) AS cost_mf, IFNULL(cost_material, 0) AS label, --目的変数 IFNULL(cost_employees, 0) AS cost_emp, IFNULL(manufacturing_line, 0) AS manu_line, IFNULL(manufacturing_efficiency, 0) AS manu_eff, IFNULL(employees, 0) AS emp FROM   `yamaguchi_test_bqml.training` ; CREATE MODEL文で簡単にモデルを作成することが可能です。OPTIONS句内で今回使用する線形回帰(linear_reg)を指定しています。 その後のSELECT文によって指定されたデータを使用してモデルをtrainingします。 また、 「cost_material」 に対して、 「label」 というエイリアスを作成することで、 cost_materialが目的変数であること を示しています。CREATE句でinput_label_cols=オプションを使用して目的変数を設定することも可能です。 最後のFROM句でトレーニング用のテーブル「training」を指定しています。 モデル作成が完了すると、エクスプローラ画面の「モデル」配下に作成したモデルが表示されます。 以上でモデルの作成・トレーニングは完了です。 モデルテスト 作成したモデルを使って予測をしてみます。 下記SQLを実行します。 SELECT predicted_label AS predicted_costs FROM ML.PREDICT(MODEL `yamaguchi_test_bqml.test_model_liner_reg`,   (   SELECT     IFNULL(cost_manufacturing, 0) AS cost_mf,     IFNULL(cost_employees, 0) AS cost_emp,     IFNULL(manufacturing_line, 0) AS manu_line,     IFNULL(manufacturing_efficiency, 0) AS manu_eff,     IFNULL(employees, 0) AS emp   FROM     `yamaguchi_test_bqml.test`   WHERE     employees=476 )) ML.PREDICT関数 を使って予測を行います。モデルの出力列名は predicted_<label_column_name> としています。 SELECT句で指定しているpredicted_labelは labelの推定値 になります。 ネストされたSELECT句は、モデル作成のCREATE MODEL句と同じにしていますが、FROM句にはtestテーブルを指定しています。 trainingのデータでモデルを学習させ、testのデータを使って予測の挙動を見る。といった狙いです。今回は、 「従業員数が476人の場合の原材料費」 を予測しています。 予測結果を見てみましょう。 1344.5283 …という予測が得られました。testテーブルの実際のデータを比較してみると、 、、、、何とも言えない結果ですね。。 とはいえ、そこまでかけ離れている数値ではないです。 予測の精度が良くない原因として、そもそも学習に使用するデータ量が少ない点がまず考えられます。 それ以外にもモデルを学習させる際に、CREATE句のOPTION内で様々な設定をし、予測精度を上げることも可能です。ここについては後続のブログで書きたいと思います。   まとめ 今回は、BigQuery MLを使ってモデルを作成し、実際に予測をしてみました。 今回は 公式ドキュメント に沿って実践を進めたのですが、「モデルの評価」については本ブログでは触れませんでした。(長くなりそうだったので。) 今回作成したモデルの評価結果を先出しておきます。 こんな感じです。初めて見る評価指標がズラリと並んでいたので、この辺りは別のブログで深堀していきます。
アバター
こんにちは。SCSK 中山です。 少し前に発表のあったDevice Postureのアップデートでプロファイルでレジストリキーの値や稼働しているプロセスを条件として設定できるようになりました。 弊社アカウントにもアップデートが適用されましたので、今回は設定・動作検証をしてみたいと思います。 と、その前に、、 Device Postureという機能を軽く説明しておきます。 Device Postureとは Device Postureとは、端末の状態をチェックし属性を付与する機能です。付与した属性に対してポリシーを設定することで、要件を満たさない端末をネットワークへ接続させないといったコントロールが可能になります。 詳細については、別途記事を書いておりますので、こちらをご覧ください。 CatoクラウドでDevice Postureを利用したい Device Postureの簡単な設定例と動作検証結果をご紹介します。 blog.usize-tech.com 2024.05.17 Device Postureは設定できる条件がいくつかあり、よく使われるところだとクライアントのセキュリティソフトのインストール有無、セキュリティソフトのバージョンのチェックがありますが、今回のアップデートでは条件として端末のレジストリキーの値や指定したプロセスが稼働しているかが指定できるようになったという感じです。 合わせてこの記事では触れてませんが、MacOS向けに「Property List」での指定も追加されております。 詳しくはCatoのナレッジをご確認ください。対応OS/Cato Clientのバージョンも記載されております。 Creating Device Posture Profiles and Device Checks   それでは早速設定・検証をしていきたいと思います。 実施手順 レジストリキーの設定 ① CMAから、「Access」 >「 Device Posture」>「Device Checks」の「New」から新規のポリシーを作成します。 ②「General」>「Device Test Type」で「Registry Key」を選択します。 ③ 「Criteria」にポリシーの内容を記載します。 OS:Windows Registry Key Path:<設定したいレジストリーのパス> Key Value Name:<設定したいレジストリキーの名前> Key Value Data:<設定したいレジストリキーの値> イメージとしては、「Registry Key Path」と「Key Value Name」でレジストリキーのフルパスを作る感じです。 例えば、以下画像のレジストリキー(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoUpdate)の値で条件を作成したい場合、CMA側の設定はこんな感じになります。 ◆レジストリエディターの画面 ◆CMAの設定画面 レジストリキーに何かしら値が入っていたら、、、という条件の場合は「Key Value Data」で「Any Value」を選択してください。   ④ ポリシーを作成できたら、「Device Posture Profiles」より、新規でプロファイルを作成し、③で作成したポリシーを紐づけます。   プロセスの設定 ① レジストリキーの設定と同様に新規ポリシーを作成します。 ②「General」>「Device Test Type」で「Running Process」を選択します。   ③「Criteria」にポリシーの内容を記載します。(以下設定はWindowsの場合) OS:Windows Process Name or path:<設定したいプロセスのフルパス or プロセス名> Signer Certificate Thumbprint:<証明書の拇印> 以下は検証の際にAWSのssm-agentで設定した際のCMAの画面です。 プロセス名、拇印の確認方法 ・ プロセス名 「タスクマネージャー」よりプロセスの「プロパティ」を開くことで確認できます。 フルパスで指定したい場合には、同じようにプロパティ画面から確認できます。 CMAには 場所+プロセス名+ファイルの種類で記載すれば設定できます。 上記の場合、「C:\Program Files\Amazon\SSM\amazon-ssm-agent.exe」と指定する感じです。 サービスとして稼働している場合には、各サービスのプロパティ画面から直接フルパスを確認できます。   ・ 証明書の拇印の確認方法 ① プロセス名の確認手順と同様にタスクマネージャからプロセスのプロパティを開きます。 ② 「デジタル署名」タブを開き、署名を選択し、詳細を開きます。 ③「証明書の表示」し、証明書の「詳細タブ」を開きます。 詳細の中に「拇印」という項目があるので、その値をCMAの「Signer Certificate Thumbprint」に記載します。 Device Postureの設定自体はこれで完了です。 「Client Connectivity Policy」や「 Internet Firewall」、「WAN Firewall」で 作成したプロファイルを指定することで、対象のデバイスをコントロールすることができます。   実際にやってみた レジストリキーを指定する場合、プロセスを指定する場合、どちらも検証してみました。 レジストリキーはWindows Updateを無効化しているデバイスをCatoに接続できなくするような設定で検証してみました。 CMAの各設定はこんな感じです。 ◆ Device Checks 「Default」はレジストリエディター上で(規定)となっている箇所の時に使用します。 ◆ Device Posture Profile ◆ Client Connectivity Policy 今回設定しているレジストリキーはWindows Updateの自動更新を有効にする場合は「0」、自動更新を無効にする場合は「1」を設定するような項目になっていて、このポリシーでは自動更新が有効の場合、ポリシー1が適用されCatoに接続できますが、自動更新が無効の場合はポリシー2が適用され、接続できなくするような設定になってます。 クライアント側のレジストリキーはこんな感じで設定しました。 値を1にして自動更新を無効にしてます。 これでいざCato Clientの接続を試みると、、 エラーが出て接続できませんでした。 こんな感じでWindows Updateを無効化している端末をCatoに接続できないようにできました。 次にプロセスを指定する場合を検証しました。 操作ログ取得系のアプリがバックグラウンドで動いているイメージで、そのアプリを停止させるとCatoに接続できなくするような想定で検証しようと思いましたが、操作ログ取得系のアプリが検証環境になかったので、適当にバックグラウンドで動いているアプリを指定して検証しました。 CMAの各設定はこんな感じです。 ◆ Device Checks ◆ Client Connectivity Policy ◆ Client Connectivity Policy 基本的にはレジストリと同様でプロセスが稼働中はポリシー1が適用され、プロセスが停止中の場合はポリシー2が適用され接続できないような設定になってます。   クライアント側のプロセス稼働状況はこんな感じです。 設定した「amazon-ssm-agent」が稼働しております。 この状態で接続をすると、、 プロセス稼働中はもちろん接続はできます。   Catoに接続した状態のまま、「amazon-ssm-agent」のプロセスを停止して放置します。 ~5分後~ 接続が切れてしまい、再接続もできなくなりました。 本環境では、Device Postureのチェック間隔を5分にしていたため、検証では再チェックのタイミングで接続が切れました。 このように定期的にチェックが入るため、接続時のみプロセス稼働させておき、接続後にプロセスを落とすということはできないようになってます。 また、上記含めて「Client Connectivity Policy」でCatoに接続させるか否かを制御しておりますが、 Internet Firewall、WAN Firewallで もDevice Postureの設定を使った制御も可能です。 一応こんな感じです。 ◆ インターネットFW 「Action」部分を載せてませんが、「BLOCK」に設定していて、「Device Posture Profiles」の条件に該当する通信は全拒否するようにしてます。Profileは先程のプロセスで検証したものと同様。 ◆Cato Client 「Client Connectivity Policy」で制御していないので、Cato自体への接続はできてます。 Catoに接続 かつ 「amazon-ssm-agent」のプロセスが稼働している状態でインターネットにアクセスしようとすると、、 今回は条件該当する場合に通信をBLOCKするので、アクセスができないようになってます。   もちろんプロセスを止めると、条件に当てはまらないので、通常通りインターネットにアクセスすることができました。   余談ですが、ふと思いつきで複数ユーザでログインした状態でプロセスの判定を検証したところ、片方のユーザがプロセス起動している状態であれば、もう一方のユーザはプロセスを立ち上げてなくても、Catoに繋げてしまったので、”Device Posture”というだけあって、Catoに接続しようとしているユーザのプロセスだけではなく、端末全体のプロセスを見ているっぽいです。 誰かしらプロセスを立ち上げていればすり抜けられちゃうみたいなので、ユーザ単位で起動しているプロセスを条件に指定する場合には、注意が必要そうです。   ユースケースを考えてみた レジストリ/プロセスを指定して制御するユースケースを考えてみたいと思います。   まず、レジストリから。 レジストリは設定できる内容が多いため、できることはたくさんあると思います。 私が知っているレジストリの知識の範囲で例を挙げてみたいと思います。 まずは検証のようにWindows Updateを無効にしている端末の接続を不可にする場合ですかね。 パッチ管理ソフトでの制御をしている場合は不要かと思いますが、パッチ管理ソフトを導入していない場合、ルールは決めていてもなかなか強制はできず、セキュリティ基準を満たしていないPCが接続してしまう可能性があります。このような端末をレジストリで条件指定することによって、社内NWに接続できないようにできるのかなと思います。 パッチ回りだと適用されているセキュリティパッチを指すレジストリキーがありそうなので、そのキーを条件指定することで、セキュリティパッチを適用していないをCatoに接続させないということができそうかなと思ったのですが、毎回KB○○に新規で作成されるみたいで、毎月条件を変更するといった運用が必要そうなので、やろうと思えばできそうですが、運用を踏まえると現実的ではなさそうです。 他だと会社から支給されたPCに何かしらのフラグが設定されていたりしたら、会社PC or 個人PCとで識別できますかね。Cato Clientは正規のユーザであればログインできてしまうので、個人のPCにClientを入れてCatoから社内NWに接続できてしまいます。これに対し、フラグにあたるレジストリキーを条件にすることで、会社PCのみCatoに接続でき、個人PCは接続させないとかができそうです。   次にプロセス。 こちらも検証でやろうとしていた管理系のアプリ/プロセスを条件にして操作ログの取得できない端末は社内NWに接続させないとかは結構有用な気がします。 あとは、アンチウイルスソフトのプロセスを指定するとかもありな気がします。従来の設定でもアンチウイルスソフトを設定する方法がありましたが、あくまでインストールされているか、バージョンはポリシーを満たしているかをチェックしているだけで、実際に起動しているかを条件にしているものではないです。なので、社内ルールに則りインストールはしていても、実際にはアプリを止めているとかもできてしますので、プロセスの方で条件するのも良いかもです。 ただ、プロセス全般に言えることかもですが、バージョンアップ等でプロセス名が変わってしまうと設定変更が必要なので、注意が必要かもです。アップデートごとに検証をするという運用もセットかもですね。   まとめ 今回はアップデートで追加されたDevice Postureのレジストリキー/プロセスの指定での制御を検証してみました。 レジストリキー/プロセスを条件を指定できることになり、設定にあたりOSの知識も必要になってきましたが、今までの条件より比較的柔軟にデバイス制御ができるようになったかと思います。これまでにデバイス制御を断念したことがある方も今回のアップデートを機に再検討してみては如何でしょうか。  
アバター
本記事は 夏休みクラウド自由研究 8/31付の記事です 。 こんにちは、SCSK木澤です。 8/1から始まった夏休みクラウド自由研究も今回で最終回となりました。 今回の企画は幅広いクラウドやソリューションを担当する31名の執筆者にご協力いただき、無事完走することが出来ました。 TechHarmonyは 今春に500記事を超え 、その後も順調に記事数を増やしています。 今後も色々な企画を考えていきたいと思いますので、どうぞ引き続きご愛顧の程よろしくお願いします。 さて今回は自由研究らしく、普段とは違う話題としてAWS Lambdaのファイルシステムについて調査してみました。 きっかけ 私が本件に興味を持ったのは、5年前に携わった案件に遡ります。 管理しているEC2インスタンスに配布する設定ファイル一式についてユーザー毎/インスタンス毎にカスタマイズする必要があり、調査の上、 Lambdaのファイルシステム上で処理してS3に出力することが適切 と判断して実装しました。 S3バケットからzipファイルをダウンロードしてzip解凍 設定ファイルを書き換え 再度zip圧縮して、S3バケットに書き込み サーバレスコンピューティングとはいえ、実態としてはサーバーがあるんだなと興味深く当時は思った次第です。 そのあたりをもう少し詳細にお話していきます。   動作仕様 Lambdaの動作原理 理解を深めるためにも、Lambdaの動作原理についてから触れたいと思います。 とはいえJAWS DAYS 2022でのAWS(当時)の亀田さんの講演がとても解りやすく私の印象に強く残っているので、こちらから紹介します。 AWS Lambdaは2014年のre:Inventで発表されたものとなりますが、当時はユーザー毎に内部にEC2インスタンスを持つ構成でした。 その後Lambdaの実行に特化した構成としてNitroシステムとFirecrackerが導入され、より強固なアイソレーション(環境分離)と高速・多数の起動環境を実現しています。 実は私はAWSを担当する前に自社クラウドに携わっていたため強く思うのですが、AWS Lambdaのリリース当初はEC2ベース+コンテナの技術レベルであったにも関わらず、お客様(ディベロッパー)にとってあるべき姿を定義し、あるべき価格で(赤字でも?)提供する、そしてその後改善・解決していくという姿はThink BigでありCustomer Obesessionでもあるので感銘を受けたのを覚えています。 話が長くなったので戻しますが、現在AWS LambdaはNitroシステム+Firecrackerで提供されています。 つまり Lambdaも小さい仮想サーバー(microVM) という訳です。 よって、当然ながらファイルシステムもあります。 クオータ(制限)についてはこちらをご覧下さい。 Lambda クォータ - AWS Lambda Lambda 関数および API リクエストに関する最大サイズ、制限、およびクォータです。 docs.aws.amazon.com ユーザーがLambdaにアタッチできるローカルファイルシステムは、 /tmp にマウントされ512MB~10240MBの間で設定可能 です。 ウォームスタートとコールドスタート Lambdaのローカルファイルシステムについて触れる際に、この話は避けて通れません。 Lambdaを起動した際にmicroVMを作成される訳ですが、どうしてもこの 初期化作業には一定の時間が掛かります(コールドスタート) 。そのため、 もし再利用できるmicroVMがあれば再利用 してスピードアップするよう動作します (ウォームスタート) 参考:AWS Blackbelt AWS Lambda(p60あたりから) https://pages.awscloud.com/rs/112-TZM-766/images/20190402_AWSBlackbelt_AWSLambda%20Part1&2.pdf この 再利用(ウォームスタート)が発生した際は、前の実行時のファイルがユーザーファイルシステムに残ったまま になっています。 ファイル処理を行った際にファイル重複でエラーになる可能性があるのでご注意ください。 実行開始時に一旦すべて削除するか、例外処理を入れる必要があるでしょう。   調査 さて、ファイルシステムの詳細を調べてみたいと思います。 容量・パーミッションの確認 デフォルトの設定でLambdaを作成し、以下のコードで実行してみます。 PythonのOSライブラリでOSコマンドを実行しています。 import json import os def lambda_handler(event, context): # 実行ユーザーを確認 print("--user") print(os.system("whoami")) # ディスク容量を確認 print("--disk capacity") print(os.system("df -h")) # マウント状態を確認 print("--mount") print(os.system("cat /etc/fstab")) # パーミッションの確認 print("--permisson /") print(os.system("ls -al /")) print("--permisson /tmp") print(os.system("ls -al /tmp")) # 書き込み print("--write /") print(os.system("touch /test1.txt")) print(os.system("ls -al /")) print("--write /tmp") print(os.system("touch /tmp/test2.txt")) print(os.system("ls -al /tmp")) return { 'statusCode': 200, 'body': '' } 実行結果を確認します 実行ユーザー --user sbx_user1051 当然ながら一般ユーザー権限でユーザープロセスは実行されています ディスク容量、マウント状態 --disk capacity Filesystem Size Used Avail Use% Mounted on /dev/vde 144G 143G 0 100% / /dev/vdb 1.5G 18M 1.4G 2% /etc/hosts tmpfs 64M 0 64M 0% /dev /dev/vdd 525M 8.0K 514M 1% /tmp /dev/root 9.7G 386M 9.3G 4% /etc/passwd /dev/vdc 128K 128K 0 100% /var/task --mount # LABEL=/ / auto defaults,noatime 1 1 /tmpはユーザー設定により容量が変わるので、別ディスクとしてマウントされています 。 ルートディスクはリードオンリーではないですが、書き込み不可となっています。 パーミッション --permisson / total 116 drwxr-xr-x 18 root root 4096 Jul 31 08:47 . drwxr-xr-x 18 root root 4096 Jul 31 08:47 .. -rw-r--r-- 1 root root 48222 Jul 31 22:38 THIRD-PARTY-LICENSES.txt lrwxrwxrwx 1 root root 7 Jan 30 2023 bin -> usr/bin dr-xr-xr-x 2 root root 4096 Jan 30 2023 boot drwxr-xr-x 2 root root 200 Aug 30 00:50 dev drwxr-xr-x 34 root root 4096 May 10 11:16 etc drwxr-xr-x 2 root root 4096 Jan 30 2023 home -rwxr-xr-x 1 root root 397 Jul 31 15:59 lambda-entrypoint.sh lrwxrwxrwx 1 root root 7 Jan 30 2023 lib -> usr/lib lrwxrwxrwx 1 root root 9 Jan 30 2023 lib64 -> usr/lib64 drwxr-xr-x 2 root root 4096 Apr 25 19:25 local drwxr-xr-x 2 root root 4096 Jan 30 2023 media drwxr-xr-x 2 root root 4096 Jan 30 2023 mnt drwxr-xr-x 2 root root 4096 Jan 30 2023 opt dr-xr-xr-x 123 root root 0 Aug 30 01:40 proc dr-xr-x--- 2 root root 4096 Jan 30 2023 root drwxr-xr-x 5 root root 4096 Apr 25 19:25 run lrwxrwxrwx 1 root root 8 Jan 30 2023 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Jan 30 2023 srv drwxr-xr-x 2 root root 4096 Apr 25 19:25 sys drwxrwxrwx 2 root root 4096 Aug 5 15:36 tmp drwxr-xr-x 12 root root 4096 Jul 31 08:47 usr drwxr-xr-x 24 root root 4096 May 9 21:46 var /tmpは権限777のため、一般ユーザーでも書き込み可能です。 ファイル書き込みの確認 --write / touch: cannot touch '/test1.txt': Read-only file system 当然ながらルートディスクは書き込み不可です。 --write /tmp total 8 drwxrwxrwx 2 root root 4096 Aug 30 01:40 . drwxr-xr-x 18 root root 4096 Jul 31 08:47 .. -rw-r--r-- 1 sbx_user1051 990 0 Aug 30 01:40 test2.txt /tmpには書き込み可能です。 ファイル入出力速度の調査 さて、ローカルファイルシステム(/tmp)には何も保存されていない訳ですし、データは永続化できません。 よって、 S3バケットなどからダウンロードしてきてから処理を行う必要があります 。 ファイルの入出力時間が気になるので、確認してみます。 S3バケットを作成して、CloudShellから1GBのファイルを作成して保存します。 $ dd if=/dev/zero of=1gb.dat bs=1024k count=1024 $ aws s3 cp 1gb.dat s3://S3バケット名/ 以下のようなコードでLambda関数を作成します。 import json import boto3 import os bucketname = "S3バケット名" def lambda_handler(event, context): s3r = boto3.resource('s3') # /tmp削除 print("--delete") print(os.system("rm -rf /tmp/*")) # コピー data_bucket = s3r.Bucket(bucketname) print("--copy from S3 Bucket Start") data_bucket.download_file('1gb.dat','/tmp/1gb.dat') print("--copy from S3 Bucket End") return { 'statusCode': 200, 'body': '' } S3にアクセスできるLambda用IAMロールを作成し、本関数に適用します。 ディスク容量は増やしておきます。 EC2インスタンスと同様、Lambdaにおいてもメモリ容量とCPUスペックは比例するように設計されています。 そこで、メモリ容量≒CPU割り当てとS3からの読み取り速度を調べたところ、以下の通りになりました。(3回平均、CloudWatch Logsに出力されたログのタイムスタンプから算定) Lambdaメモリ割当量 ダウンロード時間 速度 128MB 74.2秒 110Mbps 256MB 40.4秒 203Mbps 512MB 19.4秒 422Mbps 1024MB 10.7秒 768Mbps 2048MB 10.4秒 785Mbps メモリ割り当てに比例してネットワークI/O帯域も拡張されること、但し(S3バケットからのダウンロードにおいては)800Mbps弱で頭打ちになる ことを確認しました。 つまり、/tmpの最大容量10GBのダウンロードもしくはアップロードを行うには、最低100秒程度の時間が掛かることになります。 この辺りがローカルディスクを用いた処理の限界であるであろうことが解りました。 要件満たさない場合はEFS利用 10GBを超える 大容量ファイルを扱いたい場合、あるいは永続ファイルをマウントしたい場合はAmazon EFSの利用が可能 です。 なお、Amazon EFSはVPC上のサービスですので、LambdaもVPCアタッチが必要となります。   まとめ 実に地味な内容でしたが、Lambdaのファイルシステムについて解説・確認しました。 ネットワーク帯域にも変動があることなど、新たな発見があり楽しかったですね。 Lambdaのローカルファイルシステム(/tmp)は非永続ということもあり、ディスク容量は課金には影響しません。 色々使いこなすと楽しいので、皆様もご活用下さい!
アバター
本記事は 夏休みクラウド自由研究 8/30付の記事です 。 こんにちは、SCSKの松岡です。 今回は、Snowflakeをこれから利用する方向けに、環境構築で最低限抑えておきたいポイントをぎゅっと絞ってご紹介します。Snowflakeのアカウントは作ったけど何から始めよう…とお悩みの方はぜひご参考ください! Snowflakeとは Snowflake (Snowflake Cloud Data Platform)は、Snowflake社が提供するSaaS型のクラウドデータプラットフォームです。 データ管理、セキュリティ、ガバナンス、可用性、データレジリエンスをサポートしたフルマネージド型のサービスであり、ウェアハウスのスケーリング/ポリシー制御/データ共有の柔軟性などから、デジタルデータの一元管理に優れたプラットフォームとして注目を集めています。 プラットフォームの概要 Snowflakeのクラウドデータプラットフォームが世界的に、あらゆる規模、あらゆる業界において、をほぼ無制限の同時実行ワークロードで強化した方法をご紹介します。 www.snowflake.com   利用する前に…… エディション Snowflakeでは、4つのエディションが用意されており、利用するアカウントがどのエディションかによって、一部できることが異なります。 (例)Time Travelによるデータの保管期間の90日延長はEnterprise以上のエディションのみ (例)PrivateLinkを使用したプライベート接続のサポートはBusiness Critical以上のエディションのみ Snowflakeは従量課金制ですが、上位のエディションほど利用あたりの単価が高い点にも注意が必要です。 Snowflake Edition | Snowflake Documentation docs.snowflake.com 言語設定 Snowsight(Snowflakeを操作するウェブ画面)のデフォルト表示は英語ですが、アイコンから「My profile」を選択し、Languageで「日本語」を選択することで日本語表示に切り替わります。 システムロール Snowflakeでは、「ロール」と呼ばれる単位でアクセス制御や権限管理を行います。 ユーザーには複数のロールを割り当てることができ、操作を行う際は、その操作ごとにロールを切り替えて(適切なアクティブロールを選択して)から実行を行います。 あらかじめ定義されたロールとして、以下のようなシステムロールが存在しています。 ACCOUNTADMIN アカウント内で最上位のロール。 アカウント管理者に限定して付与し、アカウント全体に関わる設定等をする際に使用します。 SECURITYADMIN セキュリティ管理用のロール。 ユーザーとロールの作成や、ロールの割り当て等が可能です。 USERADMIN ユーザーとロールの管理専用のロール。 SECURITYADMINと同じくユーザーとロールの作成が可能ですが、限定的です。 SYSADMIN ウェアハウスやデータベース、スキーマのようなオブジェクトを作成する権限を持つロール。 PUBLIC アカウント内のすべてのユーザー、ロールにデフォルトで付与されるロール セキュリティや誤操作防止の観点から、付与するロール、指定するロールはなるべく最小権限のものが望ましいです。 最初の時点では、アカウント全体の設定はACCOUNTADMIN、ユーザーの作成はUSERADMIN、ロールの作成・割り当てはUSERADMINかSECURITYADMIN、オブジェクト(データベース・スキーマ・ウェアハウス)の作成はSYSADMINと覚えておくと良いでしょう。 アクセス制御の概要 | Snowflake Documentation docs.snowflake.com Snowsightでは、以下の箇所でロールの切替を行えます。 (GUIで操作する場合) アイコンから「ロールを切り替え」を選択 (クエリを実行する場合) ワークシートの画面右上からロールを選択 Snowsightでは[プロジェクト]>[ワークシート]からワークシートを開くことで、ブラウザ上でSQLクエリの実行が可能です。   環境構築最初にやること集 最低限のパラメータ設定で作成する手順を紹介します。 ユーザー作成 利用者ごとにユーザーを作成しましょう。 GUIで作成 [管理者]>[ユーザーとロール]>[ユーザー]画面から、[+ ユーザー]を選択し、必要情報を入力して作成します。 クエリで作成 (サンプル) --user_001という名前でユーザー作成 CREATE USER user_001   PASSWORD = '[パスワード]'    EMAIL = "[メールアドレス]"    MUST_CHANGE_PASSWORD = TRUE    DISPLAY_NAME = "[表示名]" ; [MUST_CHANGE_PASSWORD]をTRUEにすることで、初回ログイン時にパスワード変更を強制させることができます。 CREATE USER | Snowflake Documentation docs.snowflake.com ユーザーを作成したら、アイコンの[自分のプロファイル]から多要素認証(MFA)を登録してもらいましょう。 特に管理者(ACCOUNTADMIN)ロールを持つユーザーについては設定が強く推奨されています。 多要素認証(MFA) | Snowflake Documentation docs.snowflake.com ウェアハウス作成 ウェアハウスは、クエリの処理時に使用されるコンピューティングリソースです。 データベース・スキーマのようなストレージ領域がコンピューティングリソースと分離しているのがSnowflakeの大きな特徴の一つです。 仮想ウェアハウス | Snowflake Documentation docs.snowflake.com GUIで作成 [管理者]>[ウェアハウス] 画面から、[+ ウェアハウス]を選択し、ウェアハウス名を入力して作成します。 Snowflakeではウェアハウスの稼働時間が長いほど多くの費用が発生するので、ウェアハウスの自動一時停止を有効にしておくことでコスト削減につながります。 クエリで作成 (サンプル) --wh_001という名前でウェアハウス作成 CREATE WAREHOUSE wh_001 WAREHOUSE_SIZE = XSMALL AUTO_SUSPEND = 60 ; 作成時に[WAREHOUSE_SIZE]でウェアハウスのサイズを指定します。お試し用途であれば、一番小さいXSMALLサイズで問題ないでしょう。 [AUTO_SUSPEND]の値が自動一時停止されるまでの秒数を表しますが、デフォルトの600より短い60に変更することで、利用していない場合はより素早く一時停止されます。(※60未満の値は非推奨) CREATE WAREHOUSE | Snowflake Documentation docs.snowflake.com   データベース・スキーマ作成 Snowflakeでは、データを格納するためにテーブルが必要ですが、そのテーブルの格納先としてデータベース、スキーマが必要です。 GUIで作成 [データ]>[データベース] 画面から、[+ データベース]を選択し、データベース名を入力して作成します。 スキーマは作成したデータベースの画面から、[+ スキーマ]を選択して作成します。 クエリで作成 (サンプル) --db_001という名前でデータベース作成 CREATE DATABASE db_001; --schema_001という名前で、db_001にスキーマ作成 CREATE SCHEMA db_001.schema_001; データベース、スキーマともに、通常利用であれば特別なパラメータの指定は必要なく簡単に作成ができます。 CREATE DATABASE | Snowflake Documentation docs.snowflake.com CREATE SCHEMA | Snowflake Documentation docs.snowflake.com   ロール作成・付与 序盤にシステムロールを紹介しましたが、独自のロールを作成してユーザーに権限付与することも可能です。 例として、特定のDB、特定のウェアハウスのみに対して一般的な操作限定で行えるロールを作成してみます。 クエリで作成 (サンプル) --sample_role_001という名前でロールの作成 CREATE ROLE sample_role_001; --sample_role_001ロールにUSAGE権限付与 GRANT USAGE ON DATABASE db_001 TO ROLE sample_role_001; GRANT USAGE ON SCHEMA db_001.schema_001 TO ROLE sample_role_001; GRANT USAGE ON WAREHOUSE wh_001 TO ROLE sample_role_001; --sample_role_001ロールにテーブル、ビューのCREATE権限付与 GRANT CREATE TABLE, CREATE VIEW ON SCHEMA db_001.schema_001 TO ROLE sample_role_001; --sample_role_001ロールにテーブル、ビューの操作権限付与 GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA db_001.schema_001 TO ROLE sample_role_001; GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON FUTURE TABLES IN SCHEMA db_001.schema_001 TO ROLE sample_role_001; GRANT SELECT ON ALL VIEWS IN SCHEMA db_001.schema_001 TO ROLE sample_role_001; GRANT SELECT ON FUTURE VIEWS IN SCHEMA db_001.schema_001 TO ROLE sample_role_001; --user_001ユーザーにample_role_001ロールを付与 GRANT ROLE sample_role_001 TO USER user_001; sample_role_001という名前のロールを作成し、ロールに対して権限を付与し、そのロールを特定のユーザーuser_001に付与してみました。 ロールに付与している権限の中で、「USAGE」は使用権になります。使用できるようにしたいデータベース、スキーマ、ウェアハウスに対して、このUSAGE権限をそれぞれ付与する必要があります。 続けて、ロールに対し、スキーマschema_001に限定してテーブル・ビューのcreate権限や操作権限を付与しています。 テーブルやビューを指定する際に、「ALL TABLES」や「ALL VIEWS」のような指定は、既存のテーブルやビューすべてを対象に権限を付与することを意味します。一方で「FUTURE TABLES」や「FUTURE VIEWS」のような指定は、これから作成されるテーブルやビューに対して権限を付与することを意味します。 「ALL TABLES」で指定しただけでは、新規で作成したテーブルに対して権限が付与されないことに注意が必要です。 最後に、GRANT ROLE でユーザーに対して作成したロールを付与することで、付与した特定のユーザーに対してカスタマイズした権限のみを付与することが可能です。 GRANT <権限> | Snowflake Documentation docs.snowflake.com   ネットワークポリシー設定 Snowflakeでは、ネットワークポリシーを設定し、Snowflakeに接続できるIPアドレスを制限することが推奨されています。例として、IPアドレス範囲を指定して、許可したIPアドレスのみ接続できるようにする設定を示します。 クエリで設定 (サンプル) USE ROLE SYSADMIN; --Network Rules設定用のデータベース・スキーマを作成 CREATE DATABASE securitydb; CREATE SCHEMA securitydb.networkrules; USE ROLE ACCOUNTADMIN; --network_rule_sampleという名前でネットワークルールを作成 CREATE NETWORK RULE network_rule_sample MODE = INGRESS TYPE = IPV4 VALUE_LIST = ('47.88.25.32/27') ; --network_policy_sampleという名前でネットワークポリシーを作成し、network_rule_sampleを許可 CREATE NETWORK POLICY network_policy_sample ALLOWED_NETWORK_RULE_LIST = ('network_rule_sample') ; --作成したネットワークポリシーをアカウント全体に適用 ALTER ACCOUNT SET NETWORK_POLICY = network_policy_sample; ネットワークルールはスキーマオブジェクトなので、作成時にデータベース、スキーマを指定する必要があります。 上記を実行することにより、Snowflakeアカウント全体が、 47.88.25.32/27 のIPアドレス範囲からの接続しか許可されなくなります。 ネットワークルールを複数作成することで、許可する条件をOR条件で複数設定することや、ネットワークポリシーをアカウント全体でなくユーザーごとに別々に適用することも可能です。 アカウント全体に適用する際は、設定誤りに注意しましょう。 適用後、サインアウトする前に別ブラウザを立ち上げる等して接続できるかどうかの動作を確認しておくと安心です。設定誤りがある場合は、  ALTER ACCOUNT UNSET NETWORK_POLICY; を実行することでネットワークポリシーを無効化できます。   ネットワークポリシーを使用したネットワークトラフィックの制御 | Snowflake Documentation docs.snowflake.com   タイムゾーンの変更 Snowflakeでは、デフォルトのタイムゾーンがAmerica/Los_Angelesに設定されています。 アカウント全体でデフォルトのタイムゾーンを日本標準時に変更する場合は、以下のようにアカウントパラメータの値を変更します。 --タイムゾーンを日本標準時に変更 ALTER ACCOUNT SET TIMEZONE = 'Asia/Tokyo';   パラメーター管理 | Snowflake Documentation docs.snowflake.com   リソースモニター リソースモニターを利用することで、Snowflakeアカウント内でのクレジット(リソース使用量)の状況を監視することができます。 リソースモニターによる設定は、新規の場合は[管理者]>[コスト管理]>リソースモニター 画面から、[+ リソースモニター]を選択します。 リソースモニターによる監視は、[モニタータイプ]から、アカウント全体の監視か、ウェアハウス個別の監視かを指定できます。 [クレジットクォータ]で、指定した期間で許可するクレジットの上限を設定します。そして、指定したクレジットクォータに対して実際の使用が何%に達したかに応じて、[アクション]で、通知や即時一時停止といった内容を設定することが可能です。 作成したリソースモニターの通知を受け取りたい場合は、ACCOUNTADMIN権限を持つユーザーのアイコンの[自分のプロファイル]を選択し、「リソースモニターからのメール通知」にチェックが入っていることを確認しましょう。 リソースモニターの操作 | Snowflake Documentation docs.snowflake.com   最後に Snowflakeでは公式のガイドやブログ記事が充実しており、構築に関するヒントやベストプラクティスの記載をたくさん見つけられるので要チェックです。 環境が用意できたら、どんどんデータを投入して活用してみましょう! ガイド - Snowflakeドキュメント docs.snowflake.com Inside the AI Data Cloud From technical articles about AI and application strategies to real-world success stories, the Snowflake Blog explores w... www.snowflake.com
アバター
Prisma Cloudにおけるアラートとは、Prisma Cloudがクラウド環境内で検知したセキュリティリスクや脆弱性等を通知するための機能です。アラートが発生した後、適切な対応を取りシステムのセキュリティを維持することが重要です。 Prisma Cloudで検知されたアラートに対して取ることができるアクションにはアラートの解除や一時停止等があります。アラートに対して取ることができる主なアクションについて解説していきたいと思います。 アラートの解決 クラウド側で設定を修正した場合やアラートが発生した対象のリソースが削除された場合等、これらの変更がなされると該当のアラートは自動的に「resolved」(解決済)というステータスに更新されます。   アラートの一時停止 アラートの一時停止は、アラート対応を一時的に保留したい場合や特定の期間中にアラートを無視したい場合等に使用します。この機能により、特定の時間枠内でのアラート通知を抑制することが可能です。 ユースケース メンテナンス期間中: メンテナンス作業中に一時的に発生するアラートを抑制したい場合 テスト中: テスト中に特定のアラートを抑制したい場合 等 設定方法 1.PrismaCloudコンソールにログインします。 2.「アラート」セクションに移動し、対象のアラートを選択します。   3.「一時停止」をクリック → 一時停止の期間や理由を入力し、「Snooze」をクリックします。今回は「まで」を選択し「2024年7月25日木曜日 18:10」までアラートを一時停止することにします。 アラートの最低一時停止時間は1時間です。1時間より短い時間を指定することはできません。 ↓   4.画面右上に「アラートは正常にスヌーズされました。」ポップアップが表示され、対象のアラートは表示されなくなりました。   5.フィルタの「アラートステータス」で「スヌーズ中」を選択してみると対象アラートの「アラートステータス」がsnoozedになっていることが確認できました。   6.「2024年7月25日木曜日 18:10」以降に確認すると、対象アラートの「アラートステータス」がopenに戻っていることを確認できました。(ちなみに、同日18:12時点ではまだ「アラートステータス」がsnoozedでしたが、18:30頃には「アラートステータス」がopenに戻っていました。)   アラートの解除 アラートの解除は、アラートの原因となった設定は意図した設定であり問題なしと判断した場合等に行います。この操作によりアラートは消え、再び同じインシデントが発生しない限り表示されなくなります。 ユースケース テスト環境のアラート解除: テスト環境で発生したアラートであるため解除したい場合 等 設定方法 1.Prisma Cloud コンソールにログインします。 2.「アラート」セクションに移動し、対象のアラートを選択します。   3.「解除」をクリック → 理由を記載して「Dismiss」をクリックします。 ↓     4.画面右上に「アラートは正常に解除されました。」ポップアップが表示され、対象のアラートは表示されなくなりました。   5.フィルタの「アラートステータス」で「解除済」を選択してみると対象アラートの「アラートステータス」がdismissedになっていることが確認できました。   アラートの再オープン アラートの再オープンは、一度解決されたアラートが再び問題となる場合や新たな関連リスクが確認された場合等に使用します。この機能は、アラートのライフサイクルを追跡しやすくし、継続的なセキュリティ監視を可能にします。 ユースケース 問題が再発した場合: 過去に解決したセキュリティ問題が再び発生した場合 等 設定方法 1.Prisma Cloud コンソールにログインします。 2.「アラート」セクションに移動し、再オープンしたいアラートを選択します。   3.「再オープン」をクリックし、「確認する」をクリックします。 ↓   4.画面右上に「アラートは正常に再オープンされました。」ポップアップが表示され、対象のアラートは表示されなくなりました。   5.フィルタの「アラートステータス」で「未解決」を選択してみると対象アラートの「アラートステータス」がopenになっていることが確認できました。   まとめ Prisma Cloudで検知されたアラートに対する対応には、アラートの解除、一時停止等多くの選択肢があります。ユースケースに合わせて活用することで、安全で効率的なクラウド環境を維持することができます。クラウドのセキュリティ管理には迅速かつ正確な対応が求められるため、Prisma Cloudのアラート機能をしっかりと活用することが重要です。このブログが、Prisma Cloudのアラート管理についての理解を深める一助となれば幸いです。 また、当社では、複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。   ■マルチクラウド設定診断サービス with CSPM マルチクラウド設定診断サービス with CSPM| SCSK株式会社 ■Smart One Cloud Security CSPM | Smart One Cloud Security® Powered by Prisma Cloud from Palo Alto Networks | SCSK株式会社 ご興味のある方はお気軽にお問い合わせください。
アバター
本記事は 夏休みクラウド自由研究 8/29付の記事です 。 こんにちは あるいは こんばんは SCSKの猿橋です。 パリオリンピックの興奮冷めやらぬ2024年現在、AIといえば生成AIが全盛ですが、特定のユースケースではMLのカスタムモデルを活用するケースもあるかと思います。 カスタムモデルを構築するには機械学習の知識やノウハウ、実装スキルが必要になりますが、Amazon SageMaker Canvasを活用すれば、ノーコードでモデル構築が可能となります。 今回はAWSのハンズオンを通じてAmazon SageMaker Canvasを試してみました。 ノーコード機械学習 — Amazon SageMaker Canvas — AWS Amazon SageMaker Canvas は、ビジネスアナリストが ML の経験がなくても、非常に正確な機械学習モデルを作成できるように、コーディング不要の ML インターフェイスを提供しています。 aws.amazon.com AWS Hands-on for Beginners Amazon SageMaker Canvas 〜 ノーコードで機械学習を始めよう 〜 | AWS Webinar AWS Hands-on for Beginners Amazon SageMaker Canvas 〜 ノーコードで機械学習を始めよう 〜 | AWS Webinar pages.awscloud.com はじめる前に Amazon SageMaker Canvasは使用時間課金になります。 左下にLogoutボタンがあり、使用しないときはLogoutをすることで課金を止めることができるようですので、 忘れずLogout しておきましょう。 ワークスペースインスタンス (セッション-時間) の料金 1.9 USD/時間 ノーコード機械学習 - Amazon SageMaker Canvas の料金 - AWS ビジネスアナリストが機械学習 (ML) モデルを構築し、予測を生成するためのノーコードサービス、Amazon SageMaker Canvas の料金をご覧ください。 aws.amazon.com Amazon SageMaker Canvasのセッションはブラウザを閉じたりAWSコンソールからログアウトするセッションとは独立しているようで、それでは課金が止まらないようです。ブラウザを閉じる前に確実にLogoutしましょう。 定期的に意図しない課金が発生していないか、コンソールのホームに表示される「コストと使用状況」でチェックしておくのもよいでしょう。   機械学習におけるAmazon SageMaker Canvasの活用シーン 機械学習を活用するにあたり、以下の課題があるとハンズオンの中で挙げられています。 機械学習の実用化には時間がかかり、コーディングと知識が必要 機械学習のニーズは増える一方で、データサイエンスチームはフル稼働 ビジネスアナリストは、機械学習の知識不足で短時間での習得は困難 ステークホルダー間でのコラボレーションは機械学習モデルの信頼性を高めるが、一般的なツールは単一ワークスペースで、機械学習テクニカル知識を求める単一ワークスペース環境 機械学習を活用するには専門的な知識が求められますが、そういった人材を育てたり確保したりすることが簡単ではない、ということも背景にありそうです。 そのような状況の中でも、ビジネス課題に対して機械学習でのソリューションを試してみたい、という場合に、ノーコードで機械学習を活用できるAmazon SageMaker Canvasがビジネスの現場で活用シーンがでてくるわけですね。   Amazon SageMaker Canvas環境作成 それではハンズオンを始めてみます。 まずは「SageMakerドメインを作成」ボタンでドメイン作成を開始します。 今回はクイックセットアップを活用することで、ドメインとユーザープロファイルの作成ができました。 作成されたプロファイルの横にある起動ボタンでCanvasを起動します。 Canvasが起動できました ハンズオン動画ではドメイン作成時にドメインとユーザープロファイルの入力ができますが、2024/6現在のクイックセットアップではそれぞれ自動設定されるようです 後続のデータセットインポートでトラブルになるのですが、ハンズオンではドメイン作成時にIAMロールにAmazon S3へのアップロード権限を付与していました。現在クイックセットアップを選んでしまうとその手順ができなさそうなので、後で権限を付与するか、その他の方法でデータセットをアップロードする必要がありそうです(手順は後述)   データの投入 環境構築が完了してCanvasが起動できたら、次はデータの投入です。 今回のハンズオンのユースケースとしては、以下のようなテーマ設定になっていました。 ■ユースケース 私たちは、携帯電話通信事業者のマーケティングアナリストです。 データを活用して、顧客離反の要素を判明し、お客さんの解約傾向を予測したいです。 ハンズオンのWebページに今回のユースケース用のデータダウンロードリンクがついているので、そこからデータをダウンロードしました。 このデータをCanvasに投入してみます。 左のメニューからDatasetsを選びます。 DLしたデータセットをインポートする為、右上のImport Data>Tabularを押下 表示されたダイアログにデータセット名を入力 データセットをドラッグ&ドロップでインポート、、、 と、拡張子がtxtのままだとエラーになってしまいました。 気を取り直してcsvに拡張子を変更し、アップロードしたところS3へのアップロードエラー 振り返ると、最初のドメイン作成時に自動で生成してくれたのは便利だったのですが、ハンズオン動画を見直すとドメイン作成時にIAMロールでAmazon S3への権限設定をしていました。 アップロードのエラー対策として、IAMロールにAmazon S3権限を追加することも考えられますが、今回はデータソースがAmazon S3を選べるので、手動でAmazon S3にアップロードし、Amazon S3からインポートすることとしました。 S3へのアップロードが完了したら、Data SourceでAmazon S3を選択し、データセットのインポートを実行 データセットを指定すると、プレビューができました 右上のCreate datasetボタンでデータセットの登録を実行 これで無事データセットのインポートが完了しました。   モデルの構築:データの探索 データセットのインポートが完了したら、次はデータの探索です。 機械学習で予測精度を上げるにはデータセットへの理解が欠かせません。 データセット内のパターンや特徴を把握し、クレンジングが必要な箇所を特定し、仮説を立ててデータ項目の相関性を分析します。 まずは左メニューのMy Modelsを選択し、モデル画面を表示します。 New modelボタンよりモデルの構築を開始します。 モデル名にハンズオンに倣って「CustomerChurn」と付けました。 「Churn」は解約を表す言葉でサブスクリプション型ビジネスモデルではチャーン率が重要な指標となります。 使用するデータセットを選択して「Select dataset」ボタン押下 Buildタブに移動し、選択したデータセットのカラム情報が表示されています。 データセットに対し予測対象のカラムを指定します。 今回は「Churn」を選択します。 予測カラムを選択すると、お勧めのモデルがModel type欄に表示されます。 「2 category prediction」がお勧めされました。 予測列を選択したプルダウンの下にValue distributionとして予測対象カラムの値分布が表示されていますが、False/True半々のようです。 ということで、「2 category prediction」でよさそうです。 モデルを変更したい場合は以下のようにConfigure modelで変更ができます。 Grid viewを選択すると、各カラムの分布図がワンクリックで表示されます。 最初のカラム毎の情報を掴むのに便利な機能ですね! さらに高度な探索をするために、「Data visualizer」を使ってみます。 「Day_Mins」(日中の通話時間)を横軸に、「Day_Charge」(日中の課金額)を縦軸に散布図を作成してみます。 各点の色にChurnを割り当てていて、赤色が解約したユーザーになります。 傾向として、長時間電話して課金額が高いユーザーであるほど解約傾向が高そうなことが分かりました。 次は「State」(州)を横軸に、「CustServ_Call」(カスタマーサービスへのCall数)を縦軸に積み上げ棒グラフを作成してみます。 ChurnのTrue/Falseの割合が州毎に可視化できました。 もしかしたらChurn率が高い州はカスタマーサービスの改善の余地があるかもしれませんね。   モデルの構築:モデルのプレビューと特徴量エンジニアリング カラムの相関関係や特徴などが掴めてきたら、特徴量エンジニアリングとモデルのプレビューに進みます。 特徴量エンジニアリングとは簡単にいうと予測に有用な説明変数を作り上げることですが、単純に1カラム、2カラムのデータを取り上げて予測を説明する変数だ、と言えるほど単純なものではありません。予測精度を上げるために複数のカラムの情報を組み合わせることになり、ドメイン知識なども活用して算出式を作ってみて、Try&Errorで精度を上げていく作業になります。実際には簡単に精度が上げられるわけではなく、多くの作業時間を費やしても思ったような結果がでにくい難易度が高い作業になりがちです。(PoC死が発生するわけですね それでは「Preview model」をクリックし、モデルのプレビューを開始してみます。 ベースライン精度が95.6%と分かります。(95.6%の確率で正しく予測できる、という指標 ハンズオンでは最初にデータセットに問題ないかを確認する「Validation」という機能を実施していますが、2024/08現在そのようなメニューが見当たりません。 現在ではPreview modelなど、モデル構築時に同時にValidation処理が実行されているようです。(Preview modelの上部にValidation結果の「No issues have been found in your datase」が表示されているのが確認できます。 Previewが完了しました。 Column impactとして特徴量の重要度が一覧表示されるのが便利ですね。 ※もし、重要度があまりにも高すぎる、予測ターゲットと同意のカラムがある場合は除去するなどの注意が必要になるようです。 続いてデータセットのクリーニングを実施します。 今回のユースケースを考慮し、例えば「Phone」は電話番号を表すカラムですが、解約には無関係と思われるので、ノイズとなりうるカラムは除去しておきます。カラムのチェックボックスを外すことで簡単に除去できます。 データ探索でお客様への請求額が高いほど解約傾向が高そうだという気づきがありましたので、合計の請求額を表す算出カラムを追加してみます。 Manage columns>Custom fomula で計算式とカラム名を設定し、Addボタンで追加します。 操作履歴は「Model recipe」に記録されるようです。 ハンズオンでは「Functions」メニューでカラムを追加していますが、2024/06現在、「Manage columns」メニューとして整理されたようです。 カラムを追加したら再度Preview modelを実行してみます。 Updateするかを聞いてくるんのでUpdateをクリックして更新処理を進めます。 結果、ベースライン精度が96.3%(+0.7%)に上がりました。カラムの編集が効果があったようです。     モデルの学習と評価 データの探索を終えたらモデルの学習と評価の進みます。 モデルのビルド方法として2種類用意されています。 QuickBuild 構築時間2~20分程度 精度より速度重視 最大5万行まで Standard Build 構築時間2~4時間程度 速度より精度重視 今回のようなPoCレベルであれば、まずはQuickBuildがお勧めのようですので、QuickBuildを進めてみます。 StandardBuildのような数時間レベルの作業の場合は、忘れずLogoutをしてセッション課金を止めておきましょう。 QuickBuildを開始すると最初にDataValidation処理が実行されています。 今回は数分でモデルが出来上がりました。 予測精度は約94.3%でPreview時より予測精度が下がってしまったようです。 今回のモデルでは「Eve_Mins」のImpcatが高いようです。     ハンズオン動画ではQuickBuild後に予測精度が上がっていたので、Case by caseのようです Scoringタブを確認してみます。 このViewに視覚的に予測がどれだけ正しかったかクロス集計として確認することができます。 Advanced Metricsタブでは3種類のメトリクスが確認できます メトリクステーブル 混合行列 Precision recall curve(PR曲線) これらのメトリクスやグラフをみながらパラメータチューニングを実施していくことになります。   生成したモデルでの予測 それでは生成したカスタムモデルで予測を実施してみます。 予測には2種類用意されています。 バッチ予測 データセット全体を予測する場合に使用 シングル予測 一つのデータに対して予測する。各パラメータを変更可能なので、仮説を立ててパラメータを変更しながら予測の変化を確認できる まずはバッチ予測を選択して進めてみます。 Manualボタンを押下すると予測したいデータセットを選択できます。 データセットを選択し、Generate predictionsボタンでバッチ予測を進めます。 ハンズオンではSelect datasetボタンでデータセットを選択していましたが、2024/08現在、Manual/Automaticボタンに整理されたようです 予測処理が終わるとStatusがReadyになります。 Status列の3点メニューにより予測結果をPreviewできるので確認してみます。 予測結果と予測確率が確認できます。 結果はDownloadボタンでcsvダウンロード可能。 次にシングル予測を実施してみます。 各特徴量を変更したら予測がどう変わるかをリアルタイムに確認できます。 仮説:夕方の通話時間が増えたら解約予測はどう変化するか? Eve_Minsの値を増やしてみます。 予測を更新するにはUpdate predictionsボタンを押下します。 更新前の解約予測は0.154% 予測更新の結果、解約予測は3.127%にわずかに上がりました。 このような形でWaht-If分析を進めることができます。     おわりに 作業が終わったら忘れずにLogoutしておきましょう。 今回ノーコードで機械学習カスタムモデルを構築することができました。 また、データ探索がGUIで進められたり特徴量の重要度の一覧が自動で表示されるなど、コーディングをしなくともモデル構築を進められることを実感できました。今後、ML活用のPoCがより手軽に精度高く(PoC死しないように)進むように願っています。   あとがき:やってしまいました 冒頭に課金について記載しましたが、このハンズオンを実施する中でやらかしてしまったようで、気づいたらSageMakerの課金が続いてしまっていました。。。 ※関係者の方々申し訳ありませんでしたm(_ _)m Logoutを忘れないように気を付けていたつもりですが、他の調べものなどをしている間にブラウザに埋もれてLogoutを忘れてしまったままブラウザを閉じてしまった日があったようです。 タイミング悪く、ハンズオンを中断してしばらく作業をしていなかったうちに課金が膨らんでしまいました。 Logoutは確実に忘れないこと、また、ハンズオンも集中して1~2日で終わらせられれば無用な課金も抑えられたかと思います。 ※Cloud9のように未使用30分でセッション終了する仕組みがあると助かりますね。 同じようなご経験の方のブログを参考として置いておきます。 SageMakerを触っていたらいつの間にか10万円請求された話 - Qiita 類似のやらかし記事が見当たらなかったので書いてみました。ちなみに執筆時点でまだ請求額が確定してないので円安に震えてます。。本記事は経緯や調査の流れを細かく書いているので「止め方が知りたいんだ!」… qiita.com
アバター
こんにちは。SCSKの山口です。 今回はBigQuery利用の料金を抑える一つの方法として、 「オンデマンドクエリの上限値設定」 をやってみます。 プロジェクト/クエリごとの上限値を設定し利用料金の増加を抑えるほか、意図しない大規模クエリによる利用料金の急増を抑える効果もあります。ぜひご覧ください。 BigQueryの料金体系 ここについては詳細に説明されている 公式ドキュメント 等があるため、要点を抑えて簡単に説明します。 BigQueryの料金は下記二つの要素で構成されています。 コンピューティング料金 :クエリを実行するためのコンピューティング料金 ストレージ料金 :BigQueryに読み込むデータを保存する料金 今回紹介する方法は「コンピューティング料金」を抑える方法です。 コンピューティング料金は、下記二つの課金体系から選択することができます。 オンデマンド料金 (TiB 単位):クエリごとに処理されるバイト数に応じて課金 容量料金 (スロット時間単位): BigQueryエディション から料金モデルを選択 今回アプローチするのは 「オンデマンド料金」 です。 BigQueryエディションに関しての詳細はリンクの公式ドキュメントをご覧ください。   割り当てを設定する 割り当て値とシステムの上限について  |  Cloud Quotas  |  Google Cloud 既存の割り当て使用量のモニタリングや、特定のプロジェクト内での API 割り当ての更新に役立つ Google Cloud の割り当てシステムについて紹介します。 cloud.google.com 割り当てとは、 「使用できるカウント可能な共有リソースの量」 を指します。いわゆる 「上限値」 です。 割り当てが不足すると、実行しようとしているタスクが 割り当てエラー によって失敗します。 ユーザ・プロジェクト・組織単位での設定が可能です。 設定方法 下記のどちらかで「割り当てとシステム上限」のページへアクセスします。 IAMと管理 – 割り当てシステムと上限 – フィルタで「BigQuery API」で検索 APIとサービス – 有効なAPIとサービス – フィルタで「BigQuery API」で検索   以下、IAM画面からアクセスする方法で説明します。 「BigQuery API」の 「Query usage per day」 を選択した状態で右端の点三つ「その他の操作」をクリック 「割り当てを編集」をクリック 「新しい値」に設定したい上限値(単位はTiBのみ)を入力しリクエストを送信 ここまでで設定は完了です。 一日のクエリ量上限を超える見積のクエリを実行しようとすると、下記エラーが出ます。 Custom quota exceeded: Your usage exceeded the custom quota for QueryUsagePerDay, which is set by your administrator. For more information, see   今回は「Query usage per day」を選択し、プロジェクト全体で使用できる一日の上限値を設定しましたが、似た名称の 「Query usage per day per user」 を使用すると 各ユーザが使用できる一日の上限値 を設定することができます。   課金されるバイト数を制限する 費用の見積もりと管理  |  BigQuery  |  Google Cloud cloud.google.com 今度は クエリ単位 で 課金される最大バイト数 の上限値を設定する方法です。 クエリ費用の抑制方法として、 BigQueryのドライラン機能 を活用してクエリ量を見積もる方法も有効な手段です。詳細はリンク先のブログをご覧ください。 課金される最大バイト数を設定したことによってクエリが失敗した場合は、下記エラーが返されます。 Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.   設定方法 BigQueryで「展開」タブから「クエリ設定」をクリック 「詳細オプション」を展開し、「課金される最大バイト数」に上限として設定したいバイト数を入力   上限を超えるクエリ(401 B)を実行すると、エラーが返されました。   まとめ 今回はBigQueryで各種上限値を設定してみました。 割り当ての設定では、 管理者目線で 一日あたりのクエリバイト数を制限することができます。 それに対して、クエリ単位でのバイト数制限では、 利用者それぞれが 意図しない利用量増加を防ぐために設定をすることができます。 私自身、BigQueryを触り始めて2年ほどになりますが、クエリを実行する前にどのくらいの処理バイトが発生するかを必ず確認するようにしています。 今回紹介した割り当ての設定で組織・プロジェクト単位での上限値設定は可能ですが、 だれか一人が容量を食いつぶしてしまってやむを得ず上限解放する 。といった事態になりかねないです。このような事態が多発すると上限値設定の意味も薄れてしまいます。 様々な上限値設定は用意されていますが、ひとり一人が意識する・対応策を打つことが重要ですね。 そのうえで、組織・プロジェクト単位での上限値を敷いておくのもかなり有効な手だと思います。 みなさんも今回紹介した内容をぜひご活用ください。
アバター
本記事は 夏休みクラウド自由研究 8/28付の記事です 。 こんにちは、SCSK株式会社の小寺崇仁です。 以前投稿した ZabbixとChatGPTを連携してみた(メディアタイプ編) をカスタマイズしてAmazon Bedrockと連携したいと思います。 事前準備 Zabbix 6.x 6系以上のZabbixが必要です。 AWS アクセスキー yyyyyyyy   AWS アクセスキー zzzzzzzzz     Amazon Bedrockの設定 Amazon Bedrockで使用できるAIモデルはデフォルトで無効になっており、アクセス許可設定が必要です。 AWSマネジメントコンソールから「Amazon Bedrock」->「Bedrock configurations」->「モデルアクセス」を開き使用したいモデルの「アクセスをリクエスト」します。 今回は「Titan Text G1 – Express」を使用します。   スクリプトの作成 メディアタイプのタブ 項目 値 補足 名前 任意   範囲 手動イベント処理   タイプ スクリプト   次で実行 Zabbixサーバー   コマンド 次に記載   ホストグループ すべて   ユーザーグループ すべて   必要なホストへのアクセス権 表示のみ   スクリプト export aws_access_key_id=YYYYYYYYYYYYY export aws_secret_access_key=ZZZZZZZZZZ export region=ap-northeast-1 export service=bedrock export model_id=amazon.titan-text-express-v1 curl -s "https://bedrock-runtime.${region}.amazonaws.com/model/${model_id}/invoke" \ --aws-sigv4 "aws:amz:${region}:${service}" \ --user "${aws_access_key_id}:${aws_secret_access_key}" \ -H "Content-Type: application/json" \ -X POST \   --data '{   "inputText": "次のログの対応方法を教えてください。\n{ITEM.VALUE}" }'| jq '.results[0].outputText' | sed 's/\\n/\'$'\n/g'   実行イメージ ログを受信する 障害画面からスクリプトを実行する Amazon Bedrockからの回答が表示される   最後に 弊社ではZabbix関連サービスを展開しています。以下ページもご参照ください。 SCSK Plus サポート for Zabbix SCSK Plus サポート for Zabbix 世界で最も人気のあるオープンソース統合監視ツール「Zabbix」の導入構築から運用保守までSCSKが強力にサポートします www.scsk.jp ★YouTubeに、SCSK Zabbixチャンネルを開設しました!★ SCSK Zabbixチャンネル 本チャンネルでは、SCSK株式会社でのZabbixに関するトレンド/事例紹介などを動画にまとめて取り上げております。 最新のトピックについては、以下の弊社HPもしくはツイッターアカウントをぜひ参照ください。 ツイッターアカウント: www.youtube.com ★X(旧Twitter)に、SCSK Zabbixアカウントを開設しました!★ x.com x.com
アバター
今回は、Prisma Cloudでのカスタムポリシー作成について詳しく解説します。セキュリティやコンプライアンスのニーズに合わせたポリシーを作成する方法を知っておくと、より効果的なクラウドリソースの管理が可能になります。この記事では、カスタムポリシーの基本から具体的な手順までをわかりやすく説明します。 カスタムポリシーとは? カスタムポリシーは、組織の特定の要件やニーズに応じて利用者側で作成するセキュリティルールです。Prisma Cloudでは予め用意されているポリシーが存在しますが、カスタムポリシーを作成することでよりニーズに合ったクラウドリソースの監視やコンプライアンスの確保が容易になります。Prisma Cloudでは、RQL(Resource Query Language)を使ってクエリを作成するか、保存済み検索を利用してクラウドリソースを照合することができます。   カスタムポリシーの種類 Prisma Cloudで作成できるカスタムポリシーには、以下のような種類があります。 Attack Path(攻撃経路)ポリシー このポリシーは、高リスクの攻撃経路を監視します。侵害の可能性がある経路を特定し、適切な対応を促します。 Attack Pathポリシーの詳細については こちら の記事でも説明しています。 Audit Event(監査イベント)ポリシー 監査データを調査し、特権アクティビティや疑わしいアクティビティまたは類似したアクティビティを監視します。 Prisma CloudがAWS、Azure、およびGCPクラウドサービスから取り込んだ、各種サービスおよび関連するユーザー/イベントデータから、クラウド環境内のコンソールおよびAPIアクセスの調査、特権アクティビティの監視とアカウント不正利用や不審なユーザー行動の検出などを行うことができます。 Config(設定)ポリシー リソース設定を監視し、ポリシー違反の可能性をチェックします。BuildとRunの2種類のサブタイプがあり、BuildポリシーはIaCテンプレート内のセキュリティの設定誤りをチェックして、それらの問題がプロダクション環境に持ち込まれないようにします。Runポリシーはデプロイされたクラウドリソースを監視し、潜在的な問題をチェックします。 IAMポリシー クラウド環境のID(認証情報)を監視し、過剰または未使用の権限を確認します。 Network(ネットワーク)ポリシー ネットワーク活動を監視し、リスクを検出します。 取り込まれたネットワークトラフィックデータの異常を機械学習で特定し、インターネットに公開されているサービス、疑わしい IP との通信などを検出します。   カスタムポリシーの作成手順 では、実際にカスタムポリシーを作成する手順を見ていきます。 今回はConfigポリシーを作成します。 ガバナンスを選択 Prisma Cloud の管理コンソールで、まず[ガバナンス]を選択します。   ポリシーを追加 次に、[Add Policy(ポリシーを追加)] > [設定]を順に選択します。 ポリシー名と説明を入力 ポリシー名を入力し、必要に応じて説明やラベルを追加します。 サブタイプの選択 サブタイプで[実行]を選択します。 ※サブタイプ[実行]はデプロイ済みのリソースのスキャンを、サブタイプ[ビルド]はコードリポジトリやIaCテンプレートのスキャンを行います。 重大度の選択 ポリシーの重大度を選択し、[Next(次へ)]をクリックします。 クエリの作成 RQLを使ってポリシーのクエリを作成します。保存済み検索を使用する場合、事前定義オプションを選択してクエリを自動記入できます。 今回は、インスタンスタイプに「large」を含むEC2インスタンスを検出するRQLを入力しました。 [検索]を押下し、検索欄左のマークが緑色であることを確認して[次へ]をクリックします。 コンプライアンス基準の追加 必要に応じて、ポリシーにコンプライアンス基準を追加します。 今回は特に要件がないので、何も選択せずに[Next(次へ)]をクリックします。 修正セクションの入力 ポリシー違反のアラートを自動的に修正する場合、修正用のコマンドラインコマンドを入力します。CLI修復はサブタイプがRun(実行)のポリシーでのみ利用可能です。 今回はアラート検知だけで自動修正は行わないので、何も設定せず[サブミット]をクリックします。 これでカスタムポリシーの作成は完了です。 作成後の確認 ガバナンスの画面で、画面右側にある検索欄に作成したカスタムポリシー名を入力し、ポリシーが表示されることを確認します。 作成したカスタムポリシーが表示されたので、以上で作業完了です。   まとめ カスタムポリシーは、Prisma Cloud を活用したクラウドリソースの効果的な管理に役立つ機能です。この記事で紹介した手順を参考に、組織の特定のニーズに合ったポリシーを作成し、セキュリティとコンプライアンスの強化を図りましょう。 今後も、Prisma Cloud の活用方法について実用的な情報をお届けできればと思います。 また、当社では、複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。 マルチクラウド設定診断サービス with CSPM| SCSK株式会社 マルチクラウド環境のセキュリティ設定リスクを手軽に確認可能なスポット診断サービスです。独自の診断レポートが、運用上の設定ミスや設計不備、クラウド環境の仕様変更などで発生し得る問題を可視化し、セキュリティインシデントの早期発見に役立ちます。 www.scsk.jp ご興味のある方は是非、お気軽にお問い合わせください。
アバター
こんにちは、SCSK株式会社の谷川です。 今回はZabbixの脆弱性管理、脆弱性情報の確認方法についてご紹介したいと思います。   脆弱性管理運用について 脆弱性とはソフトウェア、ハードウェアなどに存在するセキュリティ上の弱点や欠陥のことを指します。 この弱点が存在することにより、攻撃者は不正にシステムにアクセスしたり、データを盗んだり、システムを破壊 したりすることが可能になります。このためシステム管理者は稼働するシステムのソフトウェアや、ハードウェアの 脆弱性情報をタイムリーに情報収集し、その対策を講じる必要があります。 直近では下記記事のとおり、8月にZabbixでもCVSSスコア 「 9.9 」 と重大な脆弱性情報の公開がありました。 【緊急】Zabbix の脆弱性情報 CVE-2024-22116 (CVSS 9.9) 2024年8月9日(現地時間)にZabbix社は、監視ソリューション「Zabbix」に深刻な脆弱性があると公表いたしました。 この脆弱性が悪用された場合は、システム全体が危険にさらされる可能性があるため、緊急のアップデートが推奨されております。 blog.usize-tech.com 2024.08.21 Zabbixの脆弱性情報の公開頻度について Zabbixの脆弱性情報は下記URLにて公開されています。 Security Policy www.zabbix.com 公開頻度は、新バージョンがリリースされた後やZabbixを構成しているソフトウェアやミドルウェアに依存する 脆弱性情報が見つかったタイミング等で、傾向はなく不定期に公開される特性のものと認識しています。 一方で上記脆弱性情報の概要や自身の環境に影響があるかは、英語表記ということもあり、 英語が苦手な自分は少し判断がしづらいかなと感じております。 脆弱性情報の概要・影響の確認方法について そこで本日は、生成AIを利用して脆弱性情報の概要・影響が少しだけ分かりやすく 確認できる方法の一例についてご紹介したいと思います。 生成AIのモデルはGPT-4を利用し、以下のプロンプト例では脆弱性情報とZabbixのバージョンを変数としています。 脆弱性情報の概要・影響把握のためのプロンプト例 #命令書: あなたはZabbixサーバーの管理者です。 以下の{{脆弱性情報}}より要約のうえ影響と回避方法について回答してください。 なお{{利用バージョン}}に該当しなければその旨、回答してください。 #脆弱性情報 ・{{脆弱性情報}}:ZBV-2023-09-20-1 #対象者 ・Zabbixに詳しくない人 #制約条件 ・バージョンは明確に ・{{利用バージョン}}:Zabbix Agent 5.0.10 #内容構成 1.概要要約 2.対象コンポーネント 3.対象バージョン 4.影響 5.回避方法 回答例 以下に、指定された脆弱性情報「ZBV-2023-09-20-1」について要約し、影響と回避方法について回答します。 {{脆弱性情報}}: ZBV-2023-09-20-1 1. 概要要約 脆弱性「ZBV-2023-09-20-1」は、特定の条件下でZabbixサーバーやエージェントに影響を与える セキュリティ上の問題です。この脆弱性により、攻撃者がシステムに不正アクセスしたり、 サービスを停止させたりする可能性があります。 2. 対象コンポーネント この脆弱性は主にZabbixエージェントに関連しています。 3. 対象バージョン 対象バージョンは以下の通りです: Zabbix Agent 6.0.0 ~ 6.0.15 Zabbix Agent 7.0.0 ~ 7.0.9 4. 影響 この脆弱性が悪用されると、攻撃者は以下の影響を与える可能性があります: エージェントを通じてシステムに不正アクセス。 エージェントのサービスを停止させる。 機密データの漏洩。 5. 回避方法 アップデート: 対象バージョンのZabbixを最新バージョンにアップデートする。 設定変更: エージェントの設定を見直し、不要なサービスやポートを無効にする。 ファイアウォール設定: エージェントが通信するポートに対して適切なファイアウォールルールを設定。 {{利用バージョン}}: Zabbix Agent 5.0.10 該当しない : この脆弱性情報「ZBV-2023-09-20-1」はZabbix Agent 5.0.10には該当しないため、 特別な対応は不要です 。 質問や詳細な情報が必要であれば、お知らせください。 まとめ 上記のとおり、一部回避方法部分で怪しい箇所はあるものの、人の調査レポートに近しい品質の回答が得られました。 プロンプトに条件や前提を付与することで翻訳だけでなく、 脆弱性の概要や影響把握のための調査工数が少しだけ軽減されるように感じております。 なお今回は脆弱性情報の概要・影響の確認方法にフォーカスしましたが、 次回は重大な脆弱性が公開されたタイミングでタイムリーに検知する方法について記事にしたいと思います。 さいごに もし上記のようなZabbixに関連した脆弱性影響有無の判断が難しい場合や、 セキュリティ面に考慮した構築・運用のサポートが必要でしたら、 本件に関わらず以下ページよりお気軽にお問合せください。 お問い合わせ 製品・サービスについて 入力 | SCSK株式会社 SCSK株式会社 製品・サービスについてご意見・ご質問をお受けしております。 www.scsk.jp また直近で以下のZabbixに関連したセミナーへ参加予定です。 ご質問をお受けする時間もございますので、ご興味がございましたら是非ご参加ください。   ■Zabbix五都市キャラバン 2024.9.13 (金) 大阪 2024.9.20 (金) 博多 2024.9.27 (金) 札幌 Zabbix5都市キャラバン2024 www.zabbix.com   ■SCSK Zabbixプライベートセミナー 2024.10.02(水)オンライン https://www.scsk.jp/event/2024/20241002_2.html
アバター
こんにちは、SCSKの吉田です。 本記事では、タイトルにあるようにServiceNowの生成AI機能であるNow Assistを活用した、カタログアイテム(申請フォーム)とフローの作成を実践してみたので、そのプロセスを紹介します。 本記事は執筆時点(2024年8月)の情報です。最新の情報は製品ドキュメントを参考にしてください。 シナリオ ServiceNowへのアカウント登録を依頼する申請書を作成します。 申請フォーム 以下の質問項目を含めます。 First Name, Last Name, Email, Department(部署) フロー 以下のフローを作成します。 申請フォームに入力されたDepartment(部署)の部長に承認を求める。 部長が承認したらServiceNow上にアカウントを自動登録し、登録完了を申請者と登録されたユーザーに通知する。 部長が却下した場合、申請者に通知する。 使用する機能 Now Assist for Creatorに含まれる2つの機能を使います。 Catalog item generation 完成イメージを文字で入力すると、Now Assistがカタログアイテム(申請フォーム)の説明文や質問項目を自動で作成してくれる機能になります。GUIベースでカタログアイテムを作成できるCatalog Builderの中にNow Assistが追加されました。 Flow generation ServiceNowのフローを作成する機能であるFlow Designerの中で使用することができます。 作成したいフローの説明を文字で入力することで、Now Assistがフローのアウトラインを自動で作成してくれる機能になります。  実践 申請フォームの作成 Catalog Builderのカタログアイテムを作成するプロセスで「Now Assist」というステップが追加されています。 以下のように作成したいカタログアイテムの説明を入力して「Generate with Now Assist」をクリックします ※カタログアイテムのアクセス制限やフローとの紐づけなどその他設定が必用ですが、本記事では割愛します。 Create a user registration request form. It must include String type fields: First Name, Last Name, Email. Add a drop down menu offering department records stored within cmn_department table. All fields must be mandatory. Now Assistが作成したカタログアイテムは以下画像の通りです。 フォームの説明文、各質問項目は全てNow Assistにより自動生成されています。 こちらの内容で問題ない為、カタログアイテムの作成はこれで完了です。 フローの作成 Flow Designerで作成したいフローの説明を以下の通り入力します。 Flow DesignerにはActionやFlow Logicといったコンポーネントが用意されており、入力した説明に基づきNow Assistがこれらのコンポーネントを配置してフローを組んでくれます。 Create a flow that would be triggered upon the submission of a request. First, get cataalog variable and look up a record. Next, ask for approbal. If approvals are approved, create a record and send a email. If not, send a email.   以下画像がNow Assistにより生成されたフローのアウトラインとなります。 フローのトリガーや、コンポーネントの配置、If分岐など全て想定通りのフローを作成してもらえました。 誰に承認を求めるか、誰に通知を送るかなど細かい設定をマニュアルで実施すればフローの作成は完了となります。 最後に、作成したカタログアイテムとフローを紐づけます。 動作確認 以下の情報でユーザー登録を申請します。 ※IT Departmentの部長は、「Taro Test」を設定しています 申請するとIT Departmentの部長であるTaro Testに承認依頼が作成されます。 部長が承認すると、ユーザーテーブル上にアカウントが自動で登録されました。 また、申請者と新規作成されたユーザー宛てにメールが通知されています。 (申請が却下された場合は、ユーザー登録されず、却下メールが通知されていることも確認できました)   以上で、Now Assistに作成を支援してもらったカタログアイテム(申請フォーム)とフローの動作確認が完了しました。   最後に Now Assistを活用してカタログアイテム(申請フォーム)、フローを作成してみました。 一部はマニュアルでの設定が必要ですが、完成イメージを文字で説明するだけで、大枠部分を自動生成してくれるので、単純作業にかける時間を省くことができると感じました。 今回は簡単なシナリオでしたが、より複雑なシナリオに対しNow Assistによりどれだけ作業を効率化できるか、今後試していきたいと思います。   以下、弊社HPです。 併せてご参照ください。 ServiceNow ServiceNowは、企業の生産性向上や業務プロセス改善を支えるサービスマネジメントクラウドソリューションです。従業員満足度・顧客満足度の向上、業務効率化を強力に支援します。 www.scsk.jp
アバター
こんにちは。SCSKの山口です。 今回は、BigQuery で機密データを扱う際に欠かせない「データマスキング」について書きます。 実装する中で、権限周りでかなり悩んだ部分もあったので記載しておきます。お役に立てると嬉しいです。 BigQuery のデータマスキング 概要 データ マスキングの概要  |  BigQuery  |  Google Cloud BigQuery での列レベルのデータ マスキングと、そのメリット、要件、制限事項について説明します。いくつかのサンプル ユースケースで、マスキング ルールがさまざまなユーザー グループに適用される仕組みを示します。 cloud.google.com BigQuery では、「列レベルでのデータマスキング」をサポートしています。 この機能は「列レベルのアクセス制御」のベースの上に構築されているものなので、列レベルのアクセス制御を把握しておく必要があります。詳細は下記ブログをご参照ください。 【GCP】BigQuery のアクセス制御まとめ その② 本ブログはBigQuery のアクセス制御まとめ その①の続編です。今回は、BigQueryの「列と行のアクセス制御」について書きます。 blog.usize-tech.com 2024.08.22 下記手順で実装します。 分類と1つ以上のポリシータグを設定する ポリシータグのデータポリシーを構成する ポリシータグをBigQuery テーブルの列に割り当て、データポリシーを適用する マスクされたデータにアクセスできるユーザを、BigQuery のマスクされた読み取りロールに割り当てる マスキングを実装すると、 ユーザのロールに基づいて クエリの実行時にマスキングルールが自動的に適用されます。これは クエリに関する他のすべてのオペレーションよりも優先 されます。 マスキングのルールに関しては、事前に用意された下記のルールから選択することができます。 使用可能なマスキングルール 使用可能なマスキングルールは以下の通りです。 カスタムマスキングルーティン 年月日マスク デフォルトのマスキング値 メールマスク 先頭/末尾の4文字 Null化 カスタムマスキングルーティン ユーザー定義関数  |  BigQuery  |  Google Cloud cloud.google.com カスタムマスキングルーティンとは、 「ユーザ定義関数(UDF)」 を適用することにより、 ユーザ独自のマスキングルール を実装する方法です。 カスタムマスキングルーティンでは、各種文字列関数の他、ハッシュ関数、日時関数など多くの関数が使用可能となっています。(詳細は こちら ) 例)ユーザの社会保障番号を「XXX-XX-XXXX」に置き換えるマスキングルーティン   CREATE OR REPLACE FUNCTION SSN_Mask ( ssn STRING ) RETURNS STRING   OPTIONS ( data_governance_type = "DATA_MASKING" ) AS (   SAFE . REGEXP_REPLACE ( ssn , '[0-9]' , 'X' ) # 123-45-6789 -> XXX-XX-XXXX   );   年月日マスク データ内の 年以降の情報を切り捨てる マスキングルールです。 DATE,DATETIME,TIMESTAMP型 のデータに対してのみ使用できます。 種類 元の値 マスク後の値 DATE 2030-07-17 2030-01-01 DATETIME 2030-07-17T01:45:06 2030-01-01T00:00:00 TIMESTAMP 2030-07-17 01:45:06 2030-01-01 00:00:00   デフォルトのマスキング値 対象の列のデータ型に基づいて、あらかじめ定められている デフォルトのマスキング値 を返します。 データ型 デフォルトのマスキング値 STRING “” BYTES b” INTEGER 0 FLOAT 0.0 NUMERIC 0 BOOLEAN FALSE TIMESTAMP 1970-01-01 00:00:00 UTC DATE 1970-01-01 TIME 00:00:00 DATETIME 1970-01-01T00:00:00 GEOGRAPHY POINT(0 0) BIGNUMERIC 0 ARRAY [] STRUCT NOT_APPLICABLE ポリシータグは、 STRUCT  データ型を使用する列には適用できませんが、そのような列のリーフ フィールドに関連付けることができます。 JSON null   メールマスク 有効なメールアドレスのアカウント部分(@より前)を「XXXXX」に置き換えます。 有効なメールアドレスでない場合は、SHA-256ハッシュ関数を使用してハッシュ化された値に置き換えます。 STRING型のデータ にのみ使用できます。 元の値 マスク後の値 abc123@gmail.com XXXXX@gmail.com randomtext jQHDyQuj7vJcveEe59ygb3Zcvj0B5FJINBzgM6Bypgw= test@gmail@gmail.com Qdje6MO+GLwI0u+KyRyAICDjHbLF1ImxRqaW08tY52k=   先頭/末尾の4文字 先頭(末尾)を返し、文字列の残りの部分を「XXXXX」に置き換えます。 文字列の長さが4文字以下の場合は、SHA-256ハッシュ関数を使用してハッシュ化された値に置き換えます。 STRING型のデータ にのみ使用できます。 元の値 先頭の4文字 末尾の4文字 example XXXXple exaXXXX rei 80a23528c754a504894e9747d7df4fde20e937d3e9e63a86c001eecb0908b46 80a23528c754a504894e9747d7df4fde20e937d3e9e63a86c001eecb0908b46   Null化 列の値の代わりに「NULL」を返します。 列の値に加えて、 データ型も非表示にしたい場合 に有効です。   実践:データマスキング ここからは実際にデータをマスキングしていきます。 下記テーブルを使用します。 今回は、「クレジットカード番号」と「メールアドレス」をマスキングします。 また、事前にAdminユーザとMemberユーザの2つを用意し、それぞれの作業で分けて説明します。 Admin:分類の作成 列データをマスキングする  |  BigQuery  |  Google Cloud Google Cloud コンソールまたは BigQuery Data Policy API を使用してデータポリシーを追加、表示、更新、削除する方法を説明します。 cloud.google.com まず分類を作成する必要があります。 今回は、 BigQuery のアクセス制御のブログ で作成した下記分類を再利用します。 文類の作成方法については こちらのブログ をご参照ください。   Admin:カスタムマスキングルーティンを作成する 次に、クレジットカード番号をマスキングするためのカスタムマスキングルーティンを作成します。 下記クエリを実行し、UDFを作成します。 CREATE OR REPLACE FUNCTION yamaguchi_test_acctrl.SSN_Mask(ssn STRING) RETURNS STRING OPTIONS (data_governance_type="DATA_MASKING") AS ( SAFE.REGEXP_REPLACE(ssn, '[0-9]', 'X') # 123-45-6789 -> XXX-XX-XXXX );   Admin:データポリシーを作成する 列データをマスキングする  |  BigQuery  |  Google Cloud Google Cloud コンソールまたは BigQuery Data Policy API を使用してデータポリシーを追加、表示、更新、削除する方法を説明します。 cloud.google.com 分類が準備できたら、次にデータポリシーを作成します。 BigQuery画面の左ペインから「管理」-「ポリシータグ」を選択し、対象のポリシータグを選択した状態で「データポリシーを管理」をクリック [クレジットカード番号:カスタムマスキングルーティン] 先ほど作成したルールを選択 「プリンシパル」にマスキングルールを適用させたいユーザアカウントを入力 [メールアドレス:メールマスク]   ここまででデータポリシーの作成は完了です。   Admin:ポリシータグを列に設定する 列データをマスキングする  |  BigQuery  |  Google Cloud Google Cloud コンソールまたは BigQuery Data Policy API を使用してデータポリシーを追加、表示、更新、削除する方法を説明します。 cloud.google.com この作業は、 BigQuery のアクセス制御のブログ で作成した設定を再利用します。 設定方法の詳細については こちらのブログ をご参照ください。 BigQueryの対象テーブルの「スキーマ」ペインで「スキーマの編集」をクリック 対象スキーマを選択した状態で「ADD POLICY TAG」をクリック 対象スキーマに設定するポリシータグを選択する 設定完了するとこんな感じになります。 ここまででAdmin側での設定作業は完了です。   Member:テーブルデータ確認 Memberユーザでテーブルのプレビューを見てみます。 今回マスキングを設定したスキーマのデータが表示されなくなりました。 クエリを投げてデータを見てみます。 対象スキーマのデータがマスキングされた状態 で表示されました。大成功です。   悩んだ点 冒頭にも書きましたが、マスキングがうまくいかず、半日くらい悩まされました。 結果として、権限の設定が原因でした。 今回登場する権限(ロール)は下記の二つです。 ・マスクされた読み取りロール ・きめ細かい読み取りロール 公式ドキュメント を参考に下記の手順を実行しました。 結論として、 2の「きめ細かい読み取り」ロールを、マスキングしたデータを見せたいMemberのアカウントに付与していたこと が原因で、マスキングが適用されていませんでした。 各ロールの仕組みのドキュメント を見ると、下記記載があります。 図にすると以下の通りです。 マスキングされたデータを見せたいユーザに対しては、 マスクされた読み取りロールのみを付与する か、 マスクされた読み取りロールが優位に働くようにする 必要があります。 今回は、 二つのロールを同じポリシータグ内で付与してしまってい たため、マスキングされたデータが表示されませんでした。 ちなみに、「マスクされた読み取りロール」はマスキングルールとプリンシパルを紐づける操作の際に自動的に付与されます。 公式ドキュメントに記載のあるベストプラクティスは、「データポリシー レベルでBigQuery のマスクされた読み取りロールを割り当てること」です。プロジェクトレベル以上でロールを割り当てると、プロジェクト内のすべてのデータポリシーに対する権限がユーザーに付与され、過剰な権限による問題の原因となります。 列データをマスキングする  |  BigQuery  |  Google Cloud Google Cloud コンソールまたは BigQuery Data Policy API を使用してデータポリシーを追加、表示、更新、削除する方法を説明します。 cloud.google.com   まとめ 今回はBigQueryのデータマスキングについて書きました。 今回はあらかじめ用意しておいたデータに対してマスキングを行いましたが、設定以降に入ってきたデータに対してももちろんマスキングが実行されます。都度設定する必要がないので大変便利ですね。 今回紹介したマスキングや前回のブログで紹介したアクセス制御に関しては、 「分類やポリシーの設計」 がとても重要になると思います。 また、データマスキングを列レベルのアクセス制御と組み合わせて使用することで、さまざまなユーザーグループのニーズに基づいたアクセス範囲を構成できます。 BigQueryの列レベルのアクセス制御に関しては、 こちらのブログ をご覧ください。
アバター