近年、クラウドサービスの選択肢はますます多様化しており、さまざまなクラウドが活用されています。
世界のクラウドプロバイダーのシェア上位3社を見ると、AWSが29%、Microsoft Azureが20%、Google Cloudが13%となっており※、
Microsoft AzureやGoogle Cloud Platformも成長を続けていますが、依然としてAWSがトップの座を維持しています。
(※2025年第3四半期データ Cloud Market Growth Rate Rises Again in Q3; Biggest Ever Sequential Increase | Synergy Research Group)
実際、当チームでもクラウド案件の多くは引き続きAWSが中心です。
そこで本記事では、LifeKeeperによる可用性対応の観点から、AWSでよく採用される代表的な構成パターンについて紹介します。
AWS環境で高可用性設計を検討されている方の参考になれば幸いです。
Amazon EC2で冗長化構成をとる場合のOSごとの基本構成は以下の通りです。(稼働系、待機系ノード間でデータ共有を行う場合を想定。)
基本的に他のクラウドやオンプレミスの仮想環境と大きく変わりません。
Windows環境の場合はWindows標準機能のWSFCを使用することでコストを抑えた高可用性を確保することができます。
| Linux | Windows | |
| LifeKeeper+DataKeeperの組み合わせ | LifeKeeper+DataKeeperの組み合わせ | WSFC+DataKeeperの組み合わせ |
![]() |
![]() |
![]() |
※DataKeeperによるデータレプリケーションは必須ではなく、LifeKeeperのみの構成も可能です。
※図では省略しておりますが、可用性の観点から、各クラスターノードを別々のアベイラビリティゾーン(AZ)に配置することで、物理的な障害発生時にもシステム停止リスクを最小限に抑えることが可能です。
この構成はクラスターを同じVPC内のクライアントから接続される際によく用いられます。
クライアント(クラスタノードと通信するマシン)は仮想IPに向けて通信することでActiveノードに到達できます。
AWS環境でAZを跨ぐとサブネットも跨いでしまうので、オンプレミスのように仮想IPだけではクライアントは正しくActiveノードへ到達できません。
そこで、VPCのCIDR外の仮想IPをルートテーブルに登録し、転送先のActive/StandbyノードのENIをクラスターの切り替え時にLifeKeeperからAWS CLIを介して書き換えることで、クライアントは常にActiveノードに到達できます。
この構成で利用必須となるRecovery Kit: Recovery Kit for EC2、Recovery Kit for IP Address
※注意:AWSの仕様上、クライアントはクラスタと同じVPCに存在している必要があります。
仮想IPはVPCのCIDR外で割り当てる必要があります。
ルートテーブルシナリオにAWS Transit Gatewayを組み合わせることで、VPC外(オンプレミスや別VPC)からもクライアント通信に対応できます。
例えば、JP1等の統合運用管理ツール、HULFTなどのファイル転送ソフトでクライアントがVPC外にいる場合、この構成が有効です。
この構成で利用必須となるRecovery Kit: Recovery Kit for EC2、Recovery Kit for IP Address
※注意:Transit Gateway向きのルートテーブル設定を行っておく必要があります。
Transit Gatewayが使えない場合などに、DNSサービスのRoute53での名前解決を利用する構成です。
クライアントはRoute53により名前解決された実IPに向けて通信することで、Activeノードへ到達できます。
この構成で利用必須となるRecovery Kit: Recovery Kit for Amazon Route 53™、Recovery Kit for IP Address
※注意:クライアントはホスト名(FQDN)でアクセスできることが前提になります。
LifeKeeper(Recovery Kit for Amazon Route 53™)に登録するホストゾーン名がパブリックホストゾーン、プライベートホストゾーンで複数存在している場合、Recovery Kit for Amazon Route 53™によるリソース作成は現状不可となりますのでご注意ください。
(参考:同名のホストゾーンは使えない!? Amazon Route 53リソース作成時の注意点 – TechHarmony)
⇒上記問題発覚後、サイオステクノロジー社に改善提案を出したところ、今後改善予定で動いているとのこと。(2025年12月時点リリース時期未定)
NLB(Network Load Balancer)のヘルスチェックを利用した構成です。
セキュリティ要件により、前述のようなAWS CLIによる構成変更が実施できない、インターネットに接続していない環境でクライアントからDNS名でアクセスしたい場合にはこの構成をご検討下さい。
クライアントからはNLBのDNS名でアクセスし (AWS内部のRoute 53経由で解決)、NLBのヘルスチェックとLB Health Check Kitを組み合わせて、ヘルスプローブを受け取ったノードにトラフィックを転送することで接続先の切り替えを実現します。
この構成で利用必須となるRecovery Kit: LB Health Check Kit、Recovery Kit for IP Address
今回は代表的な構成についてご紹介しましたが、
その他にもクロスリージョン構成やAWS Outpostsで共有ディスクを冗長化させるなど様々な構成にも対応しています。
この記事で紹介されていない構成につきましては弊社やサイオステクノロジー社にお問い合わせ頂くことを推奨いたします
本記事がAWS環境における冗長化の参考になりましたら幸いです!
こんにちは、高坂です。
前回の記事では、Prisma Cloudのアラート解決状況をバブルチャートで可視化する試みについてご紹介しました。
バブルチャートでの可視化は、「どの領域で」「どれくらいの量と重要度のアラートが」「どの程度放置されているか」を直感的に把握する上で非常に有効でした。しかし、2次元のグラフであるバブルチャートでは、主に扱える変数が限られるという制約がありました。例えば、「アラートの種類」と「重要度」という2つの軸で状況を見ることはできても、そこに3つ目以上の要因を加えて、より多角的に分析することは困難でした。
そこで今回は、機械学習の手法の一つである「決定木」を使い、アラートの対応条件を分析する方法を試しました。決定木を用いることで、Policy Type(種類)、Policy Severity(重要度)、そしてAlert Time(発生時期)といった複数の変数を同時に扱い、「チームの対応ルールがいつ、どのように変化したか」を解明することを目指します。
決定木は、機械学習のアルゴリズムの一種で、その名の通り、データを分類するためのルールを木のような構造(ツリー構造)で表現する手法です。
詳しい仕組みは以下の記事がわかりやすいです。
決定木を用いる最大のメリットは、その結果の分かりやすさにあります。他の高度な機械学習モデルが、時に「ブラックボックス」として振る舞うことがあるのに対し、決定木は人間が読んで解釈できる「if-then」形式のルールを出力します。
ただし、この決定木が万能というわけではないことを注釈しておきます。
決定木は、分析対象のデータ、今回の場合だとチームのアラート対応状況に、何らかの一貫したパターンや傾向(=暗黙のルール)が存在することを前提としています。
今回の決定木での分析を行えば、必ずしも明確な結果が保証されるわけではないということはご了承ください。
もし、チームの対応方針が定まっておらず完全に場当たり的であったり、担当者ごとに判断基準が大きく異なっていたりする場合、決定木は明確で解釈しやすいルールを見つけ出せない可能性があります。結果として、非常に複雑で、ビジネス的な意味を見出しにくいツリーが出力されるかもしれません。
今回の分析では「Policy Type」、「Policy Severity」、「Alert Time」、「Alert Status」のデータを使用していきます。
決定木がどのようなルールを見つけ出すのかを具体的に見ていくために、今回は「とある組織で行われたアラート対応」という仮想的なシナリオを用意し、それに基づいてダミーデータを用意しました。
このシナリオには、明確なアラート対応と「改善前」と「改善後」のフェーズが存在します。
この組織のセキュリティ運用チームは、日々大量に発生するアラートへの対応に追われ、疲弊していました。明確なトリアージ基準はなく、対応は一部のベテラン担当者の経験と勘に頼っている状況でした。
この時期の暗黙的な対応ルールは、非常にシンプルでした。
Criticalアラートだけは絶対に対応する: これだけは経営層からも厳しく言われていたため、何があっても必ず解決していました。High以下)は、ほぼ手付かず: チームのリソースが足りず、ほとんどのアラートは未解決(Open)のまま放置されていました。2025年8月1日、チームに経験豊富な新しいマネージャーが着任し、アラート対応プロセスを抜本的に見直しました。アラートの重要度とタイプに基づいた、明確なトリアージルールを導入したのです。
新しいルールは以下の通りです。
CriticalとHighは、最優先で必ず解決する。MediumとLowは、タイプによって対応を分ける。
configタイプ: 新しく導入された自動修復スクリプトの対象となり、ほぼ自動で解決されるようになりました。iam, network, anomaly): 手動での調査が必要なため優先度が低く、多くが未解決のままとなりました。上記のシナリオを、ダミーデータ生成のための具体的な構成表にまとめます。
| 期間 | 条件 | Policy Severity |
Policy Type |
Alert Status の確率分布 |
|---|---|---|---|---|
| Phase 1(〜2025/7/31) | Severityがcritical |
critical |
すべて | resolved: 95%
|
Severityがcriticalでない |
high, medium, low, informational |
すべて | open: 90%
|
|
| Phase 2(2025/8/1〜) | Severityがhigh以上 |
critical, high |
すべて | resolved: 98%
|
Severityがmedium以下 |
medium, low, informational |
config |
resolved: 90%
|
|
Severityがmedium以下 |
medium, low, informational |
iam, network, anomaly |
open: 85%
|
今回の可視化分析には、前回同様Pythonを使用しました。
主な利用ライブラリは、データの加工にはpandas、モデルの学習にはscikit-learnを利用しました。
ここではコードの全ての詳細には触れませんが、実装の主要なステップと、特に工夫したポイントをご紹介します。
まず、pandasを使って生のアラートデータをモデルが学習できる形式に変換します。 今回の分析の鍵であるAlert Timeは、そのままでは機械学習モデルが扱えません。そこで、各アラートの発生日時を、分析期間の開始日からの経過日数(days_since_start)という数値に変換しました。これにより、決定木は「開始から何日目以降」といった時間的な分岐点を見つけ出せるようになります。 また、Policy TypeやPolicy Severityといったカテゴリカルなデータも、モデルが理解できる数値形式(ダミー変数)に変換しています。
次に、scikit-learnのDecisionTreeClassifierを使って、準備したデータから決定木モデルを学習させます。 この際、前章で触れたポリシーの重要度を分析に反映させるために、重要度ごとに重みづけを実装しています。fitメソッドを呼び出す際に、criticalやhighのアラートに計算した「重み」を渡すことで、実際のセキュリティー運用を考慮した分析を目指しています。
学習が完了したら、その結果出力します。
今回の実装では通常の決定木とは別で、決定木の結果を生成AIに解釈してもらうためのルールテキストをJSONで生成します。
決定木の分析もAIにさせてみようという試みで、決定木の生成されたテキストを実際に生成AIに入力してみるところまでしてみようと思います。
以下結果です。
前述のダミーデータで決定木をさせると、以下の結果が得られました。
画像なので文字が見にくくて申し訳ないのですが、見方はざっくり以下です。
samples: そのノードに到達したアラートの総数を示しています。value: samplesの内訳です。class_namesが ['Open', 'Resolved'] の順であるため、例えば value = [315, 35] は、Openが315件、Resolvedが35件含まれていることを意味します。class: そのノードで最も多数派となったクラスを示します。つまり、そのノードに分類されたアラートが、最終的にどちらに予測されるかを表しています。ツリーの末端(葉ノード)では、これが最終的な結論となります。以上を踏まえると、決定木の結果はざっくり以下の様に分析できます。
まず最初に、ポリシー重要度が”Critical”(Severity is not ‘Critical’がFalse)だとほとんどのアラートが”Resolved”となっていることがわかります。
ポリシー重要度が”Critical”じゃないアラートについては、次にAlert Timeで条件分岐が起こっています。
“Critical”以外のアラートでは、2025/7/31以前は”Open”,以降は”Resolved”となっております。
さらに2025/7/31のアラートについては、”High”アラートは”Resolved”で、”High”(とCritical)以外のアラートについては”Config”タイプのものは”Resolved”となっております。
どうでしょう、最初にご紹介したシナリオを再現できているのではないでしょうか。
ルールテキストは以下の様に出力されます。
これをChatGPTのような生成AIに入力し、「結果を要約して」とお願いすると以下の結果を得ました。
以下は、提示された決定木の分析結果の要約です。
1. 「Severity(重大度)」で最初に分岐
「Critical(重大)」かどうかで大きく傾向が分かれる。2. Severityが「Critical」でない場合
【2025-07-31以前のアラート】
ほとんどが「Open」状態(解決されていない)。
「Alert Time」が細かく過去日付に分岐されるが、どの分岐も「Open」割合が高い(約70~98%)。
【2025-07-31以降のアラート】
「Severity」が「High」でない(それ以外):
「Type」が「Config」かどうかで差が出る。
「Config」タイプは、ほぼ「Resolved」。
それ以外は「Open」割合が高い。
「Severity」が「High」:
「Alert Time(警告発生日)」が新しいほど「Resolved」(解決済み)率が極めて高い(約97~100%)。3. Severityが「Critical」の場合
時期に関係なく「Resolved」が多い傾向。
2025-08-09以降は100%解決済み。
それより前でも90%以上が解決済み。
要点まとめ
Severityが高い(Critical / High)、かつアラートの発生日が新しければ「Resolved」(解決済み)が多い。
Severityが低く、発生日が古いほど「Open」(未解決)が多い。
Configタイプは比較的解決されやすい。
アラート発生直後や重大度の高いものは、解決対応が迅速に実施されている傾向。
この結果から、「重大なアラートほど早急に解決されるが、古い・低重大度のアラートは未解決が多い」
と言えるでしょう。運用上は、低重大度のアラートや古い未解決案件のフォローアップが課題となりそうです。
今回は機械学習の手法の一つである「決定木」を使い、アラートの対応条件を分析する方法を試しました。
決定木分析の結果、「Severity(重大度)」「Type(アラート種別)」「Alert Time(発生日)」という三つの変数が分析結果に現れました。前回作成したバブルチャートでは主に一度に二要素までの関係しか視覚化できませんでしたが、決定木による分析により、3変数以上の要因の組み合わせの分析が可能になり、データの奥行きや傾向把握の可能性が広がったかと思います。
また、今回は決定木分析の結果をテキストに出力することで、結果の解釈と要約の部分で生成AIの活用の可能性を示せたかと思います。
今回紹介した手法は一例であり、データの性質や分析目的によっては、さらに多様な可視化や分析手法が存在します。今後もPrisma Cloudから取得できるデータのさらなる活用方法について、試行錯誤し結果を発信していければと考えております。
また、当社では、Prisma Cloudを利用して複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。ご興味のある方はお気軽にお問い合わせください。リンクはこちら↓
本記事は TechHarmony Advent Calendar 2025 12/25付の記事です。 |
クリスマスマーケットでプレッツェルにハマりました
皆さんどうもこんにちは。いとさんです。
メリークリスマス!……と言いたいところですが、実は今日12月25日は、世界で初めて「Webサイト」が公開された記念すべき日でもあるそうです。
1990年の12月25日、イギリスの計算機科学者ティム・バーナーズ=リーが、世界で初めてのWebブラウザとサーバ間の通信に成功しました。 つまり、今こうして皆さんがブログを読めている環境の「誕生日」とも言える日なんです。ネットの歴史が動いたのがクリスマス当日だったというのは、なんだかロマンチックですよね。
さて今回はタイトルにもありますように
Amazon Bedrock AgentCore & Strands Agentsを使用したAWS構築支援エージェントの構築方法についてご紹介したいと思います!
AWS公式ドキュメントを使用した、開発・運用チーム向けのAWS運用支援エージェントを構築します。
チャットボットとの違いとして、自ら考え、道具を使い、経験を蓄積する「AIエージェント」としての機能を備えています。
一般的なチャットボットは、あらかじめ学習した知識の範囲内でユーザーの問いに「反応」するだけですが、今回構築するAIエージェントには決定的な3つの違いがあります。
「知識」ではなく「道具」を使いこなす (Tools)
通常のチャットボットは古い知識で答えることがありますが、このエージェントは MCPClientというツールを使い、外部にある「最新のAWS公式ドキュメント」へ自らアクセスして情報を取得します。
「会話」ではなく「経験」を記憶する (Memory)
ブラウザを閉じれば忘れてしまうチャットボットと違い、AgentCore Memory を通じて「過去のトラブル対応事例」などを長期記憶(LTM)として蓄積します。これにより、使えば使うほど使用する環境に詳しい状態へと成長します。
「思考」の方向を制御できる安全性 (Steering)
自由奔放なAIとは異なり、LLMSteeringHandler によって「破壊的な操作の提案を禁止する」といった運用のガードレールを思考プロセスそのものに組み込んでいます。
このように、最新の公式情報(MCP)と経験(LTM)を、安全なルール(ステアリング)の上で統合して提供できるのが「AWS運用支援エージェント」なのです。

us-east-1) を利用します。(StrandsAgent使用可能リージョンのため)Administrator Access相当、もしくは以下のポリシーを適用したIAMユーザーで作業すること。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockAccess",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:ListFoundationModels",
"bedrock:ListCustomModels"
],
"Resource": "*"
},
{
"Sid": "AgentCoreFullAccess",
"Effect": "Allow",
"Action": "bedrock-agentcore:*",
"Resource": "*"
},
{
"Sid": "S3AndECRForDeployment",
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket",
"ecr:GetAuthorizationToken",
"ecr:CreateRepository",
"ecr:DeleteRepository",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "*"
},
{
"Sid": "CodeBuildAndIAMManagement",
"Effect": "Allow",
"Action": [
"codebuild:*",
"iam:CreateServiceLinkedRole",
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:DeleteRole",
"iam:DeleteRolePolicy"
],
"Resource": "*"
},
{
"Sid": "CloudWatchAndBoto3Access",
"Effect": "Allow",
"Action": [
"logs:*",
"cloudwatch:*"
],
"Resource": "*"
}
]
}
まず、開発環境としてGitHub CodeSpacesをセットアップします。
aws-ops-agent)。AWS CLIのインストールと認証
ターミナルで以下のコマンドを実行し、AWS CLIをインストールします。
# ダウンロード curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" # 解凍 unzip awscliv2.zip # インストール sudo ./aws/install
AWSアカウントへの認証を設定します(ブラウザでの検証コード入力が必要です)
aws login --remote
デフォルトリージョンが us-east-1 でいいか聞かれたら Enter を押します。
エージェントが会話履歴と社内ナレッジを記憶するためのAgentCore Memoryを作成します。
エピソード記憶の有効化 (LTM)
作成したメモリの詳細画面を開き、「編集」をクリックします。
組み込み戦略の「Episodes」にチェックを入れ、「変更を保存」します。
重要: 作成されたメモリの Memory ID と、エピソード記憶戦略の 戦略ID を控えておきます。(エージェント本体の作成の際に使用します)
backend.py)エージェントの処理ロジックと、必要なツール、記憶、ステアリングを設定したAPIサーバーのコードを作成します。
ディレクトリとファイルの作成
以下のコードをコピーし、memory_XXXXX-XXXXXXXXXX (Memory ID) と episodic_builtin_XXXXX-XXXXXXXXXX (戦略ID) のプレースホルダーを、ステップ2で控えた実際のIDに置き換えて貼り付けます。
mkdir agentcore
cd agentcore
touch backend.py
# 必要なライブラリをインポート
from strands import Agent
from strands.tools.mcp import MCPClient
from strands.models import BedrockModel
from strands.experimental.steering import LLMSteeringHandler # ステアリング用
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from mcp.client.streamable_http import streamablehttp_client
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
# 1. モデル設定
model = BedrockModel(
model_id="us.amazon.nova-2-lite-v1:0",
max_tokens=4096
)
# 2. メモリー設定(STM/LTM)
memory_config = AgentCoreMemoryConfig(
memory_id="memory_XXXXX-XXXXXXXXXX", # ここをあなたのMemory IDに置き換える
session_id="aws_ops_handson",
actor_id="ops_engineer",
retrieval_config={
# エピソード記憶(LTM)の検索設定
"/strategies/episodic_builtin_XXXXX-XXXXXXXXXX/actors/ops_engineer/sessions/aws_ops_handson": RetrievalConfig() # ここをあなたの戦略IDに置き換える
}
)
session_manager = AgentCoreMemorySessionManager(
agentcore_memory_config=memory_config
)
# 3. ツール設定 (MCPClient)
mcp_client = MCPClient(
lambda: streamablehttp_client(
"https://knowledge-mcp.global.api.aws"
)
)
# 4. ステアリング設定(ポリシーの強制)
# 例: 破壊的な操作の推奨を禁止し、公式ドキュメント参照を強制
handler = LLMSteeringHandler(
system_prompt="設定変更やリソース削除につながる操作は絶対に推奨しないでください。また、回答には必ず公式ドキュメントの参照URLを含めるようにしてください。"
)
# AgentCoreランタイム用のAPIサーバーを作成
app = BedrockAgentCoreApp()
# エージェント呼び出し関数を、APIサーバーのエントリーポイントに設定
@app.entrypoint
async def invoke_agent(payload, context):
# リクエストごとにエージェントを作成し、設定を適用
agent = Agent(
model=model,
tools=[mcp_client], # MCPClientをツールとして組み込む
session_manager=session_manager, # 記憶(STM/LTM)を組み込む
hooks=[handler] # ステアリング(ポリシー)を組み込む
)
# エージェントをストリーミング呼び出し
stream = agent.stream_async( payload.get("prompt") )
# ストリーミングレスポンスをフロントに返却
async for event in stream:
yield event
# APIサーバーを起動
app.run()
touch requirements.txt
requirements.txt に以下をコピー&ペーストします。
strands-agents
strands-agents-tools
strands-agents[otel]
bedrock-agentcore
bedrock-agentcore[strands-agents]
作成したエージェントコードをAWS上で動作するAPIサーバーとしてデプロイします。
AgentCoreスターターキットのインストール
pip install bedrock-agentcore-starter-toolkit==0.2.2
Amazon Bedrock AgentCore スターターキットは、AWS上で高性能なAIエージェントを「安全に」「速く」「大規模に」構築・運用するために必要なすべてが詰まった、開発者向けの公式ツールセット(CLIおよびライブラリ)です。
これを使用することで、インフラの知識が少なくても、数行のコードでプロ仕様のエージェントをクラウド上に公開できます。
スターターキットに含まれる主な内容
このキットは主に以下の3つの要素で構成されています。
要素 内容と役割
AgentCore CLI agentcore launch コマンドなどで、AWS上のサーバー(Runtime)やメモリ、セキュリティ設定を自動で構築・デプロイします。Strands Agents SDK エージェントの「脳」を動かすためのオープンソースSDK。Claude 3.5やNovaなどのLLMを使い、ツール呼び出しや推論を制御します。
サンプルテンプレート backend.py や requirements.txt の雛形。これを書き換えるだけで、自分の用途に合わせたエージェントがすぐに作れます。
「通常(すべて自前)の開発」と「AgentCoreスターターキット + Strands」を使用した場合の比較解説します。
一言でいうと、通常の開発は「材料集めとキッチン作りから始める料理」ですが、スターターキットは「最新設備の整った厨房で、レシピ通りに作る料理」のような違いがあります。
① 開発スピードと手間の比較
通常の開発では、AIの「脳」を作る前に「箱(インフラ)」を作る作業が膨大です。
| 項目 | 通常の開発(自前) | スターターキット使用 |
|---|---|---|
| 環境構築 | Docker、サーバー、権限設定を個別に構築。 | agentcore launch 一発で最適環境が完成。 |
| ライブラリ管理 | 各ツールの互換性を自分で検証・修正。 | 公式SDKが最初から最適化されている。 |
| デプロイ | 数日~数週間(インフラ知識が必要)。 | 数分~数時間(Pythonの知識だけでOK)。 |
② 運用性能と安全性の比較
個人開発外で使う場合、この「運用面」の差がリスクの違いになります
| 項目 | 通常の開発(自前) | スターターキット使用 |
|---|---|---|
| 実行時間制限 | Lambda等だと15分で強制終了。 | 最大8時間の長時間処理が可能。 |
| セッション分離 | ユーザー間のデータ混入対策を自前実装。 | セッションごとに完全隔離された安全な環境。 |
| 監視(デバッグ) | ログを自前で集計・解析。 | 思考プロセスが自動で可視化される。 |
| 認証管理 | APIキーの管理を暗号化して自作。 | AgentCore Identity でセキュアに一元管理。 |
③ 機能(賢さ)の拡張性の比較
エージェントに「新しい道具(ツール)」を持たせたい時の柔軟性が違います。
・通常の開発: 新しいツールを増やすたびに、プロンプトを調整し、API接続コードを書き、例外処理を手動で追加します。
・スターターキット: 世界標準の MCP (Model Context Protocol) に対応。Notion、Slack、GitHubなどの公式プラグインを、コードをほぼ書かずに「差し込むだけ」でエージェントが使いこなせます。
通常開発が向いている人:
・AWSを使わない、または完全に独自のサーバー構成にこだわりがある。
・AIの推論ロジック自体を一から研究・開発したい。
スターターキットが向いている人:
・「動くもの」を最速で作って業務に導入したい。
・セキュリティやスケーラビリティ(大人数での利用)を重視する。
・最新のClaude 3.5やAmazon Novaなどの高性能モデルを、最高の環境で使いこなしたい。
設定ファイルの自動生成
以下のコマンドを実行し、設定プロセスを開始します。
agentcore configure
対話形式で質問されますが、以下以外はすべて Enter で OK です。
Entrypoint:backend.py と入力。Existing memory resources found:ステップ2で作成したメモリーの番号(例:[1] など)を入力。
ランタイムのデプロイ
以下のコマンドで、ECR、CodeBuild、AgentCoreランタイムなどのAWSリソースが自動で作成され、デプロイが開始されます。
agentcore launch
デプロイ完了まで数分かかります。完了後、Runtime ARN が出力されるので、これを控えておきます。
デプロイされたAPIサーバーをテストするための簡単なWebインターフェース(Streamlitを利用)を作成します。
元の階層に戻る
cd ../
frontend.py の作成
frontend.py を作成し、以下のコードをコピー&ペーストします。
touch frontend.py
frontend.py の内容:
# 必要なライブラリをインポート
import os, boto3, json
import streamlit as st
# サイドバーを描画
with st.sidebar:
# デプロイ後に得られたAgentCoreランタイムのARNを入力
agent_runtime_arn = st.text_input("AgentCoreランタイムのARN")
# タイトルを描画
st.title("AWS環境運用支援エージェント")
st.write("Strands AgentsがMCP(AWSドキュメント)とLTM(社内ナレッジ)を使って運用を支援します!")
# チャットボックスを描画
if prompt := st.chat_input("質問を入力してください(例:IAMポリシーの最小権限原則のベストプラクティスを教えて)"):
# ユーザーのプロンプトを表示
with st.chat_message("user"):
st.markdown(prompt)
# エージェントの回答を表示
with st.chat_message("assistant"):
try:
# AgentCoreランタイムを呼び出し
agentcore = boto3.client('bedrock-agentcore')
payload = json.dumps({"prompt": prompt})
response = agentcore.invoke_agent_runtime(
agentRuntimeArn=agent_runtime_arn,
payload=payload.encode()
)
# ストリーミングレスポンスの処理
container = st.container()
text_holder = container.empty()
buffer = ""
for line in response["response"].iter_lines():
if line and line.decode("utf-8").startswith("data: "):
data = line.decode("utf-8")[6:]
# 文字列コンテンツの場合は無視
if data.startswith('"') or data.startswith("'"): continue
# 読み込んだ行をJSONに変換
event = json.loads(data)
# ツール利用を検出
if "event" in event and "contentBlockStart" in event["event"]:
if "toolUse" in event["event"]["contentBlockStart"].get("start", {}):
# 現在のテキストを確定
if buffer:
text_holder.markdown(buffer)
buffer = ""
# ツールステータスを表示
tool_name = event["event"]["contentBlockStart"]["start"]["toolUse"].get("name", "unknown")
container.info(f"🔍 {tool_name} ツールを利用しています")
text_holder = container.empty()
# テキストコンテンツを検出
if "data" in event and isinstance(event["data"], str):
buffer += event["data"]
text_holder.markdown(buffer)
elif "event" in event and "contentBlockDelta" in event["event"]:
buffer += event["event"]["contentBlockDelta"]["delta"].get("text", "")
text_holder.markdown(buffer)
# 最後に残ったテキストを表示
text_holder.markdown(buffer)
except Exception as e:
st.error(f"エラーが発生しました: {e}")
Streamlitの実行
StreamlitはPythonだけでデータ分析アプリやAIアプリのフロントエンド(画面)を爆速で構築できるオープンソースのフレームワークです。
今回はAIエージェントの仕様を簡単に確認・実行するために使用します。(本番実装向きではありません)
pip install streamlit
streamlit run frontend.py
CodeSpacesのポップアップに従ってブラウザでアプリを開くか、ターミナルに表示されたURLにアクセスします。
動作確認
アプリのサイドバーに、ステップ4で控えたRuntime ARNを貼り付けます。
以下の質問をして、MCPClientの利用(AWSドキュメント検索)とステアリングが効いているか確認します。
ちゃんと危険と記述してくれていますね。
デプロイ後、LTMに社内固有のナレッジを「記憶」させることで、提案されたLTMの役割(過去の障害対応検索)を実現します。
LTMにナレッジを投入
Streamlitのチャットで、具体的な過去の事例をエージェントに教え込みます。
例: 「先月、NATゲートウェイの誤った設定でコストが急増した。解決策は、夜間はAWS Lambdaで停止する仕組みを導入したことだ。」
LTMの検索テスト
ナレッジ投入後、LTMが検索される質問をします。
例: 「私が以前話したNATゲートウェイのコスト問題について、解決策はなんだったか?」
(LTMが有効になっていれば、過去のエピソードを踏まえた回答が得られるはずです。)
エピソード記憶がちゃんと実装できている事も確認できましたね。
これで、AWSの公式ドキュメントとナレッジの両方を活用し、ポリシーで制御された「AWS環境運用支援エージェント」が完成します。
開発経験はまだ浅いですが、メモリー機能を備えた簡易的なエージェントを構築することができました。
難しい言語での作業が少なく約1時間と短い時間で構築でき、今後の開発速度効率化にとても期待できました。
今後は環境操作などの機能を追加して、完全自動化を実現する「ローカル版Kiro」のような仕組みを作ってみたり、 これまではPythonで実装してきましたが、アップデートによりTypeScriptでも実装可能になったため、複数言語での開発にも挑戦してみたいなーって思います。
年末に向けてPCもお部屋も大掃除しなくてはです。
それでは皆さん良いお年を〜
本記事は TechHarmony Advent Calendar 2025 12/25付の記事です。 |
こんにちは、SCSK木澤です。
12/1から続けてきた今年のアドベントカレンダーも、ついに今日でラストですね。
本日発信される記事で、合計25日間で33記事が発信されたかと思います。
年末の忙しいさなか、お読み頂いた皆様、発信いただいた寄稿者の方々ありがとうございました。
さて今年のアドベントカレンダー、私は他のテーマの検証が完了しませんでしたので、今年はAmazon SESの小ネタを発信したい思います。
私は10年ほど前まで、色々なお客様のシステム開発や保守を担当していました。
その中で、メール誤送信の事故を見かけたことがありました(大量ではないですが)
結構ありがちなのが、開発中のシステムやリリース後においては開発/検証環境など、本番環境以外からの誤送信で、テスト実施の際に不必要な宛先にメールが送信されてしまった、というケースです。
とはいえ、本番環境以外においてもシステムの動作検証・テストとして全くメールを出さない訳にもいかないことがあります。
そうした場合、メール中継をするMTA(postfix等)において、不必要な宛先への送信をブロックする設定を行うことが事故防止のため望ましく、そのような実装をよく行っていました。
AWSにおいてはAmazon SESを送信用のMTAとして用いることがベストプラクティスとなるかと思います。
Amazon SESにおいて送信の制限には、送信承認ポリシーによって行うことができます。
Amazon SESコンソール、設定内-IDをクリックし、検証済み(であることが前提ですが)IDの設定に入ります。
「承認」タブより承認ポリシーの作成に入ります。
今回はカスタムポリシーから作成しました。
ポリシードキュメントは以下のようにします(AWSアカウントはマスクしています)
この設定では、 [email protected] 宛のメールのみ送信を許可するように設定しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "stmt1766585448102",
"Effect": "Deny",
"Principal": "*",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "arn:aws:ses:ap-northeast-1:123456789012:identity/scsk.jp",
"Condition": {
"ForAnyValue:StringNotEquals": {
"ses:Recipients": "[email protected]"
}
}
}
]
}
本ポリシーを設定し、適用します。
ID画面上の「テストEメールの送信」をクリックします。
許可されていない宛先を指定すると、下記のようにアクセス権がないというエラーが発生するはずです。
今回はAmazon SESの小ネタをご紹介させていただきました。
開発/検証環境のメール環境においては、転ばぬ先の杖ということで必ず設定しておきましょう。
私は今年最後の投稿になるかもしれませんが、来年もTechHarmonyエンジニアブログ共、引き続きご愛顧の程よろしくお願いします。
皆様の2026年が良い年になりますように。今年もありがとうございました。
こんにちは。SCSKの末本です。
本記事では、AWSで構築しているシステムの保守運用をする中で発生した事象と、その解決策についてご紹介します。
今回のシステムは、Amazon Elastic Container Service(以下 ECS)を利用しており、1タスクで複数のコンテナを構成する環境です。
発生した事象は、AWS_ECS_TASK_PATCHING_RETIREMENT によって ECS のタスクが生まれ変わる際、クライアントからのアクセスに対して一時的に HTTP 503 エラーが返されたというものです。
今回のシステム構成と、問題についてご説明します。
AWS が ECSのパッチ適用をするため、ECSタスクの入替(新しいタスクを起動し、古いタスクを停止)が行われます。
この流れの中で、タスクがリクエストを受け付ける準備が整う前に、クライアントからアクセスされてしまうという問題が発生しました。
ご参考:Amazon ECS タスクライフサイクル – Amazon Elastic Container Service
今回の問題は、ロードバランサーのヘルスチェック(Apacheのポートをチェック)がOKでも、タスク内の コンテナ間の依存関係 が考慮されていなかったため、サービスが利用可能な状態になる前にアクセスされてしまったことです。
この問題を解決するために、ECSタスク定義内の dependsOn プロパティとコンテナヘルスチェックを組み合わせて設定しました。
これにより、コンテナ間の起動順序と、次のコンテナが起動を開始するための 条件 を定義できます。
dependsOn パラメータの意味については以下の通りです。
| 設定値(条件) | 意味 |
|---|---|
| START | 依存するコンテナの起動開始後、実行 |
| COMPLETE | 依存コンテナの実行が完了(終了)後、実行 |
| SUCCESS | 依存コンテナの実行が正常終了後、実行(exit code:0) |
| HEALTHY | 依存コンテナに定義した healthcheck に合格後、実行 |
| コンテナ | 依存設定 | 設定値(条件) | 内容 |
|---|---|---|---|
| tomcat | (なし) | – | 依存関係なしのため、まず最初に起動する。 |
| web(Apache) | tomcat | HEALTHY | tomcat がアプリケーションレベルで完全に起動し、 サービス可能になるまで待機する。 |
| log | web(Apache) | HEALTHY | web コンテナのプロセス起動が確認されてから、 ログ転送を開始する。 |
単に START(コンテナプロセスが起動)を待つだけでは、アプリケーションの初期化時間などを考慮できません。
この問題を解決するために、tomcat コンテナのタスク定義内に コンテナヘルスチェック を設定し、web(Apache)コンテナおよび log コンテナの dependsOn 設定で、HEALTHY 条件を指定しました。
// ECSタスク定義(コンテナ定義の抜粋イメージ)
"containerDefinitions": [
{
"name": "tomcat",
// ... 他の設定
// Tomcatがサービス可能であることを確認するコンテナヘルスチェック
"healthCheck": {
"command": [
"CMD-SHELL",
"curl -f http://localhost:8080/status || exit 1"
],
"interval": 30, // 30秒ごとにチェック
"retries": 3, // 3回失敗したらUNHEALTHY
"startPeriod": 10, // 起動直後の10秒間はヘルスチェックの失敗を無視(猶予期間)
"timeout": 6 // タイムアウトは6秒
}
},
{
"name": "web",
// ... 他の設定
// webコンテナはtomcatがHEALTHY(サービス可能)になるまで起動を待機
"dependsOn": [
{
"containerName": "tomcat",
"condition": "HEALTHY" // ここが重要!
}
]
},
{
"name": "log",
// ... 他の設定
// logコンテナはwebがHEALTHY(サービス可能)になるまで起動を待機
"dependsOn": [
{
"containerName": "web",
"condition": "HEALTHY" // ここが重要!
}
]
}
]
上記の設定により、今回の事象は解決し、ECSタスクのパッチ適用時に503エラーが出なくなりました。
ロードバランサーのヘルスチェックは、外部から特定のポートが応答しているかを確認するもので、タスクへのトラフィックを流すかどうかを判断します。
しかしマルチコンテナタスクでは、「ポートが開いている」ことと「アプリケーションがリクエストを処理する準備ができている」ことは同義ではありません。
ECSタスクの設計において、各コンテナの起動順序を意識して設計しなければ、今回のようなコンポーネント間の疎通エラーを招きます。
以下のように、役割に応じて依存関係を定義することが、システムの信頼性を高めると学びました。
Tomcat などの Javaアプリケーションは、プロセス起動からリクエスト処理可能になるまでに数十秒かかることがあります。
dependsOn パラメータで HEALTHY を使う場合、tomcat コンテナのヘルスチェック定義に startPeriod(起動猶予期間)を設定することで、コンテナが起動直後の不安定な状態で即座に失敗と見なされるのを防ぐことができます。
AWS ECSのタスク入れ替え時の503エラーは、一見するとシンプルなネットワークエラーに見えますが、その裏には「複数コンテナの非同期起動」という本質的な課題が隠れていました。
最後までお読みいただきありがとうございました!
]]>こんにちは、SCSKの前田です。
いつも TechHarmony をご覧いただきありがとうございます。
LifeKeeperを導入し、システムの高可用性を実現する上で、アプリケーションリソースの保護は非常に重要な要素です。しかし、アプリケーションARKは、その特性ゆえに、設定のわずかな見落とし、予期せぬ通信障害、そしてバージョンアップによる仕様変更など、多岐にわたる要因で『困った』事態に直面することがありますよね。
本連載企画「LifeKeeper の『困った』を『できた!』に変える!サポート事例から学ぶトラブルシューティング&再発防止策」では、まさにそんな「なぜかアプリケーションが切り替わらない」「エラーが出て起動できない」といった、LifeKeeper運用の現場で実際に発生した問い合わせ事例を基に、トラブルの原因、究明プロセス、そして何よりも『再発防止策』に焦点を当てて深掘りしていきます。今回の第三弾では、アプリケーションARK特有の「落とし穴」に焦点を当て、その解決と再発防止の鍵を探ります。
LifeKeeperの心臓部とも言えるアプリケーションリソースの保護は、システムの高可用性を実現する上で不可欠です。専用ARKから汎用ARKまで多岐にわたりますが、その複雑さゆえに設定ミスや連携アプリケーション側の要因で予期せぬトラブルが発生しがちです。 本記事では、LB Health Check、MySQL、IIS、そしてGeneric ARKを用いたJP1/Baseのリソース構築・運用で実際に発生したサポート事例を元に、アプリケーションARK特有の「落とし穴」を深掘りします。 通信障害、バージョン間の仕様変更、ホスト名の制約、スクリプトの依存性など、様々な角度から原因と対策を学ぶことで、アプリケーションの安定稼働と再発防止につなげるヒントを提供します。
その他の連載企画は以下のリンクからどうぞ!
lbhcリソース作成中にエラー(140251)が発生する、LB Health Checkリソース作成時のエラーについて
MySQLリソース作成時のエラーについて
IISリソース拡張前処理スクリプト実行時のエラーメッセージについて
Generic ARK リソース (JP1/Base)における quickCheck の仕組みについて
本記事では、LB Health Check、MySQL、IIS、Generic ARKといったアプリケーションリソースに関連する様々なトラブル事例を取り上げました。
これらの事例から、アプリケーションARKの安定稼働には、LifeKeeper本体やARKの仕様への深い理解に加え、連携するOSやアプリケーションの設定、そして基盤となるネットワーク通信環境の綿密な確認が不可欠であることが明らかになりました。
特に、OSやLifeKeeperのバージョンアップに伴う仕様変更への追従、設定ファイル記述ルールへの注意、そしてGeneric ARK利用時のスクリプト内容への詳細な把握が、トラブルを未然に防ぐ鍵となります。 日々の運用でこれらの点を意識し、公式ドキュメントの活用と検証を徹底することで、「困った!」を「できた!」に変え、より堅牢なクラスタ環境を構築・維持できるでしょう。
次回の連載では、「クラスタの予期せぬ停止を防ぐ!ネットワーク構成のトラブルシューティング」と題し、LifeKeeper環境におけるネットワーク関連のトラブル事例とその解決策、安定稼働のためのベストプラクティスを深掘りします。どうぞご期待ください!
]]>こんにちは。SCSKの井上です。
運用効率化を実現するためには、収集したデータを適切に可視化し、現状を一目で把握できる仕組みが重要です。New Relicでは、テンプレートを使って簡単にダッシュボードを構築できます。この記事で、New Relicで収集したデータの可視化方法を習得し、運用効率化につながる一助になれば幸いです。
ダッシュボード機能を活用し、CPU使用率やメモリ、レスポンスタイム、エラー率などの指標をグラフ化し、折れ線グラフで時系列の変化を表示すれば、リアルタイム監視に役立ちます。また、しきい値を設定し、異常値を色分けすることで、問題の早期発見が可能です。NRQL(New Relic Query Language)を用いることで、柔軟なカスタムチャートも作成できます。収集したデータを関連付けてオブザーバビリティを実現するためにも、ダッシュボードを使って可視化することが運用効率化の鍵になってきます。どんな作り方があるのか、どのように活用していけばよいかを解説してきます。
目的が曖昧なまま作成されたダッシュボードは、利用されずに陳腐化してしまいます。そのため、ダッシュボードを作成する際には、「誰が」「何を判断するためのものか」を明確にすることが不可欠です。たとえば、運用担当者であれば障害検知やリソース使用率の監視、マネージャー層であればコスト管理やSLA遵守、経営層であればビジネスインパクトの確認といったように、利用者ごとに必要な指標は異なります。
| 利用者 | 判断すること | 指標例 |
| 運用担当者 | サーバ・アプリが正常稼働しているか 障害や異常の有無 |
CPU・メモリ使用率 レスポンスタイム エラーレート アラート件数 |
| マネージャー層 | SLA遵守状況 コストが予算内か |
稼働率 クラウド利用料 リソース消費量 |
| 経営層 | 技術的問題のビジネス影響 売上やUXへのインパクト |
トランザクション数 国別、曜日ごとのアクセス数 |
| 開発チーム | 新機能リリース後のパフォーマンス ボトルネック特定 |
APIレスポンスタイム DBクエリ遅延 エラーログ |

エリアチャートやラインチャートのような時系列可視化、バーやパイチャートによるカテゴリー比較、ビルボードやブレットによる重要KPIの強調表示など、New Relicのダッシュボードではデータの性質に応じて最適な視覚化手法を選ぶことができます。
| チャートタイプ | 用途 | 具体例 |
| Area | 単一属性の時系列推移を可視化 | ・トラフィック量の増減 ・レスポンス量の変化 |
| Bar | カテゴリ間の合計値を比較 | ・API別リクエスト数比較 ・エラー種別件数の比較 |
| Billboard | 単一の重要指標(KPI)を強調表示 | ・エラー率のモニタリング ・レスポンスタイムの重要KPI表示 |
| Bullet | 実績値と目標値(Limit)の比較 | ・SLA達成状況の表示 ・KPIが目標にどれほど近いか確認 |
| Funnel | 連続するプロセスの減少を表示 | ・ユーザー遷移(訪問→購入) ・処理ステップの離脱分析 |
| Heatmap | 値の分布・密度を色で可視化 | ・遅延の集中箇所の特定 ・ログ頻度やデータ密度の確認 |
| Histogram | データの分布(どの範囲が多いか)を把握 | ・レスポンス時間の偏り分析 ・負荷データの分布確認 |
| JSON | クエリ結果を JSON のまま表示 | ・開発者向けの詳細ビュー |
| Line | 複数系列の時系列推移の比較 | ・CPU/メモリの変動確認 ・エラー件数の推移分析 |
| Pie | 全体に対する割合を表示 | ・エラー種別割合 ・ユーザーOS/デバイス割合 |
| Stacked Bar | 合計値と内訳を同時に表示 | ・サービス別トラフィック内訳 ・エラー構成比+総量 |
| Table | データを一覧形式で表示 | ・FACET結果のランキング ・詳細データ比較、ログ確認 |
ダッシュボードは主に次の3つの方法で作成できます。それぞれの方法について解説します。New Relicを使い始めた場合は、テンプレートから作成するか、既存のメトリクスデータを参考にNRQLの構成を理解した上で、カスタムダッシュボードを作成すると理解を深められます。
ダッシュボードを作り始める前に、ダッシュボードの編集や公開操作の権限の種類について確認します。以下、3つの種類が用意されています。編集は自分自身だけに限定したい、ダッシュボードが作成途中のため、完成してから公開したいなどの場合に、適切に選択することができます。
| Permissions設定 | 説明 |
| Edit – everyone in account | アカウント内のすべてのユーザーがダッシュボードを編集できます。 |
| Read-only – everyone in account | アカウント内のすべてのユーザーがダッシュボードを閲覧のみできます。編集や削除は作成した自身のみに制限されます。 |
| Private | ダッシュボードは作成者のみが閲覧・編集可能です。完全に非公開の状態です。 |
既存テンプレート100種類以上から目的に合ったダッシュボードを簡単に作成できます。ダッシュボードを作成する際は、New Relicでデータ収集ができている状態から作成することを推奨します。ここでは、すでにInfrastructureエージェントが導入済の状態で手順を進めます。
既存テンプレートから作成したダッシュボードでは、不要なチャートが含まれたり、NRQLの修正箇所が分からずメンテナンスが難しい場合があります。一から作成すれば、必要な情報だけを表示でき、メンテナンス性も向上します。
既にホスト単位やサービス単位で表示されているチャートを個別に追加することで、必要なチャートだけを選択してダッシュボードに組み込むことができます。ダッシュボードを軽量に保ちながら段階的に構築でき、構成を確認しながら進められるため、完成イメージを把握しやすくなります。
ダッシュボードを作成した後、運用効率化のために構成を変更することがあります。ここでは、どのような編集方法があるのか、一例を解説します。ダッシュボードの一覧の横にある★をクリックするとリストのトップに表示されます。よく使うダッシュボードがある場合は、実施を推奨します。お気に入り機能はユーザー個人の設定のため、他のユーザには反映されません。
ダッシュボードの編集は編集したいダッシュボード画面の右上のアイコンから実施します。鉛筆マーク中は編集モードとなり、表示するチャートの幅の変更や表示順の変更などができます。
| ダッシュボードの編集開始は「鉛筆マーク」 | ダッシュボードの編集完了は「Done editing」 |
![]() |
![]() |
タブを使ってチャートを分けることで、表示するデータ量を調整でき、読み込み速度とともに見やすさが向上します。また、「サービス別」「環境別」「機能別」など、目的に応じてタブを構成することで、必要な情報へ簡単にアクセスできるようになります。
| 1.編集したいダッシュボードの右上の「鉛筆マーク」をクリックします。 | 2.鉛筆マークをクリック後、「Add Page」をクリックします。 | 3.タブの名前を入力し、「Add page」をクリックします。 |
![]() |
![]() |
![]() |
| 4.タブが追加されます。 | 5.タブの名前や複製、削除はタブをクリックして行います。 | 【補足】編集終了後は、「Done editing」をクリックします。 |
![]() |
![]() |
![]() |
ダッシュボードの名前を変更したい場合や、完成してからダッシュボードをチーム内に公開したい、作成者以外ダッシュボードの編集をさせたくないなどの運用が発生した場合は、以下の手順にて変更ができます。
| 1.対象のダッシュボードを開き、右上「・・・」から「Settings」をクリックします。 | 2.名前の変更やダッシュボードの編集公開の変更ができます。 |
![]() |
![]() |
ダッシュボードをエクスポートして保存し、後で復元したり、よく使うメトリクスやウィジェット構成をJSON化してテンプレートとして他のプロジェクトに展開できます。JSONの他に、運用レポートとしてダッシュボードをPDFで出力したり、テーブル形式であればCSVとしても出力できます。ここではJSONのエクスポートとインポートを例に解説します。
New Relicではダッシュボードを視覚的にわかりやすく表示させるためのいくつかのオプション(Customize this visualization)が用意されています。これらのオプションを使って、運用効率化につながるダッシュボードをカスタマイズすることができます。Chart typeでグラフの種類も変更することができます。デフォルトで表示されたグラフが見づらい場合は、他のグラフの種類も表示することもできます。グラフの種類によって使えるオプションは異なります。
| 項目名 | 説明 | 実際の画面例・使用例 |
| Y-axis (2) | 異なる単位のデータ比較を同じチャートに表示 | 相関分析をする際に利用。負荷とパフォーマンス、エラーとトラフィックなど。 |
| Other groups | 表示しきれないグループをまとめる | サーバー別にレスポンスタイムをグループ化し、色分け表示。 |
| Legend | 凡例の表示・非表示 | チャート右下に「正常」「警告」「エラー」などの色ラベルが表示される。 |
| Dashboard options | 時間の固定 | ダッシュボード上部にあるタイムピッカーで選択された時間範囲を無視し、チャートごとに固定の時間範囲を設定。 |
| Colors | チャートの色をカスタマイズ | エラー率が高いと赤、正常なら緑など、しきい値に応じて色が変化。 |
| Units | 数値の単位を設定 | レスポンスタイムを「ms」、データ転送量を「MB」で表示。 |
| Thresholds | しきい値を設定して色やアラートを変更 | エラー率が5%を超えるとチャートが赤くなる設定等。 |
| Markers | 特定のイベントを示す縦線などを追加 | デプロイ日時に縦線を追加し、パフォーマンス変化を視覚的に確認。 |
| Null values | nullデータの表示方法を設定 | データがない時間帯をグレーで表示、またはゼロとして扱う設定。 |
| Tooltip | カーソルを合わせたときの詳細表示 | 「2025/12/01 14:00 – CPU使用率:75%」などのポップアップが表示される。 |
| Initial sorting | テーブルがどの列を基準に、どんな順番で並ぶか を指定する設定 | テーブルを開いた瞬間に、確認したい順序で見たい場合。 |
| Billboard settings | 数値を大きく強調する | KPI や重要なメトリクスに使う場合など。 |
Y-axis(2)で単位が違うデータを一つのグラフでそれぞれ軸の単位を変更することでわかりやすく表示します。
![]() |
Other groupsで表示しきれない下位グループをまとめて1つのグループとして表示します。
![]() |
Legendで凡例の表示非表示を設定することができます。
![]() |
Dashboard options(Ignore time picker)で NRQLで指定した期間 または ダッシュボードのデフォルト期間のみに固定します。TVモード(画面右上の鉛筆マークの横)で常時表示させる際に組み合わせて使用するケースを想定しています。
![]() |
Colorsで指定した色に変えることができます。Consistentは常に色は固定、Dynamicは値の変化(傾向)によって色が変わる設定になります。
![]() |
Unitsで軸の単位を表示することができます。
![]() |
Thresholdsを用いることで、閾値設定したWarningやCriticalがどのラインに達した場合かを視覚的にわかるようになります。
![]() |
Markersでデプロイや変更箇所のイベントがあった時間帯を示すことができます。
Null valuesでデータが欠損している場合のグラフの表示の仕方を調整することができます。
![]() |
| オプション | 意味 | 使用シーン(活用例) |
| Leave as null (default) | データが存在しない部分は空白のままにする(初期設定) | 一時的なデータ欠損を視覚的に確認したいとき。例:ネットワーク障害の影響を見たい場合。 |
| Remove | Null値のデータポイントを完全に除外する | 欠損データが分析に不要な場合。例:平均値計算に影響を与えたくないとき。 |
| Preserve the last value | 最後の有効な値を保持し、Null部分に適用する | データが途切れても継続的な傾向を見たいとき。例:CPU使用率が安定しているかを確認したい場合。 |
| Transform into 0 | Null値を「0」として扱う | 欠損をゼロとして扱うことで、チャートの連続性を保ちたいとき。例:トラフィックが完全に停止したことを示したい場合。 |
グラフ内のエンティティが多い際に、どのエンティティを指しているのかをカーソルを合わせることでわかるようになります。

初めから並び順を固定したい場合は、このオプションを使います。テーブルのカラム名をクリックすることで都度順序の並び替えも可能です。
![]() |
数字を強調させるために配置や大きさなどを設定することができます。URLを記載することで、チャートをクリック後に、該当のURLへアクセスすることも可能です。
![]() |
| 項目 | 意味 |
| Display mode | 値やラベルの表示方式を選ぶ(Auto, Value only, Label only 等) |
| Alignment | テキストの配置 |
| Value size | 数値の文字サイズ |
| Label size | ラベルの文字サイズ |
| Columns amount | ビルボード表示の横幅(並べる列数の調整) |
| Title | リンクの表示名 |
| Url | リンク先 URL |
| Open in a new tab | 新しいタブで開くかどうか |
作成したダッシュボードの見方や問題が発生した際のエスカレーション手順リンクなどの情報をダッシュボード内に表示することができます。必要な判断材料や対応手順を一元的に確認でき、トラブル発生時の対応スピード向上に貢献できます。また、ダッシュボードに簡単な操作ガイドやFAQを表示することで、新しいメンバーでも迷わずダッシュボードを確認することができます。作成して形骸化させないためにも、本機能を使って運用効率化を促進していきたいですね。
ダッシュボードを作成する際の基本の考え方が整理されています。扱う指標を選定し目的に沿った情報配置を計画し、次に内容を一目で状況が理解できるようにレイアウトへ落とし込みます。そして、適切なチャート選択や文脈づけ(ラベル・単位・比較軸の明確化)を行い、情報の流れが変化 → 理由 → 行動として読み解けるように仕上げるプロセスが示されています。
| Step | 内容 | 目的 / 要点 |
| 1. 目的と質問の明確化 | ダッシュボードで答えるべきビジネス質問を定義する | 何を判断するための画面か?を明確にすることで、情報過多を防ぐ |
| 2. KPIと必要データの選定 | 目的に直結する少数の指標を選ぶ | データは収集→整形→モデリング→変換→可視化で準備する |
| 3. ストーリーライン設計 | 現状 → 変化 → 要因 → アクションの流れを組む | 何が起きたかを短いストーリーとして理解させる |
| 4. 図表(チャート)選定 | トレンド、比較、構成比など目的に合う可視化を選ぶ | 折れ線=トレンド、棒=比較、円/ドーナツ=構成比など |
| 5. レイアウト設計 | 視線の動きに合わせて情報を配置する | 上:要点、中央:変化、下:詳細/原因。1画面で把握できる構成にする |
| 6. ラベル・単位・文脈の明確化 | タイトル・単位・比較軸を明確にする | 誤解を防ぎ、意図を瞬時に伝えるために重要 |
| 7. ユーザーテストと改善 | 実際の利用者に見てもらい改善する(プロトタイピング) | ユーザー理解と反復改善が成功の鍵。多くの失敗は会話不足が原因 |
| 8. 継続的メンテナンス | KPI見直し、データ更新、自動化などの運用改善 | ダッシュボードは作って終わりではなく継続的に最適化する |
ダッシュボードを作成し、チーム間で共通の指標を共有することで、意思決定のスピードが向上します。ダッシュボードを確認して、実際にどうしなければらないのか、行動につながる設計を行い、継続的に改善することで、運用効率に貢献することができます。たとえばダッシュボードを作成を作成することで以下のような活用ができます。
様々な視点からダッシュボードを作成できますが、ここでは以下の視点に基づいて目的と指標を整理しました。
| 視点 | 目的 | 主な指標 |
| インフラ | サーバ・クラウドリソースの監視 | CPU使用率、メモリ使用率、ディスクI/O、ネットワーク帯域、ホスト稼働率 |
| アプリ | ユーザー体験可視化、ボトルネック特定 | Apdexスコア、平均レスポンスタイム、エラー率、外部サービス呼び出し時間(API) |
| コスト | クラウド利用料やリソース消費の最適化 | クラウドサービス別コスト、データ転送量、New Relic有償アカウント数 |
| セキュリティ | 不正アクセス検知や脆弱性管理 | ログイン失敗回数、異常IP、セキュリティ関連アラート件数、CVE件数、 |
| ビジネス | 意思決定支援 | トランザクション数、ユーザーセッション数、曜日ごとのページ訪問数 |
2025年最後の記事は、New Relicに送信したデータをダッシュボードでどのように可視化し、運用に活かすか、設計の考え方も含めて紹介しました。ダッシュボードとNRQLを使いこなすことで、監視だけでなく、トレンド分析や異常検知、ビジネス指標の把握など、データ活用の幅が大きく広がります。この記事が、効率的な運用や意思決定のスピード向上に向けた第一歩となり、今後の改善や最適化に役立つ一助になれば幸いです。
SCSKはNew Relicのライセンス販売だけではなく、導入から導入後のサポートまで伴走的に導入支援を実施しています。くわしくは以下をご参照のほどよろしくお願いいたします。
]]>前回の記事では、取り組みの背景や概要をご紹介しました。今回は、ツールを開発するにあたり検討した要件定義についてお話しします。
今回のツールは、AWS環境の設計・構築に関わるメンバーが、構築フェーズ完了後にパラメータシートを効率的に作成することを目的としています。従来は、AWSコンソールを開き、設定値を目視で確認しながらExcelに転記するという作業が必要でしたが、この工程は非常に時間がかかり、ヒューマンエラーのリスクも高いものでした。
そこで、要件定義では「誰が」「どのような場面で」「どのような目的で」このツールを使うのかを明確化しました。
業務要件で明確化した利用目的をもとに、ツールに必要な機能を整理しました。ここでは、どのような入力を受け取り、どのような出力を行うのか、さらに抽出する情報の方針について検討した内容を詳しく説明します。
まず、どのような入力を受け取るか検討しました。
| 案 | 方式 | メリット | デメリット | |
| 案① | AWS CLI describe の結果JSON(構築後取得) |
|
|
〇採用 (正確性・汎用性重視) |
| 案② | CloudFormationテンプレート(構築時の宣言) |
|
|
×不採用 (実環境との差異リスク) |
次にどのような出力を行うのか検討しました。
| 案 | 方式 | メリット | デメリット | |
| 案① | Excel(.xlsx) |
|
|
〇採用(納品適合性) |
| 案② | CSV |
|
|
×不採用 |
| 案③ | Markdown |
|
|
×不採用 |
AWSリソースのパラメータをどの範囲で抽出するかについても検討しました。
| 案 | 方式 | メリット | デメリット | |
| 案① | 必要な情報のみ抽出 |
|
|
×不採用 |
| 案② | すべてのパラメータを出力 |
|
|
〇採用 (正確性・汎用性重視) |
最終的に、ツールは以下の機能を備えることを目指しました。
今回の取り組みを通じて、業務改善の重要性を改めて実感しました。パラメータシート作成の自動化は、単なる効率化にとどまらず、品質の一貫性やヒューマンエラー防止にも大きく貢献できることがわかりました。一方で、アプリケーション開発の知見不足から、設計や要件定義で試行錯誤を重ねる場面もありましたが、その経験自体がチームの成長につながったと感じています。
このツールにはまだ改善の余地がありますので、今後も継続的に改良を重ね、より使いやすく、業務に役立つものにしていきたいと思います。
というわけで、私の投稿はここまでです!
次回は齋藤さんにバトンタッチしますので、ぜひお楽しみに!
みなさん、こんにちは。SCSKの津田です。
LifeKeeper は、オンプレミスの物理サーバから仮想基盤、各種クラウドサービスまで、幅広い環境で導入・運用できる高可用性クラスタソフトウェアです。
SIOSによると、近年ではクラウド環境への導入が全体の約半数を占めるまでに拡大しており、当チームでも設計・構築案件の多くがクラウド基盤上で展開されています。
とはいえ、多くの企業システムでは今なおオンプレミス環境が主軸として稼働しており、物理サーバや仮想基盤で LifeKeeper を利用したいというニーズも依然として高い状況です。
そこで本記事では、仮想環境においてLifeKeeperを導入する上で押さえておきたいポイントをご紹介します。
仮想環境での冗長化をご検討中の方は、ぜひご確認ください!
仮想環境で構成できるHAクラスター構成の基本パターンは以下となります。
共有ストレージが使えない環境では、データレプリケーション構成にすることが可能です。
| 構成①:共有ストレージ構成 | 構成②:データレプリケーション構成 | 構成③:データレプリケーション構成 (WSFCとの組み合わせ) |
![]() |
![]() |
|
※HAクラスター構成の他にSSP(Single Server Protection)構成も可能。
LifeKeeperを導入することで、以下のような幅広い障害を検知し、自動復旧(フェールオーバー)によるサービス継続が可能となります。
・アプリケーション障害
・ゲストOS障害
・仮想マシン障害
・仮想化ソフトウェア(ハイパーバイザ)障害
・物理ホスト障害
・ネットワーク障害(物理ホスト間のすべての通信経路断絶時)
※ゲストOS障害~ネットワーク障害までの範囲については、コミュニケーションパスが全て断たれた場合にノード障害として検知します。
上記の通り、物理ホストの障害にはもちろん、仮想マシンやアプリケーション単位の障害にも柔軟に対応できるため、仮想環境ならではの冗長性を最大限に活かすことができます。
特にVMwareの「vSphere HA」と比較した場合、ESXiホスト障害時にはLifeKeeperの方が障害検知から復旧までの時間が短いというメリットがあります。(LifeKeeperでは、待機系ESXiホストがあらかじめ起動状態で待機しているため、再起動が必要となるvSphere HAよりも迅速なフェールオーバーが可能。)
なお、リソースの監視や障害検知の方法については、仮想環境特有のものではなく、クラウド環境や物理環境と同様の仕組みを採用しています。
昨今Broadcom社によるVMwareの買収を受けて、VMware以外の仮想環境(ハイパーバイザ)を選択されるケースも増加傾向にあります。LifeKeeperでは、VMware以外の仮想環境にも対応していますので、お客様のニーズに合わせた仮想環境で高可用性構成を実現できる点も強みとなります。
本項ではLinux/Windows毎の最新サポート状況(Ver10)や留意事項をご紹介します。
LifeKeeper for Linuxでサポートされる仮想環境(ハイパーバイザ)は下記の通りとなります。
| 仮想環境 | バージョン |
| VMware vSphere | 7.0, 8.0, 8.0U1, 8.0U2, 8.0U3 |
| VMware Cloud on AWS | SDDC 1.19以降 |
| KVM | RHEL 8.10以降およびRHEL 9.0以降、ならびにOracle Linux(RHCK/UEK)8.10以降およびOracle Linux 9.0以降のバージョンのみをサポートし、その他のディストリビューションは対象外です。 |
| Nutanix Acropolis Hypervisor (AOS) | 6.10, 7.0, 7.3 |
| Hyper-V | Windows Server 2022 |
| Red Hat OpenShift Virtualization | 4.17以降 |
※仮想マシン上で使用できるOSついては下記をご確認ください。
オペレーティングシステム – LifeKeeper for Linux LIVE – 10.0
サポート対象の各仮想環境に依存した制限や詳細な留意事項については、下記リンクの 「使用環境に関する制限・留意事項」 セクションをご確認ください。
仮想化環境 – LifeKeeper for Linux LIVE – 10.0
また、仮想環境として採用されることの多い VMware vSphere や Hyper‑V については、サイオステクノロジー社より個別の構成ガイドが提供されています。各ハイパーバイザでの構成例や特有の注意点が詳細にまとめられていますので、設計時には必ず確認することを推奨します。
▼ VMware vSphere
LifeKeeper for Linux 仮想環境構成ガイド (VMware vSphere編) – SIOS LifeKeeper/DataKeeper User Portal
[Linux][Windows]VMware vSphere環境でRDM使用時のLifeKeeperサポート構成について – SIOS LifeKeeper/DataKeeper User Portal
▼ Hyper‑V(Linux / Windows 共通)
LifeKeeper 仮想環境構成ガイド (Hyper-V編) – SIOS LifeKeeper/DataKeeper User Portal
LifeKeeper for Linuxでクラスタの共有データ領域を利用する際の構成については、以下をご参照ください。
[Linux]クラスターの共有データ領域として利用できる構成 – SIOS LifeKeeper/DataKeeper User Portal
なお、LifeKeeper for Linuxでは、共有ストレージの認定が行われています。複数ノードで同一データを参照する共有ストレージ(SCSI / FC / iSCSI / SASなど)は、SCSI-2/3 ReservationによるI/Oフェンシングを前提としており、認定されたストレージを使用する必要があります。認定ストレージの一覧は、以下のリンクにある表を展開してご確認ください。
共有ストレージ – LifeKeeper for Linux LIVE – 10.0
一方、以下の構成についてはストレージ認定が不要です。
・NASストレージ(Recovery Kit for NASが必要)
・DataKeeperによるデータレプリケーションに利用する全てのディスク装置(内蔵/外付けを問いません)
・vSphere上でVMDK ARKにより保護される共有ストレージ上の仮想ディスク
・以下の条件をすべて満たす環境で利用するストレージ(Any Storage)
① OS・ハードウェア・プラットフォームでサポートされているストレージであること
② LifeKeeperのSCSI Reservation機能をオフにすること
③ LifeKeeperのQuorum/Witnessによるフェンシング機能を利用すること
LifeKeeper for Windowsでサポートされる仮想環境(ハイパーバイザ)は下記の通りとなります。
| 仮想環境 | バージョン |
| VMware vSphere | 7.0, 8.0, 8.0U1, 8.0U2, 8.0U3 |
| Red Hat OpenShift Virtualization | 4.17以降 |
| KVM | RHEL 8.10以降およびRHEL 9.0以降、ならびにOracle Linux(RHCK/UEK)8.10以降およびOracle Linux 9.0以降のバージョンのみをサポートし、その他のディストリビューションは対象外です。 |
| Microsoft Hyper-V Server | 2016, 2019, 2022 |
| Nutanix Acropolis Hypervisor (AOS) | 6.10,7.0,7.3 |
※仮想マシン上で使用できるOSついては下記をご確認ください。
オペレーティングシステム – LifeKeeper for Windows LIVE – 10.0
サポート対象の各仮想環境に依存した制限や詳細な留意事項については、下記リンクの 「使用環境に関する制限・留意事項」 セクションをご確認ください。
仮想化環境 – LifeKeeper for Windows LIVE – 10.0
また、仮想環境として採用されることの多い VMware vSphere や Hyper‑V については、サイオステクノロジー社より個別の構成ガイドが提供されています。各ハイパーバイザでの構成例や特有の注意点が詳細にまとめられていますので、設計時には必ず確認することを推奨します。
▼ VMware vSphere
LifeKeeper for Windows / DataKeeper Cluster Edition 仮想環境構成ガイド (VMware vSphere編) – SIOS LifeKeeper/DataKeeper User Portal
[Linux][Windows]VMware vSphere環境でRDM使用時のLifeKeeperサポート構成について – SIOS LifeKeeper/DataKeeper User Portal
▼ Hyper‑V(Linux / Windows 共通)
LifeKeeper 仮想環境構成ガイド (Hyper-V編) – SIOS LifeKeeper/DataKeeper User Portal
LifeKeeper for Windowsには、Linuxのようなサイオステクノロジー社による認定ストレージリストは公開されていませんが、標準的なSCSI、FC、iSCSI等の共有ディスクが利用可能です(参考:https://www.windowsservercatalog.com/hardware)。
詳細や制約については、事前にサポートへのお問い合わせを推奨いたします。
また、LifeKeeper for WindowsではAny Storageポリシーは提供されていませんが、Quorum/Witness機能を利用することでスプリットブレインの回避に役立ち、より堅牢な運用が可能となります。
仮想環境では、以下のような仮想環境特有のライセンス利用ルールが設定されていますのでご注意ください。
・一つのライセンスは、一つの占有された物理ホスト上でのみ使用可能。
・異なる物理ホスト間でのみ、クラスター環境を構成可能。
・一つのライセンスで異なるバージョンのLifeKeeperを使用することは不可。
・一つのライセンスには一つのサポートレベルのみ適用可能。
・最低販売数量は2つ(Core 4、2クラスター環境)からとする。
LifeKeeperのインストールおよびクラスター設定は、物理環境と同様の手順で行うことができます。具体的な手順については、オンラインマニュアルをご参照ください。
※IPリソースの監視処理について
仮想環境では、物理的なネットワークスイッチだけでなく、仮想的なネットワークスイッチも存在するため、これらを含めたネットワーク構成全体を十分に考慮する必要があります。
今回は仮想環境においてLifeKeeperを導入する上で押さえておきたいポイントをご紹介いたしました。
多様な選択肢と注意点が存在しますが、その分多様な要件に適した HA 構成を実現できる柔軟性を備えています。
仮想環境でLifeKeeper導入をご検討中の方にとって、少しでも参考となりましたら幸いです。
本記事は TechHarmony Advent Calendar 2025 12/24付の記事です。 |
こんにちは、SCSKでAWSの内製化支援『テクニカルエスコートサービス』を担当している貝塚です。
re:Invent2025の直前に、Network Firewall Proxyという機能のプレビューが開始されました。
リリース記事
ブログ記事

AWS Network Firewallで機能提供していた透過型プロキシではなく、クライアント側で明示的にプロキシサーバとして指定する必要のあるタイプのプロキシです。
私の担当するお客様でも金融業を中心に過去にプロキシサーバの導入を検討された結果EC2でプロキシを構築したり、Network FirewallでのTLS検査を検討されたりしていますので、それらのお客様への導入という視点からNetwork Firewall Proxyの機能を検討してみます。
名前にNetwork Firewallとついていますが、既存のAWS Network Firewallの一機能ではなく、独立したリソースになっているようです。NAT Gatewayとセットで動作し、クライアントは専用のVPCエンドポイント(Proxyエンドポイント)経由でプロキシを使用することになります。
上の図がもっともシンプルな構成ですが、実際に設定してみるとNetwork Firewall Proxyと同じサブネット(パブリックサブネット)に自動的にProxyエンドポイントが作成されることが分かります。同VPC内に既にエンドポイントがあるのに別サブネットにエンドポイントを作る必要性はイマイチ理解できませんが、構成上はどちらでも動作しました。
少し調べてみたところ、こちらのblogではProxyと同じパブリックサブネットにエンドポイントが置かれていたので、そのあたりは好きに設計すればよさそうです。
他のネットワークリソース(Internet GatewayやNetwork Firewallなど)と同様に、Network Firewall Proxyも、複数のVPCのProxy機能をひとつに集約した構成を取ることができます。
そしてここが素晴らしい点なのですが、Network Firewall Proxyの機能はVPCエンドポイントとして提供されているので、通信要件がHTTP/HTTPSのみであれば、Transit GatewayやVPC PeeringなどでVPC間を接続することなく、インターネットとの通信をセキュアに実現できてしまうのです。
HTTP/HTTPS以外にも通信要件がある場合は、従来同様Transit GatewayでVPC間を接続し、HTTP/HTTPS通信はProxyエンドポイント経由、HTTP/HTTPS通信以外はTransit Gateway経由という方式が紹介されています。
上図構成だと、HTTP/HTTPSの検査・制御はNetwork Firewall Proxyで行う、HTTP/HTTPS以外の検査・制御はNetwork Firewallで行うことになります。ログの出力先もログのフォーマットも別になり、運用管理上の負荷が増えそうですが、これは現状仕方ありません。
一方で、Transit Gatewayで中央集約VPCとつながっているのであれば、Proxy エンドポイントは各VPCに持つのではなく、下図の通り中央集約VPCにひとつだけ置くというのも選択肢としてありえそうですが……HTTP/HTTPSトラフィックがNetwork FirewallとNetwork Firewall Proxy両方通ることになると無駄に高額なトラフィック料金を払わされることになり現実的ではないのかもしれません。まだNetwork Firewall Proxyの料金が発表されていないので、この部分は料金の発表を待たないとこれ以上議論できなさそうです。
プロキシのルール構造は下図のようになっています。
プロキシは1つのプロキシ設定を持ちます。
プロキシ設定は複数のルールグループを持つことができます。プロキシ設定内で、複数のルールグループに0~の優先度をつけることができ、値が小さいグループから順に評価されるようになっています。また、どのルール(後述)にも合致しなかった場合のデフォルトのアクション(許可/拒否)をプロキシ設定で指定します。
ルールグループは複数のルールを持つことができます。ルールグループの設定のところで各ルールを記述して行きます。ルールは検査した通信に対するアクション(許可/拒否)と条件を記したもので、0~の優先度をつけることができ、値が小さいルールから順に評価されるようになっています。
以上をまとめると、ルールはフェーズ(後述)ごとに、以下の順番で評価されていき、どのルールにも合致しなかった場合、デフォルトのアクションが実行されるということになります。
優先度0のルールグループ:優先度0のルール → 優先度0のルールグループ:優先度1のルール → 優先度0のルールグループ:優先度2のルール → … → 優先度1のルールグループ:優先度0のルール → 優先度1のルールグループ:優先度1のルール → … → 優先度2のルールグループ:優先度0のルール → … → デフォルトのアクション
プロキシのルールは、HTTP/HTTPSの通信の段階に応じて、PreDNS、PreREQUEST、PostRESPONSEの3つのフェーズに分けて適用されます。
アクションは、許可(allow)、アラート(alert)、拒否(deny)の3つがあります。
許可(allow)、拒否(deny)はそのままの意味ですが、アラート(alert)はアラートログに出力した上で次以降のルールの評価を継続します。許可した場合でもログを出力することができますので、許可(allow)ログは証跡としての保存用、アラート(alert)ログはCloudWatch等で捕捉してSNS連携等のアクションにつなげるという使い方が想定されているのだと考えられます。
アクションの発生条件を、リクエストやレスポンスに関わる各種値を使用して指定します。現在対応しているのは以下の通りです。
プロキシの作成は以下の手順で実施します。
本稿では、具体的な操作手順については説明を致しません。(公式ドキュメントなどをご参照ください)以下、注意すべき点のみを書いて行きます。
TLS通信の中身を検査するには、プライベート証明書を発行できるプライベートCAが必要になります。公式ドキュメントの記述が不親切なのですが、プライベートCAを作成し、RAM (Resource Access Manager) で共有して、「下位CAは作成できず従属CA証明書の発行のみ許可する権限」(AWSRAMSubordinateCACertificatePathLen0IssuanceCertificateAuthority)を与えてあげてください。プライベートCAのことをよく知っている人には当然のことなのかもしれませんが、私はこれが理解できておらずハマりました。
TLS検査の仕組みや、クライアントPCでプライベート証明書を信頼する手順は、以下の記事もご参照ください。

TLSインターセプトモードが有効になると、条件 request:Http:* や response:Http:* を使用した検査が行えるようになります。
プロキシが作成されると、プロキシと同じサブネットにProxyエンドポイントが作成されます。Proxyエンドポイントは追加作成することができます。プロキシの詳細に「VPC エンドポイントサービス名」という項目が表示されるので、プロキシを使用したいVPCでVPCエンドポイントを作成し、タイプに「NLB と GWLB を使用するエンドポイントサービス」、サービス名に「VPC エンドポイントサービス名」の値を入れるようにしてください。なお、最初に作成されるProxyエンドポイントは不要であれば削除しても構いません。
プロキシの詳細に「プライベート DNS 名」が表示されるので、その値( xxxxxxxx.proxy.nfw.<リージョンID>.amazonaws.com )をクライアントのプロキシ設定箇所に設定して使用します。
顧客企業への導入検討と銘打ちながら、検討らしきものはアーキテクチャ検討部分だけとなってしまいましたが、プレビューが進みGA段階になれば、プレビュー段階に存在する様々な制約も解消され、具体的に検討が進められるかなと考えています。
現段階では、インターネットアクセス要件がHTTP/HTTPSだけであればTransit GatewayやVPC Peeringを作ることなくVPCエンドポイントだけで接続できてしまう点がメリットとして大きいように感じます。
まずはプレビューで出来る範囲でいろいろ試してみたいと思います。
]]>だいぶご無沙汰しております。村上です。
ラスベガスで開催された「AWS re:Invent 2025」に参加してきましたので、複数回にわたって参加レポートをお届けします。
では早速。今回は「Self-paced Traning」と「AWS Builder Center」についてです。
※ちなみにタイトルにもある通り、海外渡航は人生2回目の海外初心者です・・・
コミュニケーションや現地での過ごし方で苦戦したエピソードもどこかで紹介したいと思います。
(今回の記事の内容自体にはほとんど関係ありません)
re:Inventの初日、気合を入れすぎて相当早く会場へ到着。
お目当てのセッションまで時間があったので、会場を歩き回っていたところ「Self-paced Traning」というエリアを発見しました。
これは、re:Inventの開催期間中、AWSサービスに関するのクイズやハンズオン、AWS認定試験の準備など、200以上の学習コンテンツが「無料で」受けられるというもの。
「AWS Skill Builder」にあるものと重複しているものもありそうでしたが、このようなイベントで初披露されるコンテンツもあるとのこと。
空き時間でサクッと参加するにはちょうどよいアクティビティかなと。
▼会場の雰囲気はこんな感じ。
PCとモニターが1台ずつ用意されていますので、自身のデバイスは不要です。
受付に一言を声かけて、好きな席に座るだけでOKです。
今回「AWS ESCAPE ROOM」というRPG風ゲーム形式の学習コンテンツに挑戦しました。
その中でも「Exam Prep for AWS Certified AI Practitioner」というAI Practitioner認定向けコンテンツを選びました。
▼スタート画面。
ネタバレになるので詳細は割愛しますが、
AI Practitionerで求められる知識を問うクイズと「Amazon Bedrock」を使った生成AIアプリケーション構築のハンズオンが含まれていました。
クイズはAWS初学者向けで、英語ですが難しいものはありません。
途中BGMが流れたり、動画視聴なんかもあったりするので、有線イヤホンがあると便利です。
(持っていてよかったものについては「会場の歩き方編」なんかでまとめたいと思っています)
▼ハンズオンで利用したアーキテクチャ。
操作はガイド通りにポチポチやっていけば簡単に作成できます。初学者がイメージを掴むのにはよいかもしれません。
本当は「岩に乗ったペンギン」の画像を出力させるというお題でしたが、「ラーメンを食べる日本人女性」にしてみました。
▼こんな感じの画像が出力されました。
このように、気軽に学習できるだけでなく、海外からの参加者と同じ空間でで手を動かすのもよい刺激になりました。
空き時間を有効活用できるアクティビティとしておすすめです。
「Self-paced Traning」を利用するには、「Builder ID」が必要になります。
これは「AWS Builder Center」を利用するための個人に紐づくアカウント。Amazon Q DeveloperやAWS Skill Builder、AWS re:Postなど、学習コンテンツや学習ツールを利用できるようになります。
(ちなみに私もほとんど活用したことがなかったので、これから触ってみる予定です)
「AWS Builder Center」に関しては、AWSも非常に力を入れている印象でした。
メンバー向けのイベントや休憩可能な専用ブースもあり、会場スタッフも「是非寄ってみて!」と積極的に声をかけていました。
▼立ち寄った専用ブース。
▼SWAGもたくさん。
ということで、第一回はこのくらいで終わります。
re:Inventに参加した際は是非「Self-paced Traning」への参加を、
また、日々の学習の際は「AWS Builder Center」を、というお話でした、
また次回作も見てくれたらうれしいです。
]]> 本記事は TechHarmony Advent Calendar 2025 12/23付の記事です。 |
どうも。四国の高知県に来ている寺内です。このブログを書くために、わざわざHHKBを出張に持ってきました。
さて。どこにいても、PCが変わっても、自分の慣れ親しんだ環境を使いたいものですよね。それが作業効率のみならず心地よさに大きく影響するからです。
VSCode周りやブラウザは長い時間を育ててきている設定ファイルを複数PC間で同期できるのでよいですが、OS周りの設定同期や共有は面倒なものがあります。ブラウザで環境が完結していたCloud 9は重宝する面が多々ありました。残念ながらサ終に向かっていることもあり、代替を検討するチームも多いでしょう。
当社のAWS Ambassadors 広野さんが2025年9月に投稿した以下のブログ記事では、Ubuntuが稼働するEC2のデスクトップコンソールをブラウザで操作するサーバを構築できます。

大変優れた記事ですが、こちらのCFnテンプレートでは、素のUbuntu稼働のEC2インスタンスを作成し、その後デスクトップ環境の構築を行います。これはEC2インスタンスを作成するタイミングの違いで、インストールされるツール・ライブラリのバージョンが異なることになります。チーム開発をしているケースで、ある程度の環境の統制を効かせたい場合、メンバー毎にバージョンの違いが生じるのは塩梅がよくありません。
そこで本記事では、このCFnテンプレートを個人利用スコープからチーム開発スコープに拡張します。広野さんのCloudFormationテンプレートを参考にしつつ、新たに開発サーバ構築ツール「vsimage」として再構成します。
vsimageツールのアーキテクチャの考え方はCloud 9 のアーキテクチャを踏襲します。つまり、チームとしてのAMIを一つ作っておき、メンバーはそのAMIからマイ環境のEC2インスタンスを起動するという使い方です。環境をビルドしAMIを作成するフェーズと、EC2インスタンス化するフェーズを分離することで、EC2作成時にデスクトップソフトウェアのインストール時間を待つ必要がなくなります。
vsimageは、以下の二種類の役割の人間を想定しています。
vsimageは、以下3つのCFnテンプレートからなります。
imagebuilder-pipeline.yamlami-creation-execution.yamlec2-launch-from-ami.yaml1と2のCFnテンプレートは、AMI管理者が使用します。3は開発者が使用します。
Ubuntu ServerにGUI環境をインストールしUbuntu Desktopにします。その後、DCVやVSCodeなどの必要なツール群をインストールします。これらの一連の作業は、EC2 Image Builderを使用します。
AMI管理者は、Image Builderのコンポーネント定義とレシピ定義を行いUbuntuにインストールするソフトウェアを定義します。その設定をパイプラインとして定義します。
パイプラインを実行し、Image Builderで作成されたAMIをチームに公開します。
開発者はそのAMIを使用して、自らのVPC環境にEC2インスタンスを起動します。
ブラウザからスムーズにアクセスできるように、EC2起動と同時にRoute 53へFQDNと新規取得したElastic IPの組み合わせをAレコードで登録します。またSSL接続を行うためのオレオレサーバ証明書を内部で作り出します。
Ubuntuサーバは、安価なGravitonインスタンスタイプで動作します。そのため、AMI作成プロセスにおけるインスタンスタイプも同じくGravitonを指定しています。 AMI作成段階で作るインスタンスタイプは、t4g.large。EC2作成段階ではパラメータで指定可能ですが、デフォルトはt4g.largeです。
vsimageでは、Ubuntuのrootパスワードは以下の二段階で設定します。
AMI作成段階(アーキテクチャ図でいうSTEP 2)で、 ami-creation-execution.yaml にCloudFormationパラメータとして、AMI管理者が設定したパラメータストアキーを与えます。AMI作成中にパラメータストアからパスワード文字列を読み出し、Ubuntu ルートパスワードを設定します。生成された直後のAMIには、AMI管理者が定義した文字列がルートパスワードとなります。
EC2インスタンス作成段階(アーキテクチャ図でいうSTEP 3)では、開発者が実行する ec2-launch-from-ami.yaml にCloudFormationパラメータとして、開発者が設定したパラメータストアキーを与えます。EC2インスタンス作成中にパラメータストアからパスワード文字列を読み出し、Ubuntu ルートパスワードを設定します。もしパラメータストアキーが未設定であったり、パラメータストアの読み出しが失敗した場合は、AMI管理者の設定したルートパスワードのままとなります。
どちらの段階でのルートパスワード設定方法は、 /home/ubuntu/set-password-from-parameter.sh というスクリプトがOS起動時にsystemctrl により実行されることで設定されます。
作成されるAMIは以下の内容となります。
独自にAMI内部に作られるシェルスクリプトは以下3つがあります。いずれもubuntuユーザのホームディレクトリ /home/ubuntu に作られます。ルートパスワード設定とSSLサーバ証明症作成はsystemctlのサービスとして追加され、OS起動直後に一度だけ自動実行されます。
set-password-from-parameter.shsetup-ssl.shrenew-cert.sh以下では、CloudFormationテンプレートからCloudFormationスタックを作成する手順を示します。この手順に従い、パラメータを適切に設定すれば、Ubuntuサーバが完成します。
vsimageは、以下3つのCFnテンプレートから成り、zip圧縮してあります。
imagebuilder-pipeline.yamlami-creation-execution.yamlec2-launch-from-ami.yamlこちらのリンクからzipファイルをダウンロードしてください。
vsimageを使用する前提は以下です。
grep などで検索して置き換えてください。Key: Cost Value: y.terauchi の部分も適宜置き換えてください。まずImage Builder構築テンプレート imagebuilder-pipeline.yaml を用いて、Image Builderのパイプライン構築を行います。このスタック実行にはおおよそ5分ほどかかります。
CloudFormationへ与えるパラメータは以下のとおりです。
PasswordParameterName |
AMI作成段階で指定するUbuntuルートパスワードを収納しているパラメータストアキー名を指定します。 |
LoggingBucket |
Image Builderの動作ログを保管するS3バケットを新規作成ときのバケット名を指定します。このパラメータが有効になるのは、 CreateNewBucketをtrueとしたときです。 |
CreateNewBucket |
上記名前で新規作成するときにtrueを指定します。二回目以降のスタック実行の場合はS3バケットは存在しているのでfalseを指定します。 |
ExistingBucketName |
S3バケットを新規作成しない場合に既存バケット名を指定します。新規作成する場合はパラメータ指定をしません。 |
AWS CLIで実行するときのコマンド例を以下に示します。
【一回目の実行であり、S3バケットを新規作成する場合】
aws cloudformation create-stack \
--stack-name ytera-vsimage-pipeline \
--template-body file://imagebuilder-pipeline.yaml \
--parameters \
ParameterKey=PasswordParameterName,ParameterValue=/ytera-vsimage/ubuntu-password \
ParameterKey=CreateNewBucket,ParameterValue=true \
ParameterKey=LoggingBucket,ParameterValue=ytera-vsimage-imagebuilder-logs-ap-northeast-1 \
--capabilities CAPABILITY_NAMED_IAM \
--region ap-northeast-1
【二回目以降の実行であり、既存のS3バケットを使用する場合】
aws cloudformation create-stack \
--stack-name ytera-vsimage-pipeline \
--template-body file://imagebuilder-pipeline.yaml \
--parameters \
ParameterKey=PasswordParameterName,ParameterValue=/ytera-vsimage/ubuntu-password \
ParameterKey=CreateNewBucket,ParameterValue=false \
ParameterKey=ExistingBucketName,ParameterValue=ytera-vsimage-imagebuilder-logs-ap-northeast-1 \
--capabilities CAPABILITY_NAMED_IAM \
--region ap-northeast-1
AMI作成テンプレート ami-creation-execution.yaml を実行し、AMI作成を行います。このスタック実行にはおおよそ40分ほどかかります。
PipelineStackName |
前工程でパイプラインを作成したスタック名を入力します。 |
ImageName |
作成するAMIの名前を指定します。 |
EnableImageTests |
Image Builderは作成したAMIが正常に稼働するかをテストする機能があります。その自動テストを実施するかしないかを選択します。パイプラインではテスト定義をしていないため、falseを指定します。 |
aws cloudformation create-stack \
--stack-name ytera-vsimage-ami-creation \
--template-body file://ami-creation-execution.yaml \
--parameters \
ParameterKey=PipelineStackName,ParameterValue=ytera-vsimage-pipeline \
ParameterKey=ImageName,ParameterValue=ytera-vsimage-ami \
ParameterKey=EnableImageTests,ParameterValue=false \
--region ap-northeast-1
AMIが正常に作成できたら、EC2インスタンス構築テンプレート ec2-launch-from-ami.yaml を開発者として実行します。これにより個人の環境にEC2インスタンスを起動します。このスタック実行にはおおよそ10分ほどかかります。
AmiCreationStackName |
前工程でAMIを作成したスタック名を入力します。 |
InstanceType |
Ubuntuを稼働させるインスタンスタイプを指定します。Gravitonである必要があります。初期値はt4g.large。 |
VpcId |
Ubuntuを稼働させるVPC IDを指定します。 |
SubnetId |
Ubuntuを稼働させるサブネットIDを指定します。パブリックサブネットである必要あります。 |
AllowedSubnet |
Ubuntuへ接続可能なPCのCIDRを指定します。ここで指定したCIDRからUbuntuのTCP 8443ポート、443ポートが許可されます。 |
DomainName |
Ubuntuのホスト名を含むFQDNを指定します。これがブラウザからアクセスするときのURLとなります。 |
Route53HostZoneId |
FQDNで指定したドメインを定義しているRoute 53のゾーンIDを指定します。このゾーンIDに対してAレコードを追加します。 |
PasswordParameterName |
EC2インスタンスのUbuntuルートパスワードとして設定する文字列を収納しているパラメータストアキー名を指定します。 |
EMAIL |
SSLサーバ証明書に埋め込むメールアドレスを指定します。何でもかまいません。 |
aws cloudformation create-stack \
--stack-name ytera-vsimage-user1-instance \
--template-body file://ec2-launch-from-ami.yaml \
--parameters \
ParameterKey=AmiCreationStackName,ParameterValue=ytera-vsimage-ami-creation \
ParameterKey=InstanceType,ParameterValue=t4g.large \
ParameterKey=SubnetId,ParameterValue=subnet-0d29XXXXXXXXXXXXXXd \
ParameterKey=VpcId,ParameterValue=vpc-0e98dXXXXXXXXXXXXXX \
ParameterKey=AllowedSubnet,ParameterValue=2XX.2XX.XX.XX/32 \
ParameterKey=DomainName,ParameterValue=ytera-vsimage-user1-instance.example.com \
ParameterKey=Route53HostZoneId,ParameterValue=Z09XXXXXXXXXXXXXXXXXXXX \
ParameterKey=PasswordParameterName,ParameterValue=/ytera-vsimage/user1-password \
ParameterKey=EMAIL,[email protected] \
--capabilities CAPABILITY_NAMED_IAM \
--region ap-northeast-1
EC2インスタンス構築テンプレート ec2-launch-from-ami.yaml が正常終了すると、EC2へアクセスするURLが指定したFQDNを下に出力されます。スタックのOutputページを見ていただき、そのURLにDCVでアクセスしてください。
DCVの認証は、Ubuntuの一般ユーザ(ubuntu)とCFnテンプレートで指定したパラメータストアのパスワードでログイン可能です。その後、Ubuntuのログイン画面が出ますが、同じIDとパスワードでログインします。
本ツールでは、開発環境となるAMI作成と、実際のインスタンス化の工程を分離しているのが特徴です。常に開発環境のバージョンをセキュアに最新に保ち開発者に提供することが比較的簡単にできます。
毎晩AMI作成を自動で実行するようにスケジュールを組んでおき、開発者は毎朝EC2を作成する運用とすることで実現可能です。EC2作成のスタックでは、AMI作成スタックが出力するAMI IDを参照しているので、開発者はどのAMIが最新であるかを意識する必要がありません。
ただ開発者の個人設定などのホームディレクトリを、インスタンス外に自動退避し、EC2作成時に自動で戻す仕組みがまだできていませんが。
ライトなユースケースでは、Ubuntuの開発者のホームディレクトリをS3マウントしておくだけでもよいかもしれません。

最後に。本記事は、広野さんの秀逸なCloudFormationがあったからこそ実現できました。ありがとうございました。
]]> 本記事は TechHarmony Advent Calendar 2025 12/23付の記事です。 |
こんにちは。SCSK渡辺(大)です。
肩こりが酷すぎたのでYouTubeで首回りのストレッチ動画を参考にやってみたらスッキリしました。
首剥がしとストレートネック治しの動画はお勧めです。
以下のようなナレッジを作ることが出来ました。
楽してナレッジを作りたかったのです。
※あくまで一個人の見解です。
恐らく1年前だったら1つのケースをナレッジ化するのに1分掛かるか、トークンが多すぎて1度の指示で全てのケースをナレッジ化することは出来なかったかと思います。
それが今では、スクリプトの作成から始め、スクリプトの実行、ケースをカテゴリ別に仕分け、すべてのケースのナレッジ化までを丸っとAIにお任せすることが出来ます。
※Kiroに実行許可をしていない場合には、スクリプトの実行など必要なタイミングでは人間の介在が必要です
最早、AIが「AWS Support のケースをナレッジ化するために進化してきました!」と言っているようなものです。
なので有難く使わせてもらいました。
ということで早速取り掛かってみようと、AWSマネジメントコンソールの AWS Support の画面を眺めていたところ、約2年前のケースまでしか残っていませんでした。
調べてみたところ、AWS Supportのケース履歴は、AWSマネジメントコンソール上では直近24か月間(2年間)までしか残っていません。[1]
また、Boto3のリファレンス[2]では直近12か月(1年間)までとなっていますが、実際にはAWSマネジメントコンソールと同様に、直近24か月間(2年間)まで取得できます。(実際に試しました)
つまり、ナレッジ化したいと感じたらすぐに取り掛かったほうが良いということです。
理由は、直近24か月を超過したケースは見れなくなってしまうためです。
AWS Support でクローズ済のケースをKiroにナレッジ化してもらいました。
Kiroに実行許可をしていない場合には、スクリプトの実行など必要なタイミングでは人間の介在が必要ですが、殆どKiroにお任せできます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:GetCallerIdentity",
"support:DescribeCases",
"support:DescribeCommunications"
],
"Resource": "*"
}
]
}
畳んでいます。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AWS Support ケースダウンローダー
サポートケースをダウンロードし、
各ケースをテキストファイルとして保存する。
"""
import json
import logging
import os
import sys
from datetime import datetime
from pathlib import Path
import boto3
from botocore.exceptions import NoCredentialsError, ClientError, BotoCoreError
OUTPUT_DIR = 'support_cases'
EXCLUDED_KEYWORDS = [
"[除外したいケース名に含むキーワード1]",
"[除外したいケース名に含むキーワード2]"
]
def setup_logging() -> logging.Logger:
"""ロギング設定"""
os.makedirs(OUTPUT_DIR, exist_ok=True)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
log_file = f"{OUTPUT_DIR}/download_{timestamp}.log"
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(log_file, encoding='utf-8'),
logging.StreamHandler(sys.stdout)
]
)
return logging.getLogger(__name__)
def get_aws_credentials():
"""認証情報を取得"""
# ~/.aws/credentials があればboto3デフォルトに任せる
creds_file = Path.home() / '.aws' / 'credentials'
if creds_file.exists():
return 'default'
# aws login キャッシュから取得
cache_dir = Path.home() / '.aws' / 'login' / 'cache'
if not cache_dir.exists():
return None
cache_files = list(cache_dir.glob('*.json'))
if not cache_files:
return None
latest_file = max(cache_files, key=lambda f: f.stat().st_mtime)
with open(latest_file, 'r', encoding='utf-8') as f:
data = json.load(f)
token = data.get('accessToken', {})
return {
'aws_access_key_id': token.get('accessKeyId'),
'aws_secret_access_key': token.get('secretAccessKey'),
'aws_session_token': token.get('sessionToken'),
}
def create_session(logger):
"""boto3 セッション作成"""
creds = get_aws_credentials()
if creds == 'default':
logger.info("Using ~/.aws/credentials")
return boto3.Session(region_name='us-east-1')
if not creds or not creds.get('aws_access_key_id'):
raise NoCredentialsError()
logger.info("Using aws login cache")
return boto3.Session(
aws_access_key_id=creds['aws_access_key_id'],
aws_secret_access_key=creds['aws_secret_access_key'],
aws_session_token=creds['aws_session_token'],
region_name='us-east-1'
)
def validate_credentials(session, logger):
"""認証情報の有効性をテスト"""
try:
sts = session.client('sts')
identity = sts.get_caller_identity()
logger.info(f"認証成功: {identity.get('Arn', 'Unknown ARN')}")
return True
except ClientError as e:
error_code = e.response['Error']['Code']
if error_code in ['InvalidUserID.NotFound', 'AccessDenied', 'TokenRefreshRequired', 'ExpiredToken', 'ExpiredTokenException']:
logger.error("AWS認証情報が無効または期限切れです。認証情報を確認してください。")
else:
logger.error(f"AWS API エラー: {error_code} - {e.response['Error']['Message']}")
return False
except BotoCoreError as e:
logger.error(f"AWS接続エラー: {e}")
logger.error("ネットワーク接続またはAWS認証情報を確認してください。")
return False
except Exception as e:
logger.error(f"認証テスト中の予期しないエラー: {e}")
import traceback
logger.error(traceback.format_exc())
return False
def download_cases(session, logger):
"""全サポートケースをダウンロードして保存"""
try:
client = session.client('support', region_name='us-east-1')
except Exception as e:
logger.error(f"Supportクライアント作成エラー: {e}")
raise
logger.info("Fetching cases...")
cases = []
next_token = None
try:
while True:
params = {'maxResults': 100, 'includeResolvedCases': True}
if next_token:
params['nextToken'] = next_token
response = client.describe_cases(**params)
cases.extend(response.get('cases', []))
next_token = response.get('nextToken')
if not next_token:
break
except ClientError as e:
error_code = e.response['Error']['Code']
if error_code == 'SubscriptionRequiredException':
logger.error("AWS Supportプランが必要です。Basic以上のサポートプランに加入してください。")
return 0
else:
logger.error(f"ケース取得エラー: {error_code} - {e.response['Error']['Message']}")
return 0
except Exception as e:
logger.error(f"ケース取得中の予期しないエラー: {e}")
return 0
logger.info(f"Found {len(cases)} cases")
saved_count = 0
for idx, case in enumerate(cases, 1):
case_id = case['caseId']
subject = case.get('subject', '')
logger.info(f"[{idx}/{len(cases)}] Processing: {case_id}")
# 除外キーワードのチェック
if any(kw in subject for kw in EXCLUDED_KEYWORDS):
logger.info(f" -> Excluded (keyword): {subject[:50]}")
continue
# 進行中のケース(クローズしていないケース)を除外
status = case.get('status', '').lower()
if status != 'resolved':
logger.info(f" -> Excluded (not resolved): {subject[:50]} (status: {status})")
continue
try:
comms = []
comm_token = None
while True:
params = {'caseId': case_id}
if comm_token:
params['nextToken'] = comm_token
resp = client.describe_communications(**params)
comms.extend(resp.get('communications', []))
comm_token = resp.get('nextToken')
if not comm_token:
break
filename = f"{OUTPUT_DIR}/case_{case_id}.txt"
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"ケースID: {case_id}\n")
f.write(f"件名: {subject}\n")
f.write(f"ステータス: {case.get('status', '')}\n")
f.write(f"作成日時: {case.get('timeCreated', '')}\n")
f.write(f"サービス: {case.get('serviceCode', '')}\n")
f.write(f"カテゴリ: {case.get('categoryCode', '')}\n")
f.write(f"重要度: {case.get('severityCode', '')}\n")
f.write("=" * 60 + "\n\n")
for i, comm in enumerate(comms, 1):
f.write(f"--- メッセージ {i} ---\n")
f.write(f"送信者: {comm.get('submittedBy', '')}\n")
f.write(f"日時: {comm.get('timeCreated', '')}\n")
f.write(f"内容:\n{comm.get('body', '')}\n\n")
saved_count += 1
logger.info(f" -> Saved: {filename}")
except Exception as e:
logger.error(f" -> Error: {e}")
logger.info(f"Completed: {saved_count} cases saved to {OUTPUT_DIR}/")
return saved_count
def main():
logger = setup_logging()
logger.info("Starting download...")
try:
session = create_session(logger)
# 認証情報の有効性をテスト
if not validate_credentials(session, logger):
return
count = download_cases(session, logger)
logger.info(f"Done: {count} cases saved to {OUTPUT_DIR}/")
except NoCredentialsError:
logger.error("AWS認証情報が見つかりません。認証情報を設定してください。")
except Exception as e:
logger.error(f"予期しないエラー: {e}")
logger.error("詳細なエラー情報:")
import traceback
logger.error(traceback.format_exc())
if __name__ == "__main__":
main()
畳んでいます。
# AWS Support ケースダウンロード & ナレッジ 化 指示書
## 重要な制約事項(必ず遵守)
### 禁止事項
- **追加のスクリプト(Python、シェルスクリプト等)を新規作成しないこと**
- 既存のスクリプト `aws_support_knowledge_generator_cli.py` を勝手に修正しないこと
- 指示書に記載されていない処理を勝手に追加しないこと
- 出力ディレクトリ以外の場所にファイルを作成しないこと
- **Kiro の SPEC 機能を使用しないこと**(この指示書に従って直接処理を行うこと)
### 許可される操作
- `aws_support_knowledge_generator_cli.py` の実行(ケースダウンロード)
- `support_cases_knowledge/` ディレクトリへの ナレッジ Markdown ファイルの作成のみ
- 既存ファイルの読み取り
---
## 1. ケースダウンロード(スクリプト実行)
### 実行コマンド
```bash
python aws_support_knowledge_generator_cli.py
```
### 動作内容
- 全サポートケースを `support_cases/` にテキストファイルとして保存
- ログは `support_cases/download_YYYYMMDD_HHMMSS.log` に出力
### 出力形式
各ケースファイル (`case_{ID}.txt`) には以下を含む:
- ケース ID、件名、ステータス、作成日時
- サービス、カテゴリ、重要度
- 全メッセージ履歴(送信者、日時、内容)
---
## 2. ナレッジ 化(Kiro による処理)
### 前提条件
- 事前に `python aws_support_knowledge_generator_cli.py` を実行してケースをダウンロード済みであること
- `support_cases/` ディレクトリにケースファイルが存在すること
### 処理手順(重要:セッション中断に備えた段階的処理)
**基本方針**: ファイル読み込み → 即座に進捗管理表に記載 → カテゴリ単位で ナレッジ 生成 → 次のファイル読み込み
#### ステップ 1: 初期確認
1. `support_cases_knowledge/progress_management.md`(進捗管理表)が存在するか確認する
2. 存在する場合は進捗管理表を読み込み、「分類済み」列と「ナレッジ 生成済み」列を確認する
#### ステップ 2: ファイル読み込みと即時分類(繰り返し)
1. `support_cases/` から**未分類のケースファイル**を可能な限り読み込む
2. **読み込んだら即座に**進捗管理表に追記する(「分類済み」に `✓`、「ナレッジ 生成済み」は空欄)
3. この時点でセッションが中断しても、次回は進捗管理表を見て続きから処理できる
#### ステップ 3: カテゴリ単位での ナレッジ 生成(繰り返し)
1. 進捗管理表から「ナレッジ 生成済み」が空欄のケースを**カテゴリ単位で**抽出する
2. そのカテゴリの ナレッジ ファイルを生成(または追記)する
3. ナレッジ 生成完了後、該当ケースの「ナレッジ 生成済み」列に `✓` を付ける
4. **1 つのカテゴリの ナレッジ 生成が完了してから**、次のカテゴリに進む
#### ステップ 4: 未読み込みファイルがあれば繰り返し
- ステップ 2〜3 を、全ケースファイルの処理が完了するまで繰り返す
### 進捗管理表(progress_management.md)
セッションをまたいでも処理状況を正確に把握できるよう、進捗管理表を管理する。
#### 進捗管理表の形式
```markdown
# 進捗管理表
最終更新: YYYY-MM-DD HH:MM:SS
## 処理状況サマリー
- 総ケース数: XX 件
- 分類済み: XX 件
- ナレッジ 生成済み: XX 件
## 分類済みケース一覧
| ケースファイル | カテゴリ | 件名 | 分類済み | ナレッジ 生成済み |
| -------------- | ----------------- | ---------------- | -------- | ------------ |
| case_xxx.txt | コスト・請求 | 請求に関する質問 | ✓ | ✓ |
| case_yyy.txt | セキュリティ・IAM | IAM 権限の設定 | ✓ | |
| case_zzz.txt | ネットワーク | VPC 設定について | ✓ | |
```
#### 進捗管理表の運用ルール(必須)
1. **即時記載の原則**: ケースファイルを読み込んだら、**その時点で即座に**進捗管理表に追記すること(全ファイル読み込み後ではない)
2. **2 段階チェック**:
- 「分類済み」列: ファイルを読み込んでカテゴリを判定したら `✓`
- 「ナレッジ 生成済み」列: そのケースを含む ナレッジ を生成したら `✓`
3. **カテゴリ単位処理**: 1 つのカテゴリの ナレッジ 生成を完了してから、次のカテゴリのファイル読み込みに進むこと
4. **セッション再開時**: まず進捗管理表を確認し、「分類済み」が空欄のケースのみ読み込み、「ナレッジ 生成済み」が空欄のカテゴリから処理を再開すること
5. **サマリー更新**: 進捗管理表を更新するたびに、処理状況サマリーも更新すること
### 応答言語
**Kiro からの応答は日本語で返すこと**
---
## 3. カテゴリ分類ルール
以下の 8 カテゴリに分類すること。複数カテゴリに該当する場合は、最も関連性の高い 1 つを選択する。
| カテゴリ名 | 対象サービス・キーワード |
| --------------------------- | ----------------------------------------------------------------------------- |
| 1. アカウント・サポート | アカウント設定、Organizations、サポートプラン、上限緩和申請、Service Quotas |
| 2. セキュリティ・IAM | IAM、認証、暗号化、セキュリティグループ、WAF、KMS、Secrets Manager、GuardDuty |
| 3. ネットワーク | VPC、Route 53、CloudFront、Direct Connect、ELB、ALB、NLB、Transit Gateway |
| 4. コンピューティング | EC2、Lambda、ECS、EKS、Batch、Fargate、Auto Scaling |
| 5. ストレージ・データベース | S3、EBS、RDS、DynamoDB、ElastiCache、Aurora、Redshift、EFS |
| 6. 開発・CICD | CodePipeline、CodeBuild、CodeDeploy、CloudFormation、CDK、CodeCommit |
| 7. 監視・運用 | CloudWatch、CloudTrail、Systems Manager、Config、EventBridge、X-Ray |
| 8. コスト・請求 | 料金、請求、Cost Explorer、Savings Plans、Reserved Instance、Billing、Budget |
---
## 4. ナレッジ ファイル生成ルール
### 出力先
- `support_cases_knowledge/` ディレクトリに出力すること(ディレクトリが存在しない場合は作成する)
- 他のディレクトリには出力しないこと
### ファイル命名規則
- `ナレッジ_カテゴリ名.md` 形式(例: `ナレッジ_コスト・請求.md`)
### 必須構成要素(すべて必須)
> **⚠️ 重要: 目次は必ず作成すること。目次がない ナレッジ ファイルは不完全とみなす。**
#### 4.1 目次(ファイル冒頭に必須)
**すべての ナレッジ ファイルの冒頭には必ず目次を設けること。** 目次がないファイルは作成完了とみなさない。
```markdown
# ナレッジ: カテゴリ名
最終更新: YYYY-MM-DD
## 目次
- [Q1: 質問タイトル](#q1-質問タイトル)
- [Q2: 質問タイトル](#q2-質問タイトル)
...
---
(以下、各 ナレッジ の本文)
```
#### 4.2 各 ナレッジ の構成
```markdown
## Q1: 質問タイトル
### 質問
(背景・状況を含めて、ユーザーからの質問内容を具体的に記載します。どのような状況で何を知りたいのか明確にします)
### 回答
(AWS サポートからの回答を詳細に記載します。手順がある場合はステップバイステップで記載します)
### 関連リンク
- [AWS 公式ドキュメント](https://docs.aws.amazon.com/...)
### 元ケース
- ファイル: `case_xxx.txt`
```
### 記載ルール
#### 文体
- **「です」「ます」調で統一**(質問、回答、説明文すべて)
#### 自己完結性(最重要)
- **ナレッジ 単体で問題と解決策が完全に理解できること**
- 元ケースを参照しなくても実用的な情報として成立させる
- 質問には背景・状況を含める(なぜその質問が発生したか)
- 回答は要約ではなく、実際に役立つ詳細さで記載
- 手順がある場合は番号付きリストでステップバイステップで記載
- AWS CLI コマンド、設定値、パラメータは省略せず完全な形で記載
#### 汎用性(重要)
- **特定環境に依存しない、誰でも使える ナレッジ にすること**
- 以下の情報は汎用的な表現に置き換える:
| 置換対象 | 置換後の表現 |
| ---------------------- | --------------------------------- |
| アカウント ID | `your-account-id` |
| ARN | `arn:aws:service:::your-resource` |
| バケット名・リソース名 | `your-bucket-name` 等 |
| メールアドレス | `[email protected]` |
| IP アドレス | `xxx.xxx.xxx.xxx` |
| 組織 ID | `o-xxxxxxxxxx` |
#### 禁止事項
- 「〜については元ケースを参照してください」という記載
- 具体的な値やコマンドを省略した曖昧な説明
- 元のケース内容に勝手な解釈を加えること
---
## 5. エラー対処
| エラー種別 | 対処方法 |
| ---------- | ------------------------------------------------------------ |
| 認証エラー | AWS 認証情報が不足しています。適切な認証設定を行ってください |
| 権限エラー | Business/Enterprise Support プランが必要 |
今回の学びで大きかったことは、Kiroの利用においては要約機能[4]が動くことを前提にした指示文にすべきだと感じました。
2025年12月12日にAWS IAM Identity CenterのユーザーでもClaude Opus 4.5が使えるようになった[5]ので、良い機会なのでClaude Opus 4.5のみ使用するように設定して指示文書を渡してみたのですが、なんとケース情報ファイルの読み込みだけでコンテキストを食い潰し、いざナレッジを作ろうとなった時にコンテキストの上限(80%)に達してしまいました。
それだけならまだ良かったのですが、要約機能が動いた後に再度ケース情報ファイルの読み込みが始まってしまい、またコンテキストの上限に達してしまい要約機能が動いて・・・という負のループに陥ってしまい、クレジットが垂れ流し状態になってしまいました。
上記の対応策として進捗管理表を作りました。
進捗管理表などを作成して随時更新するなどして要約機能が動いたとしても次のセッションで進捗が引き継がれるようにするべきであると、既に様々なところで言われていることですが今回とても痛感しました。
一方で、仕様書や設計書も作る必要があるような場合にはSpecs機能を使ってタスク管理しながら進めるほうが良いと思います。
上記に関連してお伝えすると、Claude Opus 4.5 を利用した時のクレジット消費量が凄まじいです。
当記事に載せた指示文で実行した場合、完了するまでに約40クレジット消費しました。
約40ケースがナレッジ化の対象だったので、偶然かもしれませんが1クレジット/ケースでした。
Kiroを使ったことがある人は以下の画像を見ると震えるかもしれません。
ファイル名に「/」を含めるように指示をしてしまうと、「/」より前がディレクトリで後ろがファイル名として判断されてしまいます。
対応策の具体例は、「開発・CI/CD.md」は避けて「開発・CICD.md」で指示すべきです。
そうしないと以下の画像のようになってしまいます。

業務におけるナレッジ作成は大変なので、AWS Support のケースだけでも楽にナレッジ化できそうであることが分かって良かったです。
後続の運用を考えた時には最新化や棚卸も必要になると思いますが、再度 AWS Support に問い合わせするようなことはしなくても、MCPサーバーを使って最新の情報を確認できるようにしてあげれば、それらの作業もAIで楽に出来そうですね。
私が実際の業務で使うかどうかは別問題ですが、当記事がどなたかの役に立ちましたら幸いです。
Kiro に興味を持った方は、ぜひ Kiro 公式サイト をチェックしてみてください。
[1]AWS プレミアムサポートのよくある質問
–抜粋——————————————————-
ケース履歴の保存期間はどれほどですか?
ケース履歴情報は、作成後 24 か月間ご利用いただけます。
————————————————————–
[2]describe_cases – Boto3 1.42.9 documentation
–抜粋(日本語訳)——————————————
ケースデータは作成後12か月間利用可能です。12か月以上前に作成されたケースの場合、リクエストがエラーを返す可能性があります。
————————————————————–
[3]Quickstart – Boto3 1.42.9 documentation
–抜粋(日本語訳)——————————————
Pythonのインストールまたはアップデート
Boto3をインストールする前に、Python 3.10以降を使っていることを確認してください。
————————————————————–
[4]Summarization – IDE – Docs – Kiro
–抜粋(日本語訳)——————————————
要約
すべての言語モデルには「コンテキストウィンドウ」があり、これはモデルが一度に処理できる最大テキスト量です。コンテキストウィンドウの長さはモデルによって異なります。
Kiroと会話すると、その会話の過去のすべてのメッセージをメモリーとしてモデルに送信し、モデルが最新の応答を生成する際にそれらを考慮できるようにします。会話が長くなると、モデルのコンテキストウィンドウの制限に近づき始めます。この時、Kiroは会話内のすべてのメッセージを自動的に要約し、コンテキストの長さを制限以下に戻します。
チャットパネルのコンテキスト使用メーターを使って、モデルのコンテキスト制限のどのくらいの割合が使われているかを把握できます。使用率がモデルの上限の80%に達すると、Kiroは自動的に会話をまとめます。
————————————————————–
[5]Claude Opus 4.5 support for AWS IAM Identity Center users – Kiro
–抜粋(日本語訳)——————————————
AWS IAM Identity Centerユーザー向けのClaude Opus 4.5サポート
us-east-1 および eu-central-1 リージョンの両方で、AWS IAM Identity Centerユーザー向けにClaude Opus 4.5のサポートを追加しました。Claude Opus 4.5はKiro IDEとKiro CLIの両方で利用可能です。
————————————————————–
本記事は TechHarmony Advent Calendar 2025 12/22付の記事です。 |
こんにちは、稲葉です。
アドベントカレンダーの機会で、普段触っていないコンテナに触れてみようと思いました。
本記事ではコンテナでWordPressサイトを作成し、Amazon ECSにデプロイするところまで試してみようと思います。
本記事で試す構成です。
検証用にローカルPCのDockerでWordPressサイトを構築します。
その後、本番用にECSでWordPressを公開します。
まずはdocker composeでWordPress環境を作成してみました。
下記のような構成で作成しました。
. ├── docker-compose.yml ├── .env ├── nginx │ ├── default.conf │ └── nginx.conf └── php-fpm ├── Dockerfile └── php.ini
| ファイル名 | 内容 |
| ./docker-compose.yml | 複数コンテナをまとめて管理するためのdocker compose用設定ファイル |
| .env | docker-compose.yml用の環境変数を記載するファイル (コード例は本記事の最後) |
| ./nginx/default.conf | nginxのサーバー設定用ファイル、php-fpm コンテナへ転送する設定などを記載 (コードは本記事の最後) |
| ./nginx/nginx.conf | nginxの基本設定ファイル(コードは本記事の最後) |
| ./php-fpm/Dockerfile | WordPressとphp-fpmの環境を作るためのDockerファイル ※nginx上でWordPressを公開する場合、WordPressはphp-fpmと同時に使用する必要がある (コードは本記事の最後) |
| ./php-fpm/php.ini | phpの設定ファイル(コードは本記事の最後) |
下記設定docker-compose.ymlファイルで、ローカルPCのWordPressサイトを構築します。
services:
nginx:
image:nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- wordpress_data:/var/www/html
depends_on:
- php-fpm
networks:
- wordpress-network
php-fpm:
build:
context:./php-fpm
dockerfile:Dockerfile
volumes:
- wordpress_data:/var/www/html
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
depends_on:
- mysql
networks:
- wordpress-network
mysql:
image:mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
networks:
- wordpress-network
volumes:
wordpress_data:
mysql_data:
networks:
wordpress-network:
driver:bridge
このdocker-compose.ymlでは3つのコンテナを立てる設定が記載されています。
それぞれのコンテナの設定について簡単に記載します。
image:nginx:alpineで、nginxのコンテナはnginx:alpineというイメージを元にコンテナを作成する設定をしています。
ports: “8080:80″で、ローカルホストの8080番ポートにアクセスした際にコンテナの80番ポートに転送する設定をしています。
volumes: ./nginx/nginx.conf:/etc/nginx/nginx.confで、ローカルPCの./nginx/nginx.confとコンテナ環境の/etc/nginx/nginx.confを同期しています。
volumes: ./nginx/default.conf:/etc/nginx/conf.d/default.confでも同様です。
volumes: wordpress_data:/var/www/htmlでは、wordpress_data名前付きボリュームでコンテナ内の/var/www/html にマウントする設定をしています。
名前付きボリュームとは、ローカルPCのDockerで名前を付けて管理するボリュームになります。ローカルPC内の他のDockerコンテナからもマウントして使用可能です。
depends_on: php-fpmで、php-fpmのコンテナを作成した後にnginxコンテナを作成する設定をしています。
networks: wordpress-networkで、wordpress-networkというDockerネットワークにnginxコンテナを属させる設定を行っています。
Dockerネットワークに属すことで、属しているコンテナ間でサービス名を使って名前解決可能になります。
build: context:./php-fpmで、./php-fpmディレクトリをビルドコンテキストとして使用する設定をしています。
build: dockerfile:Dockerfileで、コンテナを立てるときに使用するDockerfileを指定しています。
volumesは、nginxと同様でコンテナ内の/var/www/html に名前付きボリュームのwordpress_dataをマウントしています。
この設定によって、php-fpmコンテナとnginxコンテナの/var/www/htmlは同期されます。
environment: WORDPRESS_DB_HOST:${WORDPRESS_DB_HOST}で、環境変数WORDPRESS_DB_HOSTの値に.envファイルのWORDPRESS_DB_HOSTで指定している値を使用する設定をしています。
他も同様になります。
volumes: mysql_data:/var/lib/mysqlで、このデータベースのデータをmysql_dataという名前付きボリュームで管理することで永続化しています。
他の設定は、他のコンテナのところで説明しているため省略します。
コードができたら下記コマンドで、nginxとphp-fpm、mysqlの3つのコンテナを立てて、ローカルPCのWordPressサイトを構築できます。
docker compose up -d
次にデータベースの接続設定画面になりますが、こちらは.envに書いてある下記内容で入力します。
| 項目名 | 値 |
| データベース名 | wordpress |
| ユーザー名 | wordpress |
| パスワード | wordpress_password |
| データベースホスト | mysql |
| テーブル接頭辞 | wp_ |
そのまま初期設定とテスト記事を書くと、このように記事を表示できました。
これにてローカルPCのWordPress環境構築は完了です。
それでは、AWS環境にWordPressサイトを構築していきます。
まずはECSで実行するためのコンテナイメージファイルを配置するためのECRリポジトリを作成します。
AWSの環境では、MySQLデータベースのところはRDSが担当するので、mysqlコンテナは立てません。
下記のシェルスクリプトを作成し、AWS CLIでECRリポジトリを作成しました。
※下記シェルスクリプトを実行する前に、aws loginなどでAWSの認証を通してください。
. ├── docker-compose.yml ├── .env ├── nginx ├── php-fpm └── create-ecr.sh <- new
#!/bin/bash
# 設定
AWS_REGION="ap-northeast-1"
PROJECT_NAME="wordpress"
echo "=== ECRリポジトリを作成 ==="
# Nginx用ECRリポジトリを作成
echo "Nginx用ECRリポジトリを作成中..."
aws ecr create-repository \
--repository-name ${PROJECT_NAME}-nginx \
--region ${AWS_REGION}
# PHP用ECRリポジトリを作成
echo "PHP用ECRリポジトリを作成中..."
aws ecr create-repository \
--repository-name ${PROJECT_NAME}-php \
--region ${AWS_REGION}
# アカウントIDを取得
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "=== ECRリポジトリ作成完了 ==="
echo "Nginx ECR URL: ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${PROJECT_NAME}-nginx"
echo "PHP ECR URL: ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${PROJECT_NAME}-php"
echo ""
echo "次に ./image-push.sh を実行してイメージをプッシュしてください"
ECRにプッシュするために、nginx用とphp-fpm(とwordpress)用のイメージを作成します。
. ├── docker-compose.yml
├── .env
├── nginx
├── php-fpm
├── create-ecr.sh
└── aws-ecs <- new
├── Dockerfile.nginx <- new
└── Dockerfile.php <- new
Dockerfile.nginx
FROM nginx:alpine
# 必要なパッケージをインストール(EFS用)
RUN apk add --no-cache nfs-utils
# Nginxの設定ファイルをコピー
COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
# WordPressファイル用のディレクトリを作成
RUN mkdir -p /var/www/html
# EFS用のマウントポイントを作成
VOLUME ["/var/www/html"]
# ヘルスチェック用の設定を追加
RUN echo 'server {' > /etc/nginx/conf.d/health.conf && \
echo ' listen 80;' >> /etc/nginx/conf.d/health.conf && \
echo ' server_name _;' >> /etc/nginx/conf.d/health.conf && \
echo ' location /health {' >> /etc/nginx/conf.d/health.conf && \
echo ' access_log off;' >> /etc/nginx/conf.d/health.conf && \
echo ' return 200 "healthy\\n";' >> /etc/nginx/conf.d/health.conf && \
echo ' add_header Content-Type text/plain;' >> /etc/nginx/conf.d/health.conf && \
echo ' }' >> /etc/nginx/conf.d/health.conf && \
echo '}' >> /etc/nginx/conf.d/health.conf
EXPOSE 80
# Nginxをフォアグラウンドで実行
CMD ["nginx", "-g", "daemon off;"]
Dockerfile.php
FROM php:8.2-fpm # 必要なパッケージをインストール RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libzip-dev \ unzip \ nfs-common \ gettext-base \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mysqli \ && docker-php-ext-install zip \ && docker-php-ext-install opcache \ && rm -rf /var/lib/apt/lists/* # WordPressをダウンロードしてインストール RUN curl -O https://wordpress.org/latest.tar.gz \ && tar xzf latest.tar.gz \ && mkdir -p /var/www/html \ && mkdir -p /tmp/wordpress \ && cp -R wordpress/* /tmp/wordpress/ \ && cp -R wordpress/* /var/www/html/ \ && rm -rf wordpress latest.tar.gz \ && chown -R www-data:www-data /var/www/html # wp-config.phpのテンプレートは不要(起動時に作成) # PHP設定をコピー COPY php-fpm/php.ini /usr/local/etc/php/ # 起動スクリプトを作成 RUN echo '#!/bin/bash' > /start.sh && \ echo 'set -e' >> /start.sh && \ echo 'echo "Starting WordPress PHP-FPM container..."' >> /start.sh && \ echo 'echo "DB Host: $WORDPRESS_DB_HOST"' >> /start.sh && \ echo 'echo "DB Name: $WORDPRESS_DB_NAME"' >> /start.sh && \ echo 'echo "DB User: $WORDPRESS_DB_USER"' >> /start.sh && \ echo '' >> /start.sh && \ echo '# WordPressファイルがEFSにない場合はコピー' >> /start.sh && \ echo 'if [ ! -f /var/www/html/wp-config-sample.php ]; then' >> /start.sh && \ echo ' echo "Copying WordPress files to EFS..."' >> /start.sh && \ echo ' cp -R /tmp/wordpress/* /var/www/html/' >> /start.sh && \ echo 'fi' >> /start.sh && \ echo '' >> /start.sh && \ echo '# wp-config.phpを作成' >> /start.sh && \ echo 'cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php' >> /start.sh && \ echo 'sed -i "s/database_name_here/$WORDPRESS_DB_NAME/" /var/www/html/wp-config.php' >> /start.sh && \ echo 'sed -i "s/username_here/$WORDPRESS_DB_USER/" /var/www/html/wp-config.php' >> /start.sh && \ echo 'sed -i "s/password_here/$WORDPRESS_DB_PASSWORD/" /var/www/html/wp-config.php' >> /start.sh && \ echo 'sed -i "s/localhost/$WORDPRESS_DB_HOST/" /var/www/html/wp-config.php' >> /start.sh && \ echo '' >> /start.sh && \ echo '# ファイルの権限を設定' >> /start.sh && \ echo 'chown -R www-data:www-data /var/www/html' >> /start.sh && \ echo '' >> /start.sh && \ echo 'echo "Starting PHP-FPM..."' >> /start.sh && \ echo 'exec php-fpm' >> /start.sh && \ chmod +x /start.sh WORKDIR /var/www/html EXPOSE 9000 CMD ["/start.sh"]
次は、作成したDockerfileでイメージを作成し、ECRリポジトリにプッシュします。
下記のシェルスクリプトを作成し、AWS CLIでプッシュしました。
※下記シェルスクリプトを実行する前に、aws loginなどでAWSの認証を通してください。
. ├── docker-compose.yml ├── .env ├── nginx ├── php-fpm ├── create-ecr.sh ├── image-push.sh <- new └── aws-ecs
#!/bin/bash
# 設定
AWS_REGION="ap-northeast-1"
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
ECR_REPO_BASE="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
NGINX_REPO="${ECR_REPO_BASE}/wordpress-nginx"
PHP_REPO="${ECR_REPO_BASE}/wordpress-php"
echo "=== DockerイメージをECRにプッシュ ==="
# ECRにログイン
echo "ECRにログイン中..."
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO_BASE}
# Nginxイメージをビルド・プッシュ
echo "Nginxイメージをビルド中..."
docker build -f aws-ecs/Dockerfile.nginx -t ${NGINX_REPO}:latest .
docker push ${NGINX_REPO}:latest
# PHPイメージをビルド・プッシュ
echo "PHPイメージをビルド中..."
docker build -f aws-ecs/Dockerfile.php -t ${PHP_REPO}:latest .
docker push ${PHP_REPO}:latest
echo "イメージプッシュ完了!"
echo "次にTerraformでECS環境を構築してください"
ECSでWordpressサイトを公開するために必要なAWSリソースを構築します。
量が多いのでTerraformで構築します。
. ├── docker-compose.yml
├── .env
├── nginx
├── php-fpm
├── create-ecr.sh
├── image-push.sh
├── aws-ecs
└── terraform <- new
├── main.tf <- new
├── output.tf <- new
├── variables.tf <- new
└── terraform.tfvars <- new
各コードについては、本記事の最後に記載しています。
次のコマンドを叩くことでAWSリソースを構築します。
cd terraform terraform init terraform plan terraform apply
albのエンドポイントにアクセスするとWordPressの初期設定画面が開きます。
ローカルPCのWordPressサイトと同様に設定することで、WordPressサイトを公開できました。
Kiroと二人三脚で構築することができました!
Dockerに触れた経験が少なかったので、WordPress環境を作ることで理解が深まったような気がします。
アドベントカレンダー当日の朝まで書いていました。。
./.env
# MySQL設定 MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=wordpress MYSQL_USER=wordpress MYSQL_PASSWORD=wordpress_password # WordPress設定 WORDPRESS_DB_HOST=mysql WORDPRESS_DB_USER=wordpress WORDPRESS_DB_PASSWORD=wordpress_password WORDPRESS_DB_NAME=wordpress
./nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\. {
deny all;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
./nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
}
./php-fpm/Dockerfile
FROM php:8.2-fpm # 必要なパッケージをインストール RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libzip-dev \ unzip \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install mysqli \ && docker-php-ext-install zip \ && docker-php-ext-install opcache # WordPressをダウンロード RUN curl -O https://wordpress.org/latest.tar.gz \ && tar xzf latest.tar.gz \ && cp -R wordpress/* /var/www/html/ \ && rm -rf wordpress latest.tar.gz \ && chown -R www-data:www-data /var/www/html # PHP設定 COPY php.ini /usr/local/etc/php/ WORKDIR /var/www/html EXPOSE 9000
./php-fpm/php.ini
upload_max_filesize = 100M post_max_size = 100M memory_limit = 256M max_execution_time = 300 max_input_vars = 3000 ; OPcache設定 opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=2 opcache.fast_shutdown=1
./terraform/output.tf
output "alb_dns_name" {
description ="DNS name of the load balancer"
value =aws_lb.main.dns_name
}
output "aurora_cluster_endpoint" {
description ="Aurora cluster endpoint"
value =aws_rds_cluster.main.endpoint
}
output "aurora_reader_endpoint" {
description ="Aurora reader endpoint"
value =aws_rds_cluster.main.reader_endpoint
}
output "ecs_cluster_name" {
description ="Name of the ECS cluster"
value =aws_ecs_cluster.main.name
}
output "efs_file_system_id" {
description ="EFS file system ID"
value =aws_efs_file_system.wordpress.id
}
output "efs_dns_name" {
description ="EFS DNS name"
value =aws_efs_file_system.wordpress.dns_name
}
./terraform/variables.tf
variable "aws_region" {
description ="AWS region"
type =string
default ="ap-northeast-1"
}
variable "project_name" {
description ="Project name for resource naming"
type =string
default ="wordpress"
}
variable "db_username" {
description ="Database username"
type =string
default ="wordpress"
}
variable "db_password" {
description ="Database password"
type =string
sensitive =true
}
./terraform/terraform.tfvars
aws_region = "ap-northeast-1" project_name = "wordpress" db_username = "wordpress" db_password = "your-secure-password-here"
./terraform/main.tf
terraform {
required_providers {
aws ={
source="hashicorp/aws"
version="~> 5.57.0"
}
}
}
provider "aws" {
region = var.aws_region
profile ="inaba"
}
# Data sources
data "aws_availability_zones" "available" {
state ="available"
}
data "aws_caller_identity" "current" {}
# VPC
resource "aws_vpc" "main" {
cidr_block ="10.0.0.0/16"
enable_dns_hostnames =true
enable_dns_support =true
tags ={
Name="${var.project_name}-vpc"
}
}
# Internet Gateway
resource "aws_internet_gateway" "main" {
vpc_id =aws_vpc.main.id
tags ={
Name="${var.project_name}-igw"
}
}
# Public Subnets
resource "aws_subnet" "public" {
count =2
vpc_id =aws_vpc.main.id
cidr_block ="10.0.${count.index+1}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch =true
tags ={
Name="${var.project_name}-public-subnet-${count.index+1}"
}
}
# Private Subnets
resource "aws_subnet" "private" {
count =2
vpc_id =aws_vpc.main.id
cidr_block ="10.0.${count.index+10}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
tags ={
Name="${var.project_name}-private-subnet-${count.index+1}"
}
}
# Route Table for Public Subnets
resource "aws_route_table" "public" {
vpc_id =aws_vpc.main.id
route {
cidr_block ="0.0.0.0/0"
gateway_id =aws_internet_gateway.main.id
}
tags ={
Name="${var.project_name}-public-rt"
}
}
# Route Table Associations for Public Subnets
resource "aws_route_table_association" "public" {
count =2
subnet_id =aws_subnet.public[count.index].id
route_table_id =aws_route_table.public.id
}
# NAT Gateway for Private Subnets (1台のみ)
resource "aws_eip" "nat" {
domain ="vpc"
depends_on =[aws_internet_gateway.main]
tags ={
Name="${var.project_name}-nat-eip"
}
}
resource "aws_nat_gateway" "main" {
allocation_id =aws_eip.nat.id
subnet_id =aws_subnet.public[0].id
tags ={
Name="${var.project_name}-nat-gateway"
}
depends_on =[aws_internet_gateway.main]
}
# Route Table for Private Subnets (共通)
resource "aws_route_table" "private" {
vpc_id =aws_vpc.main.id
route {
cidr_block ="0.0.0.0/0"
nat_gateway_id =aws_nat_gateway.main.id
}
tags ={
Name="${var.project_name}-private-rt"
}
}
# Route Table Associations for Private Subnets
resource "aws_route_table_association" "private" {
count =2
subnet_id =aws_subnet.private[count.index].id
route_table_id =aws_route_table.private.id
}
# Security Group for ALB
resource "aws_security_group" "alb" {
name_prefix ="${var.project_name}-alb-"
vpc_id =aws_vpc.main.id
ingress {
description ="HTTP from allowed IP"
from_port =80
to_port =80
protocol ="tcp"
cidr_blocks =["x.x.x.x7/32"]
}
ingress {
description ="HTTPS from allowed IP"
from_port =443
to_port =443
protocol ="tcp"
cidr_blocks =["x.x.x.x/32"]
}
egress {
description ="All outbound traffic"
from_port =0
to_port =0
protocol ="-1"
cidr_blocks =["0.0.0.0/0"]
}
tags ={
Name="${var.project_name}-alb-sg"
}
lifecycle {
create_before_destroy =true
}
}
# Security Group for ECS
resource "aws_security_group" "ecs" {
name_prefix ="${var.project_name}-ecs-"
vpc_id =aws_vpc.main.id
ingress {
description ="HTTP from ALB"
from_port =80
to_port =80
protocol ="tcp"
security_groups =[aws_security_group.alb.id]
}
egress {
description ="All outbound traffic"
from_port =0
to_port =0
protocol ="-1"
cidr_blocks =["0.0.0.0/0"]
}
tags ={
Name="${var.project_name}-ecs-sg"
}
lifecycle {
create_before_destroy =true
}
}
# Security Group for EFS
resource "aws_security_group" "efs" {
name_prefix ="${var.project_name}-efs-"
vpc_id =aws_vpc.main.id
ingress {
description ="NFS from ECS"
from_port =2049
to_port =2049
protocol ="tcp"
security_groups =[aws_security_group.ecs.id]
}
egress {
description ="All outbound traffic"
from_port =0
to_port =0
protocol ="-1"
cidr_blocks =["0.0.0.0/0"]
}
tags ={
Name="${var.project_name}-efs-sg"
}
lifecycle {
create_before_destroy =true
}
}
# Security Group for RDS
resource "aws_security_group" "rds" {
name_prefix ="${var.project_name}-rds-"
vpc_id =aws_vpc.main.id
ingress {
description ="MySQL from ECS"
from_port =3306
to_port =3306
protocol ="tcp"
security_groups =[aws_security_group.ecs.id]
}
egress {
description ="All outbound traffic"
from_port =0
to_port =0
protocol ="-1"
cidr_blocks =["0.0.0.0/0"]
}
tags ={
Name="${var.project_name}-rds-sg"
}
lifecycle {
create_before_destroy =true
}
}
# EFS File System
resource "aws_efs_file_system" "wordpress" {
creation_token ="${var.project_name}-efs"
performance_mode ="generalPurpose"
throughput_mode ="provisioned"
provisioned_throughput_in_mibps =10
encrypted =true
tags ={
Name="${var.project_name}-efs"
}
}
# EFS Mount Targets
resource "aws_efs_mount_target" "wordpress" {
count =2
file_system_id =aws_efs_file_system.wordpress.id
subnet_id =aws_subnet.private[count.index].id
security_groups =[aws_security_group.efs.id]
}
# Aurora Subnet Group
resource "aws_db_subnet_group" "main" {
name ="${var.project_name}-aurora-subnet-group"
subnet_ids =aws_subnet.private[*].id
tags ={
Name="${var.project_name}-aurora-subnet-group"
}
}
# Aurora Cluster
resource "aws_rds_cluster" "main" {
cluster_identifier ="${var.project_name}-aurora-cluster"
engine ="aurora-mysql"
engine_version ="8.0.mysql_aurora.3.04.2"
database_name ="wordpress"
master_username = var.db_username
master_password = var.db_password
db_subnet_group_name =aws_db_subnet_group.main.name
vpc_security_group_ids =[aws_security_group.rds.id]
backup_retention_period =7
preferred_backup_window ="03:00-04:00"
skip_final_snapshot =true
deletion_protection =false
tags ={
Name="${var.project_name}-aurora-cluster"
}
}
# Aurora Instance (1台のみ)
resource "aws_rds_cluster_instance" "main" {
identifier ="${var.project_name}-aurora-instance"
cluster_identifier =aws_rds_cluster.main.id
instance_class ="db.r5.large"
engine =aws_rds_cluster.main.engine
engine_version =aws_rds_cluster.main.engine_version
tags ={
Name="${var.project_name}-aurora-instance"
}
}
# CloudWatch Log Group
resource "aws_cloudwatch_log_group" "ecs" {
name ="/ecs/${var.project_name}"
retention_in_days =7
tags ={
Name="${var.project_name}-log-group"
}
}
# ECS Cluster
resource "aws_ecs_cluster" "main" {
name ="${var.project_name}-cluster"
tags ={
Name="${var.project_name}-cluster"
}
}
# IAM Role for ECS Execution
resource "aws_iam_role" "ecs_execution" {
name ="${var.project_name}-ecs-execution-role"
assume_role_policy =jsonencode({
Version="2012-10-17"
Statement= [
{
Action="sts:AssumeRole"
Effect="Allow"
Principal= {
Service="ecs-tasks.amazonaws.com"
}
}
]
})
tags ={
Name="${var.project_name}-ecs-execution-role"
}
}
resource "aws_iam_role_policy_attachment" "ecs_execution" {
role =aws_iam_role.ecs_execution.name
policy_arn ="arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
# CloudWatch Logs用のIAMポリシー
resource "aws_iam_role_policy" "ecs_logs" {
name ="${var.project_name}-ecs-logs-policy"
role =aws_iam_role.ecs_execution.id
policy =jsonencode({
Version="2012-10-17"
Statement= [
{
Effect="Allow"
Action= [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
Resource="arn:aws:logs:${var.aws_region}:${data.aws_caller_identity.current.account_id}:*"
}
]
})
}
# ECS Task Definition
resource "aws_ecs_task_definition" "main" {
family = var.project_name
network_mode ="awsvpc"
requires_compatibilities =["FARGATE"]
cpu ="512"
memory ="1024"
execution_role_arn =aws_iam_role.ecs_execution.arn
volume {
name ="wordpress-efs"
efs_volume_configuration {
file_system_id =aws_efs_file_system.wordpress.id
root_directory ="/"
}
}
container_definitions =jsonencode([
{
name="nginx"
image="${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.aws_region}.amazonaws.com/${var.project_name}-nginx:latest"
portMappings= [
{
containerPort=80
protocol="tcp"
}
]
essential= true
dependsOn= [
{
containerName="php-fpm"
condition="START"
}
]
mountPoints= [
{
sourceVolume="wordpress-efs"
containerPath="/var/www/html"
readOnly= false
}
]
logConfiguration= {
logDriver="awslogs"
options= {
"awslogs-group" = aws_cloudwatch_log_group.ecs.name
"awslogs-region" = var.aws_region
"awslogs-stream-prefix" = "nginx"
}
}
},
{
name="php-fpm"
image="${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.aws_region}.amazonaws.com/${var.project_name}-php:latest"
essential= true
mountPoints= [
{
sourceVolume="wordpress-efs"
containerPath="/var/www/html"
readOnly= false
}
]
environment= [
{
name="WORDPRESS_DB_HOST"
value= aws_rds_cluster.main.endpoint
},
{
name="WORDPRESS_DB_NAME"
value= aws_rds_cluster.main.database_name
},
{
name="WORDPRESS_DB_USER"
value= aws_rds_cluster.main.master_username
},
{
name="WORDPRESS_DB_PASSWORD"
value=var.db_password
}
]
logConfiguration= {
logDriver="awslogs"
options= {
"awslogs-group" = aws_cloudwatch_log_group.ecs.name
"awslogs-region" = var.aws_region
"awslogs-stream-prefix" = "php-fpm"
}
}
}
])
tags ={
Name="${var.project_name}-task"
}
}
# Application Load Balancer
resource "aws_lb" "main" {
name ="${var.project_name}-alb"
internal =false
load_balancer_type ="application"
security_groups =[aws_security_group.alb.id]
subnets =aws_subnet.public[*].id
enable_deletion_protection =false
tags ={
Name="${var.project_name}-alb"
}
}
# Target Group
resource "aws_lb_target_group" "main" {
name ="${var.project_name}-tg"
port =80
protocol ="HTTP"
vpc_id =aws_vpc.main.id
target_type ="ip"
health_check {
enabled =true
healthy_threshold =2
interval =30
matcher ="200,302"
path ="/"
port ="traffic-port"
protocol ="HTTP"
timeout =5
unhealthy_threshold =2
}
tags ={
Name="${var.project_name}-tg"
}
}
# ALB Listener
resource "aws_lb_listener" "main" {
load_balancer_arn =aws_lb.main.arn
port ="80"
protocol ="HTTP"
default_action {
type ="forward"
target_group_arn =aws_lb_target_group.main.arn
}
}
# ECS Service
resource "aws_ecs_service" "main" {
name ="${var.project_name}-service"
cluster =aws_ecs_cluster.main.id
task_definition =aws_ecs_task_definition.main.arn
desired_count =1
launch_type ="FARGATE"
network_configuration {
subnets =aws_subnet.private[*].id
security_groups =[aws_security_group.ecs.id]
assign_public_ip =false
}
load_balancer {
target_group_arn =aws_lb_target_group.main.arn
container_name ="nginx"
container_port =80
}
depends_on =[
aws_lb_listener.main,
aws_efs_mount_target.wordpress
]
tags ={
Name="${var.project_name}-service"
}
}
本記事は TechHarmony Advent Calendar 2025 12/21付の記事です。 |
皆さんこんにちは。UGです。
クリスマスが今年もやってくるということで、サンタクロースはなぜ赤い服を着ているのでしょうか?
と今ではサンタクロースよりもカーネル・サンダースという白髭を好む私はふと疑問に思いました。
カーネルサンダースも思えば白と赤だなぁ?というのはおいておいて、サンタクロースの服が赤というのは、サンタクロースのモデルとされるセント・ニコラスが生前、教会の儀式の際に着ていた服の色がもとになったと言われているみたいです。
あとはコカ・コーラの宣伝によるものらしいです。
ちなみに私のチャッピー君は「20世紀初頭の印刷技術で赤が最も再現しやすかったから」と教えてくれましたが、調べても出てこなかったので問い詰めたところ嘘と白状しました。。。
皆さんもハルシネーションには気を付けましょう。
さて本題ですが、今回は新規作成したIAMユーザのMFA設定を自動でチェックし、設定されていなければ自動で無効化する仕組みを実装してみたのでご紹介出来たらなと思います!
まず先に構成やコードを載せておきますので、説明よりも早く実装したいという方は参考にしていただければと思います。
前提:CloudTrailが有効化されていること
構成:EventBrige + Step Functions
注意点:バージニア北部(us-east-1)で構築すること
EventBridgeルール:
{
"source": ["aws.iam"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["CreateUser"]
}
}
Step Functions ASL:
{
"Comment": "A description of my state machine",
"StartAt": "Wait",
"States": {
"Wait": {
"Type": "Wait",
"Seconds": 86400,
"Next": "ListMFADevices",
"Assign": {
"UserName.$": "$.detail.requestParameters.userName"
}
},
"ListMFADevices": {
"Type": "Task",
"Parameters": {
"UserName.$": "$UserName"
},
"Resource": "arn:aws:states:::aws-sdk:iam:listMFADevices",
"Next": "GetMfaDeviceCount"
},
"GetMfaDeviceCount": {
"Type": "Pass",
"Next": "CheckMFA",
"Parameters": {
"MfaDeviceCount.$": "States.ArrayLength($.MfaDevices)"
}
},
"CheckMFA": {
"Type": "Choice",
"Choices": [
{
"Next": "成功",
"Variable": "$.MfaDeviceCount",
"NumericGreaterThan": 0
}
],
"Default": "DeleteLoginProfile"
},
"DeleteLoginProfile": {
"Type": "Task",
"Parameters": {
"UserName.$": "$UserName"
},
"Resource": "arn:aws:states:::aws-sdk:iam:deleteLoginProfile",
"Next": "Disabled Notification"
},
"Disabled Notification": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "<トピックARN>",
"Message.$": "States.Format('User {} did not set MFA and was disabled.', $UserName)",
"Subject": "IAM User MFA Not Set"
},
"End": true
},
"成功": {
"Type": "Succeed"
}
},
"QueryLanguage": "JSONPath"
}こ
※SNSはおまけなので、削除するか通知させたければ”TopicArn”の部分をご自身で作成したものに変更してください。
どこの環境でもMFAを設定することはセキュリティを担保するために必須なものとなっているかと思います。
とは言えMFAを設定するのはめんどくさいですし、純粋に設定し忘れていたという問題もあります。
(狙ったわけではないですが、思えば前回MFAめんどくさいでProtonのブログ書いてました笑)
そのための対策として、MFAを設定しないとリソースを操作することができないIAMポリシーを設定しているところも多いのではないでしょうか?
しかし、IAMポリシー対策はリソース操作はできないものの、マネージメントコンソールにアクセスすることは可能です。
そういったリスクも回避したいといった場合に、MFAを設定していないIAMユーザーを無効化してしまうというのも1つの対策となります。
ただMFAが設定されているのかを確認して設定されていなければ無効化、なんてことを手動でやっていたら大変です。。。
なので手動が大変なら自動化してしまえ!ということで自動化させてみました。
前提事項として、CloudTrailが有効化されている必要があります。
理由としては、CloudTrailで記録される「CreateUser」というIAMユーザーが作成された時のイベントをトリガーに今回の自動化フローは動くためです。
みなさん問題はないかと思いますが、CloudTrailは有効化必須のサービスなので、もし有効化されていないので、本ブログ内容関係なくすぐ有効化しましょう!
今回の自動化のざっくり流れは
となっており、EventBrigeとStep Functionsのみで実現することができます。
では詳しくご紹介していきます。
前提の節でも触れましたが、IAMユーザーが作成されると「CreateUser」イベントが記録されます。
このイベントをEventBridgeルールで検出し、Step Functionsを開始します。
EventBridgeルール:
{
"source": ["aws.iam"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["CreateUser"]
}
}
Step Functionsのステートマシンの構成は以下のようになっています。
細かい設定の説明は後回しにして、先に役割単位でまとめて説明していきます。
まず、「Wait」でMFA登録有無の確認までの時間を設定しています。
例えば、IAMユーザー作成が24時間以内にMFAを設定することといったルールの場合は、Waitに86400秒を設定します。
次に、「IAM: ListMFADevices」「Pass state」「Choice state」の部分で、IAMユーザーのMFAの設定有無の確認を行っています。
設定されているのであれば、「Succeed state」に遷移し、特に何も行いません。

設定されていなければ、「DeleteLoginProfile」でIAMユーザーの無効化をします。
「SNS: Publish」はおまけですが、「無効化しましたよ」の通知用となります。
ざっくりだと以上のようになっていて、各ステートごとの細かい設定についても説明します。
まず、「Wait」では待機時間の秒数とともに、EventBrigeからの入力値である”detail.requestParameters.userName”を変数へ格納しています。
“detail.requestParameters.userName”は作成されたIAMユーザーの名前となっており、他のステートで利用するため最初に変数へ格納しています。
次に、「IAM: ListMFADevices」でIAMユーザーのMFAデバイスリストを取得してきています。
MFA設定がされていない場合の出力結果:
{
"IsTruncated": false,
"MfaDevices": []
}
しかし、「IAM: ListMFADevices」の出力結果からでは、「Choice state」で分岐をさせることができません。
そのため、「Pass state」の中で”States.ArrayLength($.MfaDevices)”によってパラメーターの変換を行っています。
パラメータ変換後:
{
"MfaDeviceCount": 0
}
これにより、MFAの登録デバイスを数値で表せるようにして、「Choice state」にて”$.MfaDeviceCount > 0″の条件でMFAの登録有無の分岐を実現しています。

そして、MFA登録がされていなければ、「DeleteLoginProfile」でIAMユーザーを無効化しています。
最後に注意点ですが、今回ご紹介した構成は『バージニア北部(us-east-1)』で構築する必要がございます。
と言いますのも、「CreateUser」イベントはバージニア北部リージョンに記録されるためです。
そのため、そのほかのリージョンのEventBrigeで検出しようとしても、検出されず、となってしまいます。
公式ドキュメントにも⚠重要と明記されていましたが、自分もこの仕様を知らず、最初に東京リージョンに作成して、なんで動かないんだ?とつまづきました笑
今回のメインサービスであるIAMがグローバルサービスなので、バージニア北部リージョンで実装することに大きな問題はないかと思いますが、ご注意いただければと思います。
ということでMFA設定をしていなければ自動で無効化をご紹介させていただきました。
MFAが本当に役に立っているのか?みたいな話もありますが、昨今大きなセキュリティ問題も発生しており、セキュリティの意識や要望は強くなってくると思われます。
そんな中でこんなのもあるんだな~と本ブログが一助になればよいかな~と。
最後までお読みいただきありがとうございました!!
]]> 本記事は TechHarmony Advent Calendar 2025 12/20付の記事です。 |
高知の喫茶店からこんにちは。出張中のMasedatiです。
高知には独自のモーニング文化があるようで、今日はおにぎりと味噌汁、オムレツとゆで卵、バターたっぷりの食パンとサラダをモリモリ食べながらこの記事を執筆しています。
さて、今回の内容は以下のAWSアップデートについてです。
ざっくり言うと「ブラウザの中で、そのままAIアシスト(要約・Q&A・社内ナレッジ参照・アクション実行・ファイル分析)ができ、その拡張機能がQuick Flowsでもサポート可能になった」とのこと。
ChromeやFirefoxのブラウザ内でQuick Suiteと対話することができます。
ブラウザ拡張機能をインストールして、Quick Suiteのアカウント名とユーザ名でサインインしてみましょう。
無事サインインが完了すると、現在開いているWebページが表示されます。+ボタンを押すことで、現在開いているブラウザのタブをチャットの会話コンテキストに追加できます。
追加後は、そのウェブページの内容について質問したり、分析したりできるようになります。
例えば、Techブログを書くとき参考にしたAWSドキュメント等を+ボタンでQuick Suiteに登録しておけば、ブログ執筆途中の画面で記載内容の添削やレビューを行うことが可能となります。(今この記事を執筆に使ってみましたが、とても便利です)
さて、本題ですが、このブラウザ拡張機能からQuick Flowsを実施することができるようになりました。
Amazon Quick Flowsは、Amazon Quick Suiteの機能の1つで、自然言語で命令するだけで、複数のステップのワークフローを作成することができるものです。
今回Quick Flowsをサポートすることになり、ブラウザを離れることなくQuick Flowsを直接実行できます。
デモとして、ブログ記事がガイドラインに違反していないかどうかチェックするワークフローを作成してみます。
まず、Quick Suiteのスペースに「ブログ執筆ガイドライン」を格納します。
# ブログ執筆ガイドライン ## 文体・トーン * 文体: です・ます調で統一 * トーン: 親しみやすく、かつ専門的 * 一人称: 「私」または「筆者」 ## 表記ルール * 製品名・サービス名は正確であること * 半角数字を使用すること: 「3つ」「20個」 * 単位は全角: 「10MB」「30日間」 * 括弧: 全角()を使用 * 引用符: 「」を使用(""は避ける) * 中黒: ・を使用 ## 禁止用語・推奨表現 * 過度にカジュアルな表現は用いない(「めっちゃ」「ヤバい」など) * 曖昧な表現は用いない(「たぶん」「かもしれない」など) * 禁止用語 - 「簡単」→ 「シンプル」「わかりやすい」を使用 - 「誰でも」→ 「技術的な知識がなくても」など具体的に - 「すごい」→ 「強力な」「効果的な」など具体的に - 「便利」→ 具体的なメリットを記述
次にFlowを作成します。
上記のとおりフローの作成は自然言語で行います。
ブログ記事を、スペースに格納した執筆ガイドラインに基づいてレビューを行ってもらいます。
「生成」ボタンを押すと以下のようなワークフローが完成しました。

拡張機能の「F」ボタンから上記ワークフローを実施することができます。
さっそくワークフローを実行して、過去の私の記事をレビューしてもらいました。
では、私は緊急対応の修正をしていくので、ここで失礼します。
よいクリスマスを!
本記事は TechHarmony Advent Calendar 2025 12/19付の記事です。 |
こんにちは。社会人歴1年目、AWS歴も1年目の新人tknこと髙野です。
今年初めて紅茶のアドベントカレンダーを朝食のお供に買ったのですが、先日何の偶然かお味噌汁とハーブティーという組合せが誕生しました。食の常識を覆す出来事に、朝からとてもよく目が覚めました。アドベントカレンダーは偉大です。。
さて先日、私がとある指令を受けたことからこのブログは始まります。

名前が異なっているが、役割が同じAmazon EventBridgeのルールが2つ作成されている(EventRule-a, EventRule-b)。なぜ作成されたのか、どちらが現在使用されているものなのか調査してほしい。
もちろん実際はとても詳細にご説明いただきましたが、、ざっくりお伝えするとこのような指令を受けました。
以下のアーキテクチャ図は私が今回調査した環境を抜粋して表現したものであり、水色の丸で囲まれたEventRuleが今回の調査対象です。
また、調査対象のリソースの特徴・設定は以下の通りです。
この環境を見たとき私は「AWS CloudTrailを見ればとりあえず何か分かるかな?」と単純に考えて調査を進め、行き詰まることになりました…。
そこで今回のブログでは、AWS初心者が上記環境のリソースの作成履歴を調べた際に役立ったログや、ログに含めるべきだと思った情報についてお伝えしたいと思います。
私の調査方法をご説明する前に、今回の調査で最終的に分かったことをお伝えします。
以上の結果より、私は「ルールの作成を担うLambda関数において、命名規則のコードが変更されたことで別名で同じ役割のEventRuleが作成された」という仮説を最有力のEventRule誕生理由としてこの調査を終えることになりました。
最終的に、謎の大解明まで持っていくことができなかったのが悔しいところです。。
さて、私が躓いたポイントについてお話するにあたり、調査環境の特徴について追加で以下に示します。
ここですね!このポイントに気づくのに私は多くの時間を使いました。。
AWS初心者ひいてはログ調査初心者でもある私は、最初に環境の作成時期や稼働時期を調べることをせずに、とりあえず色々なログを見る!という行動に突っ走っておりました。その結果、ルールの稼働記録を見るための操作・呼び出しログばかりを探しては見つからずに困惑することになりました。
もし頻繁に稼働しているリソースを調査する場合は、CloudTrailで以下のようなログを中心に調査を進めることができるでしょう。
ここで、対象のEventRuleはどちらも同じイベントパターンであるため、今から動作検証しても両方とも検知・作動してしまいます。そこで私は、EventRuleやLambdaの動作状況に関する調査から、誕生の歴史に関する調査に移ることにしました。
以下では、リソースの作成履歴を調査する中で役立ったログについてご紹介します。
ログストリームとは、CloudWatch Logsが取集したログの中で同一のソースをもつログイベントのことであり、ロググループとは「保持、モニタリング、アクセス制御について同じ設定を共有するログストリームのグループ」のことです。(参照:ロググループとログストリームの操作 – Amazon CloudWatch Logs)
今回の調査環境では、EventRuleの作成用とターゲット用のLambdaそれぞれに、CloudWatch Logsへのログの書き込み権限を付与していました。CloudWatch Logsへのログの書き込みに必要な権限は、logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEventsの3つであり、これらはAWSLambdaBasicExecutionRoleというAWSマネージドポリシーをLambdaに付与することで簡単に実現できます。(参照:AWSLambdaBasicExecutionRole – AWS 管理ポリシー)
上記の権限を付与することで、以下のようにLambda関数がいつ実行されたのかが自動で記録され、EventRuleの作成日時を知ることができました。
また、Lambda関数ではPythonの標準ライブラリであるloggingモジュールを使用して、logger.info(f"event: {json.dumps(event)}")のようにイベント内容を出力することで、以下のようなイベントの詳細な処理内容を確認することができました。
{
"originalEvent": {
"version": "0",
"id": "XXXXXXXX",
"detail-type": "API Call",
"source": "XXXXXXXX",
"account": "123456789012",
"time": "2025-12-15T06:57:58Z",
"region": "ap-northeast-1",
"resources": [],
"detail": {
"eventVersion": "1.0",
"userIdentity": {},
"eventTime": "2025-12-15T06:57:58Z",
"eventSource": "XXXXXXXX",
"eventName": "CreateEventRule",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "XXXXXXXX",
"userAgent": "XXXXXXXX",
"requestParameters": {/* イベントの処理内容 */},
"requestID": "XXXXXXXX",
"eventID": "XXXXXXXX",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"sessionCredentialFromConsole": "true"
}
},
"createRuleName": "EventRuleFunction"
}
しかし、上記のようなルールログはEventRuleのプロパティなどをもとに出力するものであり、ルール名の情報は反映されません。そこで調査環境では、Lambda関数内にlogger.info(f"EventRule created. : {rule_name}")を追加することで、作成したルール名を含むログを出力していました。このコードが無ければEventRule-aとbどちらの作成日時か正確に判別できなかったため、ログ設計の重要性を感じました。
また、このログをEventRule createdというキーワードでフィルターすることで、各EventRuleの作成日時を時系列順で取得することができ、命名規則が途中からEventRule-a→EventRule-bのように変化していることに気づくことができました。Lambda関数の作者の方に感謝しかありません。。
AWS ConfigとはAWSアカウント内のリソースの設定変更を監視し、記録するサービスです。ConfigはAWSアカウント発行後に一度有効化し、記録する対象リソースを指定することで情報の記録が始まります。
ここでは、リソースタイムラインを確認することで、あるリソースの作成時の構成から現在の構成までの変更履歴を見ることができます。
しかし、ここで注意すべきは必ずしもリソース情報が最も古い地点=リソースの作成日時とは限らないことです。
リソースタイムラインで確認できるリソースの設定情報の中に、"configurationItemStatus": "ResourceDiscovered"がある場合、それはConfigが対象リソースを初めて検出したことを示します。そのため、Configが有効化される前に作成されたリソースなどは、Configを有効化してリソースが発見された時点で追跡が開始されるため、Configのログをリソース作成日時の根拠とすることは望ましくありません。
一方で、Configの便利な点として削除したリソースの構成履歴も確認できる点が挙げられます。
以下のように削除したリソースも含めて検索できるうえ、存在した期間、変更履歴、削除日などを確認することが可能です。
今回の調査環境では、このリソース履歴においてEventRule-aと同一の命名規則で他の役割をもつEventRuleが全て削除済であることが確認できました。一方で、EventRule-bと同一の命名規則のEventRuleは現役であったことから、EventRule-aが不要な関数である可能性が高いと判断することができました。
これまでの調査結果より、「EventRule-aはEventRule-bより先に作成された」、「EventRule-aと同様の命名規則のEventRuleは既に全て削除されている」という点から、EventRule-aが不要なEventRuleである可能性が高まりました。
そこで仮説をより強固にするべく、EventRuleを作成するLambda関数の命名規則コードの変遷を追跡しようと、Lambda関数のバージョンやCodeCommitのコミット履歴の確認を試みました。が、、
上記の結果より、「EventRule-aが作成された後に、Lambda関数においてEventRuleの命名規則の変更があり、EventRule-bが作成されてその後使用されている…のではないか?」という結論に終わりました。。
以上の結果より、各リソースにおいてログに含めてあると調査がしやすいのではないかと感じた情報をまとめます。
EventBridge/Lambdaについては、どちらの手法も動的にEventRuleを作成する調査対象のような環境では適用しやすいうえ、これによりLambdaのCloudWatchロググループにおいて、Lambdaを呼び出したEventRule名を無期限の間確認可能になることが期待できます。
CodeCommitについては、developやmasterなど複数人で共有するブランチでは完成版のコミットを意識する必要があるものの、featureなど一時的/個人的なブランチではこまめにコミットして履歴を残すことで、将来の自身・チームメンバーがコード設計の意図を辿りやすくなることが考えられます。
今回、調査を通してログが環境理解にどのように役立つかを身をもって学ぶことができました。今回学んだ”将来環境を引き継ぐ人に向けた開発”の視点を、今後の開発業務に活かしていきたいと思います。
初めてのブログで拙いところも多々あったかと思いますが、いかがでしたでしょうか。
今後、様々なAWSリソースについて学びを深めるとともに、このようなアウトプットのスキルも向上させていきたいと願うばかりです。
最後までお付き合いいただき、誠にありがとうございました。
クリスマス・イブまであと6日、皆さま体調に気を付けてお過ごしください!
本記事は TechHarmony Advent Calendar 2025 12/19付の記事です。 |
こんにちは、ひるたんぬです。
最近は急速に気温が下がってきましたね…
私は寒いときにブルッと鳥肌が立つのですが、なぜ感動したときや恐怖を感じたときも同じような反応をするのでしょうか?
さて、そのような探索を進めるためには、鳥肌が生じているときの脳の活動の様子を調べることが有効です。ところが、これがなかなか簡単ではありません。…(中略)…脳活動を測定するというさらに慣れない環境だと、鳥肌はもっと立ちにくくなることを覚悟しなければならないでしょう。これでは実験データを集めるだけでも気の遠くなる仕事になってしまいます。こうした事情から、鳥肌を測定して脳の活動と関連づけるという研究はこれまでのところ行われてきていないのです。
引用:academist「恐怖、感動、驚き——さまざまな感情体験で鳥肌が生じるのはなぜ?」
調査をする中で、傾向論のようなものはありましたが、具体的に鳥肌が立つメカニズムまで解明された研究は見当たりませんでした。
人間の身体の不思議の一つですね。
さて、今回は技術的な話とは少し離れますが、AWSのリージョンについて少し紐解いていきたいと思います。
AWSでは、記事執筆時点(2025年12月)で37個のリージョンが存在しています。
日本国内でも「東京リージョン」や「大阪リージョン」が存在し、AWSに触れたことがある方なら一度は聞いたことがあるのではないかと思います。
そんなAWSのリージョンの中で「バージニア北部リージョン」は他のリージョンとは少々事情が異なります。
というのも、バージニア北部リージョンでないといけない場合(例:CloudFrontに紐づけるACMの証明書)や多くの新サービスの提供がバージニア北部リージョンから始まるなど…AWSに必須なリージョンと言っても過言ではありません。
そんな「バージニア北部リージョン」ですが、そもそもなぜ「バージニア北部」にリージョンが設立されたのでしょうか?
そもそも私は州名すら聞いたことがなかったので、その理由を調べてみました。
まずは、バージニア州について少し調べてみます。
バージニア州はアメリカ本土の東部に位置する州です。
2020年現在の人口は8,654,542人で、12番目に人口が多い州です。
では、肝心な理由について考察していきます。
バージニア州北部には、通称「データセンター・アレイ」と呼ばれる世界最大のデータセンター集積地があります。
ここにデータセンターが集まってきた理由として、以下が挙げられます。
1960~70年代に米国防総省ARPAが始めたARPANETの一大拠点がバージニア州アーリントンに置かれ、1980年代には東海岸初期のインターネットエクスチェンジMAE-Eastがタイソンコーナー(バージニア州)に開設されるなど、この地域は早くから通信インフラの要衝となっていました。
今日では、世界中のインターネットトラフィックの70%がこの「データセンター・アレイ」を通るまでになったとも言われています。
データセンターの稼働に欠かせない要因の一つとして、安定した電力供給が挙げられます。バージニアの地域には石炭ベルト地帯にある電力会社が、火力発電をメインに電力供給をしています。このこともあり、この地域の電気料金は、アメリカの平均より34%も安価だということです。
今後は石炭利用だけでなく、シェールガスや天然ガスでの発電などが進められるようです。


データセンターの冷却には欠かせない大量の水ですが、バージニア州には2008年に水処理施設が完成しました。
この処理施設の再生水を冷却に再利用することにより、データーセンター事業者は安価に大量の水を使用することができ、水道事業者は従来捨てていた水に、大きな処理コストをかけることなく値段をつけて販売できるようになりました。
バージニア州では、新規資本投資が1億5000万ドル以上、50人以上の新規雇用を生み出すプロジェクトでは、導入されるサーバーなどの危機に対して、各種税金が免除されるという制度もあります。
上述した通り、「バージニア北部リージョン」が設立された理由としては「通信・電力・水」といったインフラに加え、「税制」面でのメリットが大きかったため、と考えられます。
では、他のリージョンが設立された理由は何なのでしょうか?
例えば、東京リージョンの例を見てみます。
東京リージョンは2011年3月に提供が開始されました。その時のインタビュー記事を見てみると、
顧客の多くは米国(東部および西部)やシンガポールのデータセンターを利用している。この物理的な距離によって「遅延(レイテンシ)」と「国外へのデータ配備」という問題が発生していたが、その解消が国内ユーザーの大きな要望だった
引用:ZDNET「AWS幹部に国内データセンター設立の背景を聞く–普及には「楽観的」」
AWSを使いたいがデータは日本に置かなければならない、だからデータが日本にあることを確認したいというニーズがあった。
引用:ZDNET「AWS幹部に国内データセンター設立の背景を聞く–普及には「楽観的」」
と、顧客ニーズがきっかけになっていることが伺えます。
今回は、普段何気なく使っているAWSリージョンの設立背景について、自分なりに調査してみました。
バージニア北部リージョンはインフラ・税制上のメリットから、それ以外のリージョンは顧客ニーズからという結論に至り、バージニア北部リージョンでのリソース使用料金が、他のリージョンよりも比較的安価な理由も頷ける結果となりました。
こんにちは。
先日私の所属している部でもGoogleのNotebookLM Enterpriseライセンスを購入しまして、進化したNotebookLMが使えるようになりました。
ということで、今回は、そんなNotebookLMとはどんなサービスなのか、特徴やメリットは?使い方は?、を中心にご紹介していきたいと思います。NotebookLMが気になっている方や導入を検討している方の参考になれば幸いです。
NotebookLMは、Googleが提供する最新のAIノート管理サービスです。AI技術を活用することで、大量の情報やメモを効率的に整理したり、必要な情報を素早く検索したりすることが可能になっています。次世代型の知的生産ツールとして注目を集めており、企業や教育現場など様々なシーンで導入が進んでいるサービスです。
近年、AI技術の進歩は目覚ましく、私たちの働き方や生活を大きく変えつつあります。とくに自然言語処理の分野では、ChatGPTやGemini、Microsoft Copilotといった生成AIが注目を集め、それぞれがドキュメント作成やアイデア出し、業務自動化など、さまざまなシーンで活用されるようになりました。
私もプライベートではChatGPT Plusを利用しており、自分好みの応答を返してくれるように学習させていたり、勉強する際には音声会話を利用していたりするほど、もはやAIは自然に生活に溶け込んでいると言えますね。
NotebookLMは、AIを活用したノート管理・情報整理のためのサービスであり、膨大なメモやドキュメントの中から必要な情報を効率よく見つけ出したり、複数の資料を横断的にまとめたりできるのが特徴です。
本記事では、このNotebookLMの概要や特徴について詳しくご紹介していきます。
NotebookLMでは以下のファイルや情報源をソースとして指定できます。
読み込ませるソースが決まっていないときは、右上の「Discover sources」から、調査したいことについて検索をかけると合致するソースを見つけて提示してくれます。
| NotebookLM(無料版) | NotebookLM for Enterprise | |
| 機能 | ノートブックやメモの作成、ソースの追加や削除、AIとのチャットによるコンテンツ質問、音声生成、インタラクティブモード、ガイドブック機能、そしてアナリティクス(分析機能)など。
情報の整理や共有、分析までを一元的に効率よく行うことが可能。 |
ノートブックやメモの作成、ソースの追加や削除、AIとのチャットによるコンテンツ質問、音声生成、インタラクティブモード、ガイドブック機能、そしてアナリティクス(分析機能)など。
情報の整理や共有、分析までを一元的に効率よく行うことが可能。(同様) |
| ソース | Google ドキュメントとスライド、コピーしたテキスト、公開 URL、YouTube 動画、PDF、マークダウン、音声ファイル | Google ドキュメントとスライド、コピーしたテキスト、公開 URL、YouTube 動画、PDF、マークダウン、音声ファイル、DOCX、PPTX、XLSX |
| 共有 | 共有リンクを作成 | アクセス権限を設定し、組織内の特定のユーザーへ共有が可能 |
| 最大ノートブック数 | 100 | 500 |
| ノートブック当たりソース数 | 50 | 300 |
| 処理回数 | チャットクエリ:50
音声概要生成:3 |
チャットクエリ:500
音声概要生成:20 |
最後までお読みいただき、ありがとうございました。
AI技術は今となっては日常生活にも仕事をする上でも欠かせないものになりつつあると思います。新たなAI技術はどう活用していくかが大切になりますが、今回のNotebookLMは多量の情報の整理や資料検索機能に長けていると感じました。マインドマップや音声・動画による要約は現時点では私はあまり利用していませんが、大量データを読み込む必要がある、でも時間がない、といった人には移動中や通退勤中の”ながら作業”を可能にするので、便利なツールになりえるかもしれません。
操作が直感的で、初めてでも迷うことなく使い始められる点も良かったと感じました。
これから導入を検討している方や、効率化を目指したい方の参考になれば幸いです。
前回記事からの続きです。
まず、クラスタ構成については、以下の通りです。
今回は、HUBを用いて、1号機と2号機を接続し、同じネットワークアドレスの設定をしていきます。
仮想IPリソースを作成し、1号機と2号機にインストールしたPacemakerでリソース監視を行い、
Corosyncでノード間の状態を同期し、クラスタ通信を行います。
実際の画像です(赤枠で囲っているものがケースで覆われていますが、Raspberry Piです)
Raspberry Piのセットアップを2台ともに設定を入れていきます。
環境の用意ができましたら、まずは、Raspberry Pi にPacemakerとCorosyncをインストールしていきます。
1. OSアップデート :まずRaspberry Pi のターミナルを開き、最新パッケージに更新します。
#sudo apt update
#sudo apt upgrade -y
2. 必要パッケージのインストール :PacemakerとCorosyncをインストールします。
#sudo apt install pacemaker corosync pcs -y
3. pcsdサービスの起動・自動起動設定
#sudo systemctl enable pcsd
#sudo systemctl start pcsd
4. 設定完了確認
#pcs –version
#pacemakerd –version
#corosync -v
Corosyncの設定は、 /etc/corosync/corosync.conf にて行っていきます。
以下、今回設定した内容となります。
totem {
version: 2
cluster_name: クラスタ名
transport: knet
crypto_cipher: aes256
crypto_hash: sha256
cluster_uuid:00000000-0000-0000-0000-000000000000 (※実際にはユニークなUUIDが表示されます)
}
nodelist {
node {
ring0_addr: 192.168.179.1
name: ラズパイ1号機
nodeid: 1
}
node {
ring0_addr: 192.168.179.2
name:ラズパイ2号機
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
two_node: 1
}
logging {
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: yes
timestamp: on
}
クラスタを起動していきます。
#sudo systemctl start corosync
#sudo systemctl start pacemaker
1号機と2号機のノード認証を行い、クラスタ構成を作成します。
#pcs cluster auth ラズパイ1号機 ラズパイ2号機
#pcs cluster setup –name iot-cluster ラズパイ1号機 ラズパイ2号機
#pcs cluster start –all
続いて、仮想IPリソースの作成をしていきます。
ここで注意点があるのですが、仮想IPリソースを作成するのは1号機のみで実施します。
実は、1号機2号機ともに作成を最初しており、上手く動作しないなーということに陥っておりましたので、
皆様はお気を付けください。
■設定値
– 仮想IPにしたいIPアドレス : 192.168.179.100
– サブネット(netmask) : /24(255.255.255.0の場合)
– リソース名 : my-vip
■実行コマンド
#pcs resource create my-vip ocf:heartbeat:IPaddr2 ip=192.168.179.100 cidr_netmask=24 op monitor interval=30s
■作成後の状態確認
#pcs status
仮想IP(my-vip)が「Started on <ノード名>」のように表示されていれば成功です。
これで、ノード障害が発生したとしても、仮想IPが自動で生きているノードに引き継がれます。
これにてクラスタ設定は完了となります。
クラスタの動作確認をしていきたいと思います。
まずはスイッチオーバーと呼ばれる手動にて行うリソース移動を確認していきます。
コマンドを実行して、1号機⇒2号機へ仮想IPリソースが移動するか見ていきましょう。
事前確認でリソースがどちらのノードにあるか確認します。
■事前確認
#pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 16:53:16 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 16:53:17 2025
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ1号機 ラズパイ2号機 ]
Full List of Resources:
*my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ1号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
仮想IPリソース(my-vip)の箇所に記載のあるノードが、現在、仮想IPリソースを所持しているノードになります。
そのため、現時点ではラズパイ1号機に仮想IPリソースがあること確認できました。
それでは、1号機から2号機へリソースを移動させたいと思います。
実施方法としては、以下コマンドを実行します。
■リソース移動コマンド実行
#pcs resource move my-vip ラズパイ2号機
■スイッチオーバー後の確認
#sudo pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 16:55:19 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 16:55:20 2025
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ2号機 ラズパイ1号機]
Full List of Resources:
*my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
仮想IPリソース(my-vip)の箇所を確認すると、ラズパイ2号機の表記があり、1号機から2号機へ変更されていましたので、無事スイッチオーバーが出来たことを確認しました。
続いて、2号機⇒1号機へコマンドを実行して、仮想IPリソースを戻せるか確認します。
■事前確認
# pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:07:59 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:08:00 2025
* Last change: Wed Oct 29 17:07:28 2025 by root via cibadmin on ラズパイ2号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ2号機 ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
■リソース移動コマンド実行
#pcs resource move my-vip ラズパイ1号機
■スイッチバック後の確認
sudo pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:13:58 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:13:59 2025
* Last change: Wed Oct 29 17:13:44 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ1号機 ラズパイ2号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ1号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
最後の動作確認として、フェイルオーバーと呼ばれる、リソースが自動で移動されるかを確認します。
1号機で疑似障害を起こし、2号機へ仮想IPリソースが自動で移動するか確認します。
疑似障害としては、1号機-HUB間のLANケーブルを抜線し、疎通ができない状態にします。
抜線後、2号機にて確認コマンドを実行し、仮想IPリソースが移動していましたら、フェイルオーバーされていると判断します。
■事前確認
#pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:23:32 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:23:33 2025
* Last change: Wed Oct 29 17:13:44 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ2号機 ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
■1号機-HUB間のLANケーブルを抜線
■フェイルオーバーされたか、仮想IPリソースの確認
# pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:37:32 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:37:33 2025
* Last change: Wed Oct 29 17:23:33 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ2号機 ]
* Offline: [ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
my-vip の箇所に無事2号機のノード名があり、フェイルオーバーの確認ができました。
また、Node Listの1号機の表示がOflineとなっており、2号機のみOnline(稼働の確認が取れている状態)となりました。
Pacemaker + Corosyncを使えば、IoT環境でも高可用性を実現できることが確認できました。
LifeKeeper製品を取り扱う、LifeKeeperチームとして、今回IoT環境での冗長化や障害対応の仕組みを実際に検証していき、普段とは違う試みが出来たと感じました。
今後も色んな活用方法を実践していきたいと思います。
こんにちは。SCSKの井上です。
WEBサイトに訪れたユーザーが不満を感じる前に、問題を検出する方法はないでしょうか?せっかく訪れたユーザーが、サイトが使えない・遅いといった理由で離れてしまうと、企業のブランド価値低下や機会損失につながります。そこで、New RelicのSynthetic Monitoring(外形監視)を使って、影響が拡大する前に継続的に監視し、問題を早期に発見する一助になれば幸いです。
外形監視を導入することで、稼働率や応答速度をはじめとするデータを可視化することができます。リンク切れやページ表示の遅延で気づいていたらユーザー離れが起きていた事態を防ぐためにも、チェックを自動化して障害や問題を早期に発見することが大切になってきます。New Relicは日本だけではなく世界の拠点から外形監視を実行できるため、グローバルにアクセスされるサイトの品質管理にも対応できます。この記事では7種類の外形監視の使い方について解説していきます。
外形監視は、ユーザー視点でWebサイトやAPIの可用性やパフォーマンスを外部からチェックする仕組みです。実際のユーザーアクセスと同じ状況を再現することで、問題を早期に発見することができます。New Relicの外形監視では以下のような機能が実現できます。
| 機能 | 説明 |
| 可用性チェック | WebサイトやAPIの稼働状況をPingやHTTPリクエストで確認 |
| APIテスト | REST APIやGraphQLのレスポンスコード・内容を検証 |
| ブラウザ操作の再現 | スクリプト化されたブラウザモニターでログインやフォーム入力を再現 |
| パフォーマンス測定 | ページロード時間やAPIレスポンス時間を計測 |
| グローバル監視 | 世界中の複数ロケーションからテストを実行し、地域別の応答速度を確認 |
| エラー検知と通知 | HTTPステータスやレスポンス異常を検知し、アラートを発報 |
外形監視を設定する際に、無料で利用できる範囲や、注意すべきポイント、さらに設定時によく使われる用語について解説します。
無料枠では、外形監視の実行可能回数は月500回までです。なお、契約プランによって外形監視の実行可能枠は異なります。ただし、Ping監視については実行回数のカウント対象外です。外形監視は複数ロケーションから実行でき、1ロケーションにつき1回としてカウントされます。例えば東京とロンドンで1分間隔で監視すると、1分で2回、1時間で120回となり、ロケーションが増えるほど実行回数も増えます。そのため、優先地域に絞ってロケーションを選定することが重要です。また、外形監視のブラウザ実行環境(Browser)でChromeとFirefoxを選択、デバイステスト(Device Emulation)でモバイルとデスクトップなど複数選択した場合も、それぞれに実行回数がカウントされます。実行上限を超える場合、設定時に以下の画面が表示されます。
外形監視の設定を保存する前に、意図した通りに外形監視が動作するかを検証する「Validate」というボタンがあります。これについては、チェックを行う前の動作確認の建付けとなっているため、実行回数のカウント対象外です。
この後に説明するSimple BrowserやScripted Browserで利用できるオプション設定で、ChromeやFirefoxのエミュレーション機能を使って、モバイルやタブレットでの異なるデバイスで画面表示をテストできます。ただし、各デバイスとのネットワーク速度やOSは再現できないため、同じサイトでも表示速度やJavaScriptの実行処理の差がでます。画像やテキストが正しく読みこまれているか、ボタンは押せる位置にあるかなどは確認できます。より詳細にテストしたい場合は、実機を用いて打鍵も考慮する必要があります。
アプリケーションのパフォーマンスに対するユーザー体験を数値化する指標としてApdexがあります。1.0に近いほど、ユーザー体験は問題ないとされています。以下についてはベンダーごとに評価基準は異なります。
| Apdex値の範囲 | 評価(Rating) |
| 0.94 ~ 1.00 | Excellent(非常に良い) |
| 0.85 ~ 0.93 | Good(良い) |
| 0.70 ~ 0.84 | Fair(普通) |
| 0.50 ~ 0.69 | Poor(悪い) |
| 0.00 ~ 0.49 | Unacceptable(許容外) |
Apdex(T) = (Satisfied count + (Tolerating count ÷ 2)) ÷ Total samples
満足(Satisfied) : レスポンスタイム ≤ 3秒
許容(Tolerating) :3秒 < レスポンスタイム ≤ 12秒
不満足(Frustrated):レスポンスタイム > 12秒
New Relicでは、Webサイトのパフォーマンスを多角的に検証できる 7種類のSynthetic Monitoring(外形監視) が用意されています。これらのモニターは、単純な死活確認から複雑なユーザー操作のシナリオ再現まで対応しています。ここでは、各モニターの設定方法や活用シーンを解説していきます。
| 種類 | 機能概要 | 主な用途 |
| Ping(死活監視) | URLにリクエストを送り、応答を確認(軽量) | サイトの死活監視、基本的な可用性チェック |
| Simple browser(ページ表示速度監視) | ページをブラウザで開き、レンダリング確認 | ページ表示確認、JavaScript実行確認 |
| Step Monitor(ノーコード監視) | コード不要で複数操作を設定可能 | ログインやフォーム入力など簡単なユーザーフロー確認 |
| Scripted browser(ユーザ操作監視) | JavaScriptで高度な操作をカスタマイズ | ログイン確認、E2Eテスト |
| Scripted API(API監視) | APIエンドポイントにリクエストを送りレスポンス検証 | APIの正常性監視、エンドポイント監視 |
| Certificate Check(SSL証明書監視) | SSL証明書の有効期限を監視 | セキュリティ維持、証明書期限切れ防止 |
| Broken Links Monitor(リンク切れ監視) | ページ内リンクの正常性を確認 | UX品質維持 |
URLの死活監視など、もっとも単純な監視方法です。月内の実行可能回数枠については対象外となっています。
| 項目名 | 意味・用途 |
| Name (required) | 外形監視の名前。 |
| URL (required) | 監視対象のURL。 |
| Period | 監視の実行間隔。例:1分、5分、15分など。 |
| Text validation (optional) | レスポンスに含まれるべき文字列を指定。指定文字列が含まれないと失敗と判定。 |
| ApdexTarget (optional) | パフォーマンス評価指標(Apdex)の目標値。 |
| Verify SSL | SSL証明書の検証を有効にするかどうか。チェックすると証明書の有効性も確認。 |
| Bypass HEAD request | HEADに対応していないシステムに対してHEAD+Bodyを確認する。
軽量な死活監視、サーバー負荷を避けたい場合:チェックなし 特定の文字列が表示されているか検証したい場合:チェックあり |
| Redirect is failure | リダイレクトが発生した場合に失敗とみなすかどうか。
URLがそのまま使える状態であることを確認とする場合:チェックあり リダイレクトが仕様として許容されている(例:HTTP→HTTPS)場合:チェックなし |
| Custom headers | リクエストに追加するカスタムHTTPヘッダー。キャッシュを無効化、APIキーなどを含める場合に使用。 |
| Tags | モニターにタグを付けて分類・検索しやすくする。形式は key:value。 |
指定したURLを実際のブラウザで開き、ページの読み込みや基本的な表示を確認する外形監視です。Webページがブラウザで正常に表示されるかどうかを確認するなどに使われます。
| 項目名 | 説明 |
| Name (required) | 外形監視の名前。 |
| URL (required) | 監視対象のWebページのURL。 |
| Period | 外形監視の実行間隔。例:「15 mins」は15分ごとに監視を実行します。 |
| Tags | 外形監視にタグを付与して分類や検索をしやすくします。形式は key:value。 |
| Text validation (optional) | ページ内に特定の文字列が含まれているかを確認するための文字列を入力。HTTPステータスコードだけではなく、特定の文字も表示されていることをもって成功としたい場合に使用。 |
| ApdexTarget (optional) | パフォーマンス評価指標(Apdexスコア)の目標値。 |
| Verify SSL | SSL証明書の有効性を確認するオプション。チェックを入れるとHTTPS証明書の検証を行います。 |
| Enable screenshot on failure and in script | 外形監視失敗時にスクリーンショットを取得するオプション。どこで失敗したのかを確認することができる。デフォルトで有効となっています。 |
| Custom headers | HTTPリクエストに追加するカスタムヘッダー。認証や特定のAPI利用時に必要。Nameにヘッダー名、Valueに値を入力。 |
ユーザーがサイトで行う一連の操作を、順番に自動で試して問題がないか確認する外形監視です。ログインIDとパスワードを入力して、ログインが問題なくできるかを確認などに使われます。
| 項目名 | 説明 |
| Name (required) | 外形監視の名前。 |
| URL (required) | 監視対象のWebページのURL。 |
| Period | 外形監視の実行間隔。例:「15 mins」は15分ごとに監視を実行します。 |
| Tags | 外形監視にタグを付与して分類や検索をしやすくします。形式は key:value。 |
| ApdexTarget (optional) | パフォーマンス評価指標(Apdexスコア)の目標値。 |
| Enable screenshot on failure and in script | 外形監視失敗時にスクリーンショットを取得するオプション。どこで失敗したのかを確認することができます。デフォルトで有効となっています。 |
ユーザ操作をスクリプトを使ってサイトの動作を監視する外形監視です。ECサイトの購入フロー(商品検索→カートに入れる→ログイン→購入等)が問題なく遷移できるか、一連のシナリオテストを確認するなどに使われます。
| 項目名 | 説明 |
| Name (required) | 外形監視の名前。 |
| Period | 外形監視の実行間隔。例:「15 mins」は15分ごとに監視を実行します。 |
| Tags | 外形監視にタグを付与して分類や検索をしやすくします。形式は key:value。 |
| ApdexTarget (optional) | パフォーマンス評価指標(Apdexスコア)の目標値。 |
| Enable screenshot on failure and in script | 外形監視失敗時にスクリーンショットを取得するオプション。どこで失敗したのかを確認することができる。デフォルトで有効となっています。 |
外部APIの応答時間・可用性を定期的にチェックし、遅延や障害の発生有無を確認する外形監視です。Synthetics REST APIは 1秒あたり3リクエストまでの制限となっています。制限を超えた場合、429レスポンスコードを返します。
| 項目名 | 説明 |
| Name (required) | 外形監視の名前。 |
| Period | 監視の実行間隔。例:「15 mins」は15分ごとに監視を実行します。 |
| ApdexTarget (optional) | パフォーマンス評価指標(Apdexスコア)の目標値。 |
| Runtime | スクリプト実行環境をプルダウンメニューから選択。古いスクリプトの場合、最新Nodeで動かない場合があるので、動作確認のValidateを実行して確認。 |
| Tags | 外形監視にタグを付与して分類や検索をしやすくします。形式は key:value。 |
SSL証明書の有効期限や有効性を監視する外形監視です。証明書が切れるとブラウザに警告が表示され、ユーザー離脱や企業の信頼低下につながるため、事前に検知して防ぎます。
| 項目 | 意味 |
| Name (required) | 外形監視の名前。 |
| Domain (required) | チェック対象のドメイン名。SSL証明書の有効期限を確認したいURLを指定します。 |
| Days remaining until expiration (required) | アラートを出すまでの残り日数のしきい値。 例:30 → 証明書の有効期限が30日未満になったら通知 |
| Period | 外形監視の実行頻度。どれくらいの間隔でチェックするかを設定します。 |
商品ページや決済ページへのリンク、掲載サイトから外部サイトへのリンクが正しく動作しているかどうかを定期的に確認する外形監視です。リンク切れによるユーザー離れやメンテナンスへの信用低下を防ぎ、ユーザー体験を損なわないようにします。
Secure credentialsは、パスワードなどのセキュアな情報を管理し、外形監視のスクリプト内で参照できる仕組みです。セキュアな情報をスクリプト内に直接記載しないことで、漏えいリスクを低減することができます。また、複数のスクリプトを管理する場合は、変数で記述することで認証情報を一元管理ができます。一度作成したkey名は固定で、後から編集できるのは値(value)と説明(description)のみになりますので、key名を変更したい場合は、作り直す必要があります。値の変更後、個々のスクリプトで使用しているKeyの修正は不要で反映されます。この機能は、Scripted browser、Scripted API、およびStep Monitorで使用できます。
| 1.Synthetic MonitoringよりSecure credentialsを選択後、Create secure credentialをクリックします。 | 2.変数名(Key)及び、値(Value)を入力します。必要に応じて説明を入力後、「Save」をクリックします。 |
![]() |
![]() |
| 3.ブラウザの更新を実施することで、作成されたSecure credentialsが一覧に表示されます。 | |
![]() |
| 1.対象の外形監視を開き、「Insert secure credential」をクリックします。 | 2.作成されているsecure credentialの一覧が表示されますので、使用したいkeyをクリックします。 |
![]() |
![]() |
| 3.スクリプト内に対象のKeyが$secure.KEY_NAMEの形式で表示されます。 | |
![]() |
ここまでで、7種類の外形監視について、それぞれの利用用途と設定方法を解説してきました。次は、実際に設定した外形監視の結果をどのように確認すべきかを見ていきます。
複数の外形監視を運用している場合、過去24時間の成功率や失敗したロケーションを一覧で確認できます。どのモニターで問題が発生しているかを素早く把握することができます。また、Alert statusの色分け(赤・緑・グレー)によって、障害有無を即座にわかります。この画面では以下のことが確認できます。
サマリー画面では、外形監視の実行単位で障害の特定や改善策の検討を確認する画面です。一覧画面では全体の外形監視の実行状態を確認することに対して、サマリー画面では、外形監視単位で詳細に確認する位置づけです。
この画面では、外形監視の再実行を実施することができます。ネットワークや外部サービスの一時的な不具合で外形監視が失敗しているのか、サーバの設定変更などで構成変更後、外形監視が正しく実行できているかなど、今すぐ確認したい場合は「Run check」をクリックして確認できます。
外形監視の種類によって表示されるグラフは異なりますが、主な確認できる項目は以下の通りです。
| グラフ項目 | 意味 | 利用シーン |
| Error response codes | HTTPステータスコード(200以外)を表示 | エラー発生箇所を確認し、原因を特定 |
| Average size by resource type | HTML、CSS、JavaScript、画像などの平均サイズを表示 | ページの重さや最適化の必要性を把握 |
| Duration by domain | 各ドメインごとの処理時間を表示 | 遅延の原因となるドメインを分析 |
| Total requests by domain | ドメインごとのリクエスト数を集計 | 過剰なリクエストなどを確認 |
| Performance timings | DNS、SSL、接続、送信、待機、受信のページ読み込みに関わる全体の流れの時間を表示 | ボトルネックを特定 |
| Request & response time | リクエスト送信からレスポンス受信までの時間 | ネットワーク応答速度を評価 |
| Connection times | DNS、SSL接続などの時間 | 接続関連の遅延要因を分析 |
サマリー画面で全体の傾向を把握後、主に実行結果を詳細を深堀していく際に使用する画面です。どのタイミングで失敗しているのか、特定のロケーションで遅延しているのか、継続的に外形監視が失敗しているのかを確認できます。検索ボックス横のLocationより特定の場所の結果だけを表示/非表示することができます。外形監視の成功や失敗の一覧画面が表示されています。赤枠の一覧内の該当のタイムスタンプをクリックすることで、以下のことが確認できます。
主にこの画面はページの読み込み速度が遅いときに詳細な深堀をするために使用します。ページ読み込みのボトルネックをHTML、CSS、JavaScript、画像などのリソース単位で確認することができます。Resource画面を開くと左側のリストに平均ダウンロード時間が遅い順にソートされています。右側では時系列でパフォーマンスの変化が表示されています。どのリソースタイプが時間がかかっているのかを確認することができます。左側のリストをクリックすると、該当のリソースのダウンロード時間に関する情報が確認できます。ロケーションの問題か、特定の時間帯に遅延が見られるのかなどを確認できます。さらにクリックすると該当のリソースのHTTPリクエストの詳細とレスポンスタイムの内訳を確認することができます。DNSやSSLの接続に問題があるのか、サーバの処理速度に問題か、ネットワーク帯域が狭い、距離が遠いなどの問題を詳細にドリルダウン形式で分析することができます。
外形監視の編集画面では、監視対象のURLの変更、スクリプトの修正、監視実行の有効無効化、頻度、ロケーションの変更などが実施できます。
該当のロケーションでネットワークの問題や障害が起きているのかを確認することができます。この画面で特定の地域のみ発生しているのか、全地域に発生しているのかを切り分けることができます。サービスは正常に起動しているが、外形監視の失敗が突然連続している場合は、下記のステータスを確認します。
通常はインターネット上の公開サーバーを監視しますが、社内ネットワークやファイアウォールの内側にあるシステムは外部からアクセスできません。自分の会社のネットワーク内から監視する場合は、プライベートロケーション機能を使うことで実現できます。この機能を使うには、コンテナを使う必要があります。この記事では、概要のみの説明とし、詳細は別の記事で解説します。
この記事では、Synthetic Monitoring(外形監視)について、利用できる監視方法や設定手順、結果の見方までを解説しました。New Relicには多彩な外形監視機能があります。本記事を参考に、外形監視を気軽に始めていただき、今後のUX改善やパフォーマンス最適化に役立てていただければ幸いです。
SCSKはNew Relicのライセンス販売だけではなく、導入から導入後のサポートまで伴走的に導入支援を実施しています。くわしくは以下をご参照のほどよろしくお願いいたします。
]]>全くの未経験者がアプリケーション開発手法を習得するまでに、どのくらい時間がかかるでしょうか?
まずプログラミング言語、動作のロジックを学び・・・最低でも2~3年の修業期間が必要そうですよね。
未経験者である自分は時間も根気も足らず長年手を出せずにいましたが、「AIに全部やってもらったら出来るのでは?」ということでGeminiとGoogle Cloudを使ってみたところ、なんと数時間で出来てしまいました。
この記事では、未経験者の自分がアプリ開発するために使った手法と、Google Cloudのサービスをご紹介します。
知識経験ゼロだけどやってみたい!という方の参考になれば幸いです。
※最新情報については公式ドキュメントをご参照ください。
前提として、自分はアプリ開発の経験なし、コーディング経験もほぼなしのインフラエンジニアです。
こんな状態でのスタートでしたが、Geminiに丸投げしてみたところ開発の順序と具体的な方法を提示してくれたので、実際その通りに進めることでアプリ開発ができました。
以下が今回試してみた流れです。
1.作成したいアプリを考える
2.Vertex AI(Gemini)でコード生成する
3.Cloud Shellでファイル作成し、コードを転記する
4.Cloud Runへデプロイする
→アプリケーション公開完了!
まずは「どんなアプリケーションを作るか」です。日常の困りごとから考えてみました。
我が家は1週間分の食材をまとめ買いしているのですが、週の後半になるにつれて食材の種類が減っていくので献立を考える難易度が上がっていきます。
この困りごとを解消するアイディアをGeminiに壁打ちし、
「食材とジャンル(和洋中)を入力すると、Geminiが即座にレシピを提案する Web アプリ」に決定しました!
今回のアプリ作成においては「レシピ考案する」というアプリの頭脳となる部分を担うのと同時に、「コードの生成」もしてもらいます。
まず、Vertex AI Studioの[チャット]から、必要なコードを作成してもらうための依頼をします。
コード作成を頼すると、ファイル構成やファイルの中身のコードを回答してくれます。
ただ、こちらをそのままアプリのコードとして利用したところ、こちらが伝えたい内容が上手くVertex AIに伝わらなかったようで、
思った通りにアプリを動かすのにかなり時間がかかりました。
精度を高めるためには、あらかじめ別のGeminiに作りたいアプリと仕様について伝えた上で「Vertex AIでコード生成するための依頼文」を作成してもらい、
それをVertex AIへの依頼文として採用する形が手っ取り早くおススメです。
Geminiに事前にやりたいことを相談した上でVertex AIに依頼したのが以下の画面です。具体的に指示を出すことで、コード生成の精度が上がりました。

Vertex AIからの回答で、アプリケーションの土台となる PythonとHTMLのコードを一式生成出来ました。

コードが出来たので、アプリにデプロイするための環境を準備します。これにはCloud Shellを使います。
Google Cloud コンソールのツールバーにあるエディタボタンにカーソルを当てると「Cloud Shellをアクティブにする」という文字とともに承認確認画面が表示され、承認することでCloud Shellが起動します。
エディタ画面でフォルダを新規作成し、新規ファイルにVertex AIが生成したコードをコピー&ペーストします。
必要に応じてプロジェクト IDやリージョンなどの設定を修正し保存します。
(Vertex AIのコードには、コメントアウトで「環境に合わせてプロジェクトIDとリージョンを設定してください」とメモが残されていました。わかりやすい!)

ファイルの準備が整ったのでいよいよデプロイです。
インフラエンジニアには馴染のないデプロイですが、こんなに簡単にアプリケーション作成して公開できるものなの?という疑念は残ります。
ここで実施するのは、Cloud Shell上でデプロイコマンドを実行することのみです。
こんな簡単にできるのか・・・!?これを実現するのがCloud Runというフルマネージドのサーバーレスプラットフォームです。
本来、Cloud Runでアプリケーションを動かすには、コードを コンテナイメージ に変換し、レジストリサービスにファイルを登録する作業が必要です。
ですが、このデプロイコマンドに–sourceなどのオプションのコマンドを組み込むことによって、デプロイに必要な関連するリソース作成・設定などをデプロイと同時に自動でおこなってくれるのです。
なんという便利さ・・・!
Cloud Shellのターミナルから「gcloud run deploy」のコマンドを実行し、Cloud Runに対して「このフォルダ(–source .)にあるコードを使って
recipe-app-blogという名前のサービスとして公開してほしい」と命令します。

デプロイが成功し、サービスURLが発行されました。
デプロイ完了後、Cloud Runのサービス画面に遷移すると、先ほどデプロイコマンドで指示した通り「recipe-app-blog」というリソースができています。
URLが生成されるので、このURLを開くとアプリケーションが見れるはず・・・!
URLを開くと、アプリケーションが表示されました!
早速、冷蔵庫に余っている食材と食べたいジャンルを入力すると・・・
レシピを提案してくれました。アプリケーション作成成功です!
Webアプリの中身を修正したい場合は、Cloud Shellのターミナル画面でgeminiコマンドを実行することで直接Geminiを呼び出し対話形式でコードを修正することも可能です。
上記の流れで簡単にアプリ公開ができたように見えますが(実際簡単ではありましたが)、いくつか引っかかったポイントがあったのでトラブルシューティングに使えるサービスもご紹介します。
Cloud Shellでのデプロイ実行時に、ビルドが失敗した旨のエラーが発生しました。
デプロイの処理の中に含まれているビルドの段階で失敗した場合は、ビルドに使用されるサービスであるCloud Buildの履歴からエラー内容を見ることができます。
ステータスが失敗になっているビルドのログを見ると、ビルドの中のどのステップで何が原因で失敗したのかを見ることができます。

自分の場合は、作成した一部のファイルの中身に余計な文字列が入ってしまいビルドが失敗していたようでした。
続いて、デプロイは成功したのに、URLを開いてみるとアプリケーションが表示されない、という事象です。
このような場合はCloud Runのエラーログ確認が有効です。
Cloud Runの[オブザーバビリティ]>[ログ]で重大度を「エラー」に絞り、ログを見てみます。
ぱっと見で中身が分からなかったのでGeminiに聞いてみたところ、Pythonの構文エラーということが判明し、場所を特定後修正すると解消されました。
最後は、アプリで回答を得ようとすると肝心の回答が返ってこずにエラーとなるパターンです。

これはぱっと見で権限エラーっぽいことがわかりました。
詳細をGeminiで確認したところ、アプリがVertex AI にアクセスするための許可が不足している様子です。
必要な権限を確認し、アプリを動かすサービスアカウントにVertex AIで必要な権限を追加します。

権限不足はあらゆる場所で発生しかなり引っかかったポイントなので、エラーが発生した場合は真っ先に疑うと良いと思います。
今回初めてアプリ開発をしてみて、AIへの指示(プロンプト)をいかに的確におこなえるかが、作業を効率化・品質を高める鍵となることがよくわかりました。
そして何より、全くの未経験でもアプリ開発ができるすごさ!!わからないところはGeminiに教えてもらい自分の知識も深めながら、トライ&エラーで手軽にアプリ開発ができました。
さらに今回は、Google Cloudの無料トライアル(90日、クレジット300ドル) の範囲でまかなうことができ、コスト面でも安心して挑戦できました。
「作りたいものはあるけど実現する技術がない・・・」と諦めていた方は、ぜひVertex AI と Cloud Run を使ってアイディアを形にしてみてください!
最後までお読みいただきありがとうございました。
]]>当部では「LifeKeeper」というHAクラスタ製品を取り扱っています。
HAクラスタ製品の市場として、クラウドでの需要の高まりはよく話題になりますが、
IoT分野でのHA(高可用性)やクラスタ技術の需要・役割も近年、ニーズの高まりを見せています。
今後のLifeKeeperビジネスにおける新たな機会創出を見据え、
今回、IoTクラスタ化の普及について探るべく、オープンソースの Pacemaker と Corosync を活用し、Raspberry Piを用いて、IoT環境でのクラスタ構築をLifeKeeperチームが検証してきたいと思います。
そもそも、IoTにおけるクラスタ化のニーズについてですが、
技術的・ビジネス的な観点から高まっている背景として、以下の要因があります。
1. デバイス数の爆発的増加
世界中でIoTデバイスが指数関数的に増加し、2030年には約290億台に達すると予測されています。
この膨大なデバイスを効率的に管理し、障害時にサービスを継続する仕組みが求められています。
2. 高可用性(HA)の要求
製造業などの分野では、システム停止が直接的な損失や安全リスクにつながります。
クラスタ化をすることで、障害発生時に自動フェイルオーバーを実現し、ダウンタイムを最小化できます。
3. スケーラビリティと負荷分散
クラスタ単位で処理を分散することで、クラウドへの依存を減らし、ネットワーク負荷を軽減します。
IoT分野においてデバイスが集める大量データや制御システムは「止められない」ものが多く、サーバやゲートウェイのHAクラスタ化が求められており、現場からクラウド中継、分析基盤まで広くHAのニーズが高まっています。
特に、IoTゲートウェイやエッジサーバが停止すると、サービス全体が中断し、ビジネスに深刻な影響を与える可能性があります。
こうしたリスクを回避するために注目されているのが「クラスタ化による高可用性(HA)構成」となります。
IoTのクラスタ化の必要性・ニーズが高まっていることを理解したところで、
今回、IoT環境でクラスタ構築を実現するためにはどうすればいいかを考えました。
そうです、低コストで手に入る機器とツールを使えば良いのです。
そこで今回選ばれたのは、 「Raspberry Pi 5」さんです👏
選定理由としては、手の届く範囲の値段、かつLinuxベースで動作する機器となるためです。
Raspberry Piは、コストパフォーマンスが高く、IoTや産業用途に適したコンパクトなコンピュータとして、
商用利用が広がっているため、今後の活用も見据え、こちらで検証をしていこうと思います。
備考として、Raspberry Piについてあまり知らないといった方向けに特徴や利点を記載しておきます。
今回、Raspberry Piに導入するクラスタツールとしては、「Pacemaker」を選定しました。
選定理由については、IoTに導入できるクラスタ製品であること、そして無料で利用できる点です。
そもそもPacemakerとはなんぞや、という方向けに説明をすると、
Pacemakerは、クラスタ内のリソース(サービス、IPアドレス、ストレージなど)を監視・制御し、障害発生時に自動的に別ノードへ切り替える(フェイルオーバー)仕組みを提供しているクラスタソフトウェアです。
Pacemakerの役割としては、クラスタ内のリソース(サービス、IPアドレス、ストレージなど)を監視・制御し、障害発生時に自動的に別ノードへ切り替える(フェイルオーバー)仕組みを提供します。
動作についてですが、Pacemaker単体では動作せず、
クラスタ通信レイヤー(CorosyncやHeartbeat)と連携してノード間の状態を共有します。
サービスの起動・停止・監視を実行する際は、スクリプトを使用して制御します。
Pacemakerを利用するにあたり、クラスタ通信レイヤーである「Corosync」を今回利用していきます。
Corosyncは、オープンソースのクラスタ通信エンジンで、Linux環境で高可用性クラスタを構築する際に、
ノード間の状態同期やメッセージ交換を担うコンポーネントとなります。
主な役割として、クラスタ通信の基盤として複数ノード間で「誰が生きているか(ノードの稼働状態)」を共有してくれます。
クラスタ動作のフェイルオーバーについてはトリガーとして、ノード障害を検知し、Pacemakerに通知することでリソース移動を行い、冗長性を確保しております。
PacemakerとCorosyncの役割をおさらいしておきましょう。
PacemakerはCorosyncから「ノード障害」や「クラスタ状態」の情報を受け取り、リソースをどのノードで稼働させるかを判断します。
つまり、PacemakerとCorosyncを用いることで、IoT環境に「高可用性クラスタ」を構築できるということです。
前段について記載してきましたが、
次回は実際に、Raspberry PiにPacemakerとCorosyncの設定を行い、クラスタ構築手順とスイッチオーバー、スイッチバック、フェイルオーバーといった動作確認を通じて、IoTでの高可用性を実践していきます。
本記事は TechHarmony Advent Calendar 2025 12/18付の記事です。 |
本日はSASEの領域から少し外れますが、「AIセキュリティ」についてのお話です。
最近、お客様と会話をする中で、「AIセキュリティ」というキーワードをよく聞くようになりました。
注目されている理由はシンプルで、生成AIの爆発的普及により、社内外の「AIリスク」が急速に拡大しているからだと思います。
実際、弊社では独自に開発・管理するAIが社内提供され始めたり、Copilotの活用が一般化してきています。
他にも、総務省では2025年9月より「AIセキュリティ分科会」が開催されており、日本でも国家レベルで「AIセキュリティ」に関する取り組みや検討が進んでいるといった状況です。
そこで今回は、「AIセキュリティとは何か?」、「なぜ必要なのか?」について、SASEとの繋がりにも触れつつ、なるべく分かりやすく解説していきたいと思います。
まず、今回ご説明する「AIセキュリティ」ですが、簡単に言うと「企業のAI利用を“可視化・制御・保護”するためのセキュリティ」となります。具体的な内容については後述しますが、企業が安全にAIを利活用するためには必須の機能になります。
1つ注意しておきたいのが、「AIセキュリティ」という用語には、上記の他に「AIによる“セキュリティ機能の強化”」を指している場合もあります。(例えば、ユーザー/端末の異常行動をAIで検知したり、潜在的な攻撃経路をAIで予測し防御する等)
一般的に、前者は「Security for AI(AIのためのセキュリティ)」、後者は「AI for Security(セキュリティのためのAI)」と呼ばれています。
※今回は「Security for AI」についての解説記事となります。
・Security for AI : 企業のAI利用を“可視化・制御・保護”するためのセキュリティ ★今回はこちらを解説
・AI for Security : AIによるセキュリティ機能の強化
ちなみに、「AI for Security」についても昨今は各社力を入れており、例えばCatoクラウド(SASE)では、セキュリティとネットワークのログを相関分析し、危険な攻撃や脅威をAIで自動検知する「XOps」というオプションがリリースされています。
※詳しく知りたい方は、以下をご参照ください。
今回紹介するAIセキュリティ「Security for AI」は、「AI for Security」よりもあまりイメージが付かない方が多いと思いますので、必要となり始めた背景から、順序立てて説明していきたいと思います。
なぜAIセキュリティが必要なのか?
「AIリスク」が広がっているというけど、何がリスクなのか?
上記について説明するために、まず、背景や新たに生まれたリスクについて整理していきます。
以下のように大きく4つの視点に分けることができました。
※あくまで私見に基づく整理となりますがご容赦ください。
| No | 背景 | リスク |
| ① | AIサービスの急増と一般ユーザーへの普及 | シャドーAIの発生 |
| ② | AIにあらゆる情報が流れ込む時代 | 機密情報の漏洩 |
| ③ | AIモデルを対象とする新たな攻撃手法の流行 | AIの脆弱性やAIに対する攻撃 |
| ④ | AIの普及に伴う法規制の必要性の高まり | ガバナンスやコンプライアンスへの対応 |
それぞれ、簡単に解説していきます。
これまでは個人利用の端末やSaaSを無許可で業務利用する「シャドーIT」という言葉がありましたが、シャドーAIはそのAI版です。
様々なAIサービスが一気に普及したことにより、社員が業務効率化のために個人判断でAIサービスを使うケースが急増し、
結果として、業務データを生成AIに投入する等により、意図しない情報漏洩が発生するリスクが発生しています。
(こちらは②で詳しく解説します。)
ちなみに、例えばChatGPTなど有名な生成AIには、情報漏洩を簡単に発生させないために、
オプトアウト(自身のデータをAI学習させないように設定できる機能)や、
ガードレール(AIが個人情報や倫理的配慮のない回答を出力しないようにする仕組み)が実装されています。
シャドーAIが発生すると、上記の仕組み実装がされていない、リスクの高いAIサービスを社員が利用してしまう可能性があるのも恐ろしい所です。
先述の通り、例えば企画書や取引先データ、ソースコード等、企業にとって重要なデータが生成AIに投入されると、そのデータはAIのクラウド上で一時保存されます。
そして、保存されたデータはAIの学習データとして利用され、思わぬ形で世間に公開される可能性がありますし、場合によっては情報丸ごとアウトプットされてしまう危険もあります。
更に、一度AIの世界に飲み込まれたデータは、その後「誰の手に、どのように渡るのか」が利用者にとって完全に把握できなくなる点も厄介です。
実際に2023年には、世界大手の電機メーカーであるサムスンが生成AIから社内の機密ソースコードを漏洩させたいう事例も発生しています。
①、②は、「AIを利用する側」のリスクでしたが、こちらは「AIを構築する側」のリスクとなります。
つまり、自社で構築したAIサービスが攻撃者の標的となり、サイバー攻撃の被害に遭ってしまうというリスクです。
最近ではAPIベースのLLM活用やオープンソースモデルの導入などで比較的簡単にAIサービスを構築することができる時代になりましたので、こういったリスクにも注意する必要があります。
AIそのものを対象とした攻撃手法には、以下のようなものがあります。
・プロンプトインジェクション : 悪意あるプロンプトを利用してシステムの意図しない動作を引き出す
・データポイズニング : AIに意図的に誤った情報を学習させ、誤作動を起こさせる
・ジェイルブレイク : 巧妙なプロンプトにより、AIのガードレールを取り除き情報を出力させる
・AIへのDoS攻撃 : AIサービスに対して過負荷攻撃を仕掛け、サービス停止に追い込む
生成AIを含む様々なAIサービスが社内外の至るところで利用されている現代では、いずれの攻撃も企業の事業活動に深刻な影響をもたらし得ます。
AI利用の爆発的な増加に伴い、ガバナンスやコンプライアンスへの対応も必要になってきています。
例えば、ヨーロッパでは「EU AI Act」が施行され、2025年には規約違反に対する厳しい罰則も設けられています。
日本では、「AI推進法」が2025年9月に施行されました。
今後はよりAIに関する適切な記録や管理が求められる時代になると考えられるため、企業は事前にAI利活用の基盤を整え、早期に対応していく必要があります。
これまでAI利用のリスクについて説明してきました。
次は、これらのリスクに対応するため、「AIセキュリティ」のソリューションがカバーしておくべき機能について、簡単にご紹介します。
※こちらも前章と同じく、私見に基づく整理となります。
AIを利用する側、つまりユーザー視点でのセキュリティ機能は以下のようなものがあります。
| 機能 | 概要 | 対応するリスク |
| シャドーAI検出 | あらゆるAIの利用状況・リスクを可視化 | ①、② |
| プロンプト可視化・分析 | AIに送信されたプロンプトを検知し可視化、解析 | ①、② |
| ポリシー適用 (プロンプト制御) | 機密情報や個人情報が含まれるプロンプトや、事前定義ポリシーに違反するプロンプトをブロック、もしくはマスク処理 | ①、②、④ |
自社でAIを構築・運用する側、開発者視点でのセキュリティ機能は以下です。
| 機能 | 概要 | 対応するリスク |
| 自社AIのインベントリ・ ポスチャ管理(AI-CPM) | AIのリソース(構成・モデル・ライブラリ・データ)の継続的な監視と評価 脆弱性の特定、リスク管理、設定ミスの修正 | ②、③、④ |
| 自社AIのランタイム保護(AI-FW) | プロンプトインジェクション、データポイズニング、ジェイルブレイク等からAIアプリケーションを保護 | ③、④ |
| 自社AIのランタイム制御(AI-DR) | AIアプリケーションおよびエージェントの振る舞い(どのデータを取り込み、どのアクションを実行したか)を監視し、不正挙動や悪用を防止する。 | ③ |
実は先日、Catoクラウドを提供するSASE領域のリーダー企業「Cato Networks」は、AIセキュリティの専門企業である「Aim Security」を買収しました。
SASEは、ネットワークとセキュリティを統合しクラウドで提供するアーキテクチャです。
Cato Networksは今後、従来のネットワーク・セキュリティに加えて、上記のような「AIセキュリティ」における機能も強化・統合していく方向性を示していますが、実際、「SASE」と「AIセキュリティ」にはどのような親和性があるのでしょうか。
少し考えてみました。
このように記載すると、この2つは領域こそ違いますが、「統合的に管理し、セキュリティを適応させる」という所は同じだと思います。
ネットワークは全社員が業務を行う上で必ず必要になるものですし、AIサービスも今やそういった存在になりつつあります。
どちらも重要インフラであり、だからこそ「ネットワークの安全性」と「AIの安全性」を1つの基盤に統合し、まとめて管理するということは、今後企業が安全に・継続的に成長するうえで重要になってくるのではと考えました。
AIセキュリティについて、SASE担当としての観点も踏まえて、解説してみました。
AIセキュリティは比較的新しい技術領域のため、これからもどんどん発展していくと思います。
現時点でインプットとなる情報も多くはなく、本記事全体を通して(特に後半)、自分なりの整理や考えを述べている部分も多いですがご容赦ください。
ただ、少なくともCato Networks社が買収したAim Securityでは、上記で述べたような「AIセキュリティ」のソリューションは既に展開されているようです。今後Catoクラウドがどんな進化を見せるのか、私自身とても楽しみです。
「CatoクラウドのAIセキュリティ機能」について、魅力的なアップデート情報を皆様にお届けできる日を心待ちにしています。
]]> 本記事は TechHarmony Advent Calendar 2025 12/18付の記事です。 |
こんにちは。SCSKの野口です。
今回初めての記事投稿となりますが、私が興味を持っている分野であるAWSサービス関連・ AIエージェント関連に関する記事を投稿していく予定ですので、どうぞよろしくお願いします。
早速本題ですが、2025年10月にAWS Lambda の非同期呼び出しにおける最大ペイロードサイズが 256KB ⇒ 1MB に引き上げられました。
本記事では公式アナウンスの内容を軽く確認し、シンプルなデモで”256KBを超えてもエラーにならない”ことを試してみたいと思います。
Lambdaの呼び出し方法には
の2通りの呼び出し方法があります。
同期呼び出しは、リクエストを投げた後にLambda側で処理が行われるのですが、その処理が完了するまでレスポンスが返ってきません。
一方で、非同期呼び出しではリクエストを受け付けた後に処理が完了しているかにかかわらずレスポンスを返します。クライアント側はLambdaからのレスポンスを待つことなく次の処理に移ることができます。
一般的に、非同期処理のメリットは下記が挙げられます。
それぞれについて、イメージを共有します。
同期処理に比べ、応答時間が短い
耐障害性・可用性が向上する
非同期処理については下記の資料がとても参考になるので、是非確認してみてください。
公式アナウンスが2025年10月24日に行われています。
AWS Lambda が非同期呼び出しの最大ペイロードサイズを 256 KB から 1 MB に増加 – AWS
要点をまとめると、下記となります。
InvocationType=Event や、S3/SNS/EventBridge/Step Functions などのプッシュ型イベント)。すでに東京リージョン(ap-northeast-1)でも1MBでの非同期呼び出しが可能となっているので、今回は東京リージョンでデモを実施します。
それでは、本当に非同期呼び出しで1MBを超えても問題ないかを確認します。
非同期(`InvocationType=”Event”`)で約 300KB と約 900KB のペイロードサイズを持つリクエストを投げ、関数側では受信バイト数を CloudWatch Logs に出します。
本デモでは AWS CDK(TypeScript)を使用して環境構築しています。
今回は下記のように言語を分けてデモ用コードを作成しています。
今回はLambdaコード・Lambda呼び出しコードのみ記事に記載し、IaCコードは省略します。
import json
import logging
# Configure structured logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def _byte_len(obj):
"""
Calculate the byte size of an object.
Args:
obj: The object to measure (string or dict)
Returns:
int: The byte size of the object in UTF-8 encoding
"""
if isinstance(obj, str):
return len(obj.encode('utf-8'))
elif isinstance(obj, dict):
# Serialize to JSON and calculate byte size
json_str = json.dumps(obj, ensure_ascii=False)
return len(json_str.encode('utf-8'))
else:
# For other types, convert to JSON first
json_str = json.dumps(obj, ensure_ascii=False)
return len(json_str.encode('utf-8'))
def lambda_handler(event, context):
"""
Lambda handler function that measures and logs payload sizes.
Args:
event: The Lambda event payload (string or dict)
context: The Lambda context object
Returns:
dict: Response with ok status and received_bytes count
"""
try:
# Calculate payload size
received_bytes = _byte_len(event)
event_type = type(event).__name__
# Log payload information
logger.info(f"received bytes={received_bytes} type={event_type}")
# Return success response
return {
"ok": True,
"received_bytes": received_bytes
}
except Exception as e:
# Log error with full stack trace
logger.exception(f"Error processing payload: {str(e)}")
# Return error response
return {
"ok": False,
"error": str(e)
}
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';
/**
* Generate a test payload of approximately the specified size in KB
*/
export function generatePayload(sizeKB: number): { data: string } {
// Account for JSON overhead: {"data":"..."}
// Approximately 12 bytes for the JSON structure
const jsonOverhead = 12;
const targetBytes = sizeKB * 1024 - jsonOverhead;
// Generate a string of repeated characters
const data = 'A'.repeat(Math.max(0, targetBytes));
return { data };
}
/**
* Calculate the actual byte size of a JSON payload
*/
export function calculatePayloadSize(payload: object): number {
const jsonString = JSON.stringify(payload);
return Buffer.byteLength(jsonString, 'utf-8');
}
/**
* Invoke Lambda function asynchronously
*/
export async function invokeLambda(
functionName: string,
payload: object,
label: string
): Promise<void> {
const client = new LambdaClient({ region: 'ap-northeast-1' });
const payloadBytes = calculatePayloadSize(payload);
const payloadKB = (payloadBytes / 1024).toFixed(2);
console.log(`\n${label}:`);
console.log(` Payload size: ${payloadBytes} bytes (${payloadKB} KB)`);
try {
const command = new InvokeCommand({
FunctionName: functionName,
InvocationType: 'Event', // Asynchronous invocation
Payload: JSON.stringify(payload),
});
const response = await client.send(command);
console.log(` Status code: ${response.StatusCode}`);
if (response.StatusCode === 202) {
console.log(` ✓ Invocation accepted (asynchronous)`);
} else {
console.log(` ⚠ Unexpected status code: ${response.StatusCode}`);
}
} catch (error) {
console.error(` ✗ Error invoking Lambda:`, error);
throw error;
}
}
/**
* Main function to run test invocations
*/
async function main() {
// Get function name from command line or environment
const functionName = process.argv[2] || process.env.LAMBDA_FUNCTION_NAME;
if (!functionName) {
console.error('Error: Lambda function name not provided');
console.error('Usage: npx ts-node services/invoke-lambda.ts <function-name>');
process.exit(1);
}
console.log(`Testing Lambda function: ${functionName}`);
console.log('='.repeat(60));
// Test case 1: 300KB payload
const payload300KB = generatePayload(300);
await invokeLambda(functionName, payload300KB, 'Test 1: 300KB payload');
// Test case 2: 900KB payload
const payload900KB = generatePayload(900);
await invokeLambda(functionName, payload900KB, 'Test 2: 900KB payload');
console.log('\n' + '='.repeat(60));
console.log('All invocations completed successfully!');
console.log('Check CloudWatch Logs to verify payload sizes were logged.');
}
// Run main if this file is executed directly
if (require.main === module) {
main().catch((error) => {
console.error('Fatal error:', error);
process.exit(1);
});
}
Lambdaをデプロイ後、非同期呼び出しを行った結果です。
300KB・900KBともに呼び出せていることを確認できました!
CloudWatch Logsでも、300KB・900KBのメッセージが受信できていることを確認できました。
この結果から、確かに1MBまで上限が引き上げられていることが分かります。
今回は Lamba の非同期呼び出しでペイロードサイズが1MBまで上限が引き上げられたことの確認デモを行いました。
処理可能なペイロードサイズが増えたことで、非同期化できる処理の幅が広がりそうです!
非同期呼び出しはレスポンスタイムの改善、耐障害性・可用性の向上などの観点からしても重要な考えです。
全ての処理を同期的に行うのか、非同期でも問題ない処理を積極的に非同期化するのかを日々の業務でも考えていき、使い分けを行えるようになりたいです。
私たちの部署では、年度初めに業務改善やテクノロジーの活用術などのテーマを決めて、チームに分かれて新しいことに挑戦してみるという取り組みをしています。
今年度、私の所属するチームでは設計/構築作業の生産性向上、効率化を目指して、AWSのパラメータシートを自動生成するツールの作成を行いました。
今回はブログリレーという形で、取り組んだことについて紹介していきたいと思います!🎉
1人目ということで、私からは活動の目的や概要をご説明できればと思います。
通常、AWSの設計や開発を行う際は、手作業でExcelにパラメータシートを作成しており、以下のような課題を抱えていました。
上記の課題は、生産性や品質の低下を招いてしまう可能性があり、さらには開発スピードの低下にもつながります。
そのため、これらを解決する一つの手段として、AWSのパラメータシートを自動生成というテーマを考え、取り組みを始めました。
設計・開発におけるパラメータシートを取りまとめる工程をツールによって省略化し、生産性向上、効率化する
ツールのコード管理をGitHubで行い、組織内で展開できるようにする
次の3点を実現できるように設計を行いました。
以下のようなアプリケーションを作成し、AWSリソース選択からパラメータシート出力までの機能を提供できるように実装を行いました。
以下のような流れで実現しています。
上記の仕組みを具体的にどのような技術で実現しているかについては、このあと追加される関連記事をご確認してみてください!
この取り組みは、業務に好循環を生み出すきっかけになったのではないかなと考えています。
例えば、これまで時間をかかっていた手作業が自動化されることで残業が減り、生まれた時間を自己研鑽にあてることができます。さらに、ツールによって成果物の一貫性が保たれるため、個人のスキルに依存しない品質確保や、ヒューマンエラーの防止にも繋がります。
一方で、私たちの部署ではPythonやIaCの経験はありましたが、アプリケーション開発の知見は十分ではありませんでした。そのため、設計や要件定義は手探りで進める部分が多く、手戻りが発生し苦労も多かったです。
今回の取り組みを通して、日々の業務における課題に意識を向け、改善を行っていくことの重要性を改めて認識しました。
このツールにはまだ改善の余地があるため、今後も継続的に改良し、生産性や品質向上に貢献していきたいと思います。
というわけで、私の投稿はここまでです!
次回はkurahashiさんにバトンタッチしたいと思います!
本記事は TechHarmony Advent Calendar 2025 12/17付の記事です。 |
こんにちは!
SCSK株式会社でデータ利活用の業務に携わっている重城です。
本稿では、AIブラウザ「Comet」を使って、簡単なEC2作成や、ある程度複雑なサーバーレスAPI構築などの一連のGUI操作を丸投げしてみた検証結果を元に、その可能性と現在の課題をご紹介します。
AWSマネジメントコンソールは、非常に多機能で強力なツールですが、その一方で、アーキテクチャを組む際の手順は複雑化しがちです。VPCの設定からIAMロールの権限付与、そして各サービス間の連携まで、手作業でのGUI操作には多くのクリックと入力が求められ、ヒューマンエラーのリスクが常に付きまといます。
この課題に対し、近年「AIブラウザ」という新しいアプローチが登場しました。これは、私たちが普段使っている自然言語による指示(プロンプト)を解釈し、まるで人間のようにブラウザ上のGUI操作を自動で実行してくれるエージェントです。
本稿では、AIブラウザの一つである「Comet」を用い、AWS上でアーキテクチャを自動で組むというタスクをどこまで実現できるのかを徹底検証しました。AIブラウザのポテンシャルと、現時点での技術的な課題を、具体的な検証結果を元に報告します。
「AIブラウザ」という用語は、現在も様々な文脈で使われており、その定義は一意ではありません。そこで本稿では、「自然言語による指示を解釈し、Webブラウザ上のGUI操作を自律的に実行するエージェント」をAIブラウザと呼ぶことにします。
AIブラウザは、私たちが普段マウスやキーボードで行っているクリック、テキスト入力、ページ遷移といった一連の操作を、人間のように画面を”見て”認識し、自動で実行してくれます。
メモを修正させたり、ECサイトで友達の誕生日プレゼントを調べてカートに入れておいてもらうこともできます。(私は自分で調べますよ。もちろん)
では、AIはどのようにしてWebページの構造を理解しているのでしょうか。主要な方式は2つあり、Cometのような最新のツールはこれらを組み合わせたハイブリッド型であると考えられています[1]。(2025年12月時点では、アーキテクチャ詳細は非公開)
この両者の長所を組み合わせることで、AIブラウザは従来の自動化ツールを遥かに超える、高い精度と柔軟性を両立しています。
数あるAIブラウザの中から、今回の検証パートナーとしてPerplexity AI社の「Comet」を選定しました。
検証を実施した2025年11月当時、Cometは新しく一般公開され話題となっており、その実力を試す絶好の機会だと考えたのが大きな理由です。
加えて、具体的な選定基準として以下の2点を重視しました。
AIブラウザの基本的な能力を理解したところで、いよいよ本題であるAWSのアーキテクチャをCometに組ませてみます。
今回の検証は、以下の2つのステップで実施しました。
最初の検証では、Cometがどの程度自律的に操作を判断できるかを評価するため、あえて抽象的なプロンプトを与えました。
プロンプト
AWSでEC2インスタンスを1つ作成して
この指示を受け取ったCometは、すぐにAWSマネジメントコンソールの操作を開始しました。EC2のダッシュボードへ移動し、「インスタンスを起動」ボタンをクリック、AMIやインスタンスタイプの選択画面をスムーズに進んでいきます。
最終的に, CometはエラーなくEC2インスタンスの起動を完了させました。
しかし、作成されたインスタンスを確認すると、プロンプトで明示的に指示しなかったインスタンス名は未設定(空欄)のままでした。
この結果から、AIブラウザは指示されたゴール(インスタンスの起動)を達成するための必須操作は自律的に実行できる能力を持つことがわかりました。一方で、インスタンス名のように、設定が任意である項目については、指示がなければ補完してくれません。
これは、AIが「指示に忠実」であることを示す良い例と言えるでしょう。この特性を踏まえ、次の応用タスクでは、より詳細なプロンプトを用意して検証に臨むことにしました。
EC2インスタンスの作成に成功したことで、Cometが基本的なGUI操作をこなせることは確認できました。次に、より実践的なタスクとして、複数のサーバーレスサービスを連携させたAPIアーキテクチャをゼロから組むことに挑戦しました。
今回Cometに組ませるアーキテクチャは、「API Gateway + Lambda + DynamoDB」の構成です。
このタスクを成功させるには、単一サービスの操作だけでなく、サービス間の連携、特にIAMロールを用いた権限設定という、目に見えない接続を正しく構築する必要があります。
EC2の検証で得た学びに基づき、今回は各サービスの作成手順を詳細に記述したプロンプトをCometに与えました。(プロンプト作成も他のAIにやらせました)
Lamda のコードもプロンプトに含めてあげるか迷いましたが、あえて含めずに、ブラウザ上でコードを書いてくれるのか試しました。
プロンプト
AWSで、ユーザー名とメッセージを保存するシンプルなメモAPIを構築します。これはAPI Gateway、Lambda、DynamoDBで構成されます。以下の手順で操作してください。
【ステップ1 データベース(DynamoDB)の作成】
1. DynamoDBのダッシュボードに移動し、「テーブルの作成」をクリックします。
2. テーブル名に「Comet-Memo-Table」と入力します。
3. パーティションキーに「memo_id」と入力し、型は「文字列」を選択します。
4. 他はデフォルト設定のまま、「テーブルの作成」ボタンをクリックします。
【ステップ2 実行プログラム(Lambda)の骨組みと権限の作成】
1. Lambdaのダッシュボードに移動し、「関数の作成」をクリックします。
2. 「一から作成」を選択し、関数名を「Comet-Memo-Function」と入力します。
3. ランタイムは「Python 3.11」を選択します。
4. 「実行ロールの変更」を展開し、「基本的なLambdaアクセス権限で新しいロールを作成」を選択して、関数を作成します。
関数が作成されたら、「設定」タブの「アクセス権限」メニューに移動します。
5. 実行ロール名をクリックして、IAMコンソールに移動します。
6. IAMロールの画面で、「許可を追加」ボタンから「ポリシーをアタッチ」を選択します。
7. ポリシーのリストから「AmazonDynamoDBFullAccess」を検索し、チェックボックスをオンにして「許可を追加」ボタンをクリックします。
【ステップ3 APIの窓口(API Gateway)の作成】
1. API Gatewayのダッシュボードに移動し、「REST API」の「構築」ボタンをクリックします。
2. 「新しいAPI」を選択し、API名に「Comet-Memo-API」と入力して「APIの作成」をクリックします。
3. 「アクション」ドロップダウンから「リソースの作成」を選択し、リソース名に「memo」と入力して作成します。
4. 作成した「/memo」リソースを選択した状態で、「アクション」ドロップダウンから「メソッドの作成」を選択し、「POST」を選んでチェックマークをクリックします。
5. 統合タイプで「Lambda関数」を選択し、「Lambdaプロキシ統合の使用」にチェックを入れます。
6. Lambda関数の入力欄で、作成済みの「Comet-Memo-Function」を選択します。
7. 「保存」をクリックし、確認ダイアログで「OK」をクリックします。
【ステップ4 Lambdaコードの生成と書き込み】
1. Lambdaのダッシュボードに戻り、「Comet-Memo-Function」関数を選択します。
2. 「コード」タブを開き、既存のコードをすべて削除します。
3. 以下の処理を行うPython 3.11のコードを、コードソースエディタに書き込んでください。
---
処理内容
- API GatewayからのPOSTリクエストを受け取ります。
- リクエストのボディ(JSON形式)から `username` と `message` の値を取得します。
- ユニークなIDとして、現在時刻のタイムスタンプとランダムな文字列を組み合わせた `memo_id` を生成します。
- これらの `memo_id`, `username`, `message` を、DynamoDBの「Comet-Memo-Table」に保存します。
- 成功したら、ステータスコード200と「Memo saved successfully.」というメッセージを返します。
---
4. コードを書き込んだら、「Deploy」ボタンをクリックします。
最初の挑戦では、Lambda関数がDynamoDBにアクセスしようとした際にAccessDeniedException(アクセス拒否)というエラーが発生しました。原因を分析したところ、操作を実行していたIAMユーザーの権限が不足しており、Lambdaの実行ロールにDynamoDBへのアクセス権限を付与する操作が正しく完了していなかったためでした。
そこで、操作ユーザーのIAMポリシーを見直し、Lambdaの実行ロールを適切に作成・編集できる権限を付与した上で再挑戦しました。
すると、今度はCometがすべての手順をエラーなく完遂し、サーバーレスAPIのアーキテクチャを完全に自動で組み上げることに成功しました。
私が気になっていたLamdaのコードのところや、複数サービス間の連携が正しくできていて感動しました!
構築されたAPIが正しく機能するかを確認するため、APIテストツールを使い、APIエンドポイントにテストデータをPOSTしました。
DynamoDBのテーブルを確認すると、テストデータが正しくアップされていることが確認できました。これにより、API GatewayからLambda、DynamoDBへ至る一連の連携が、すべて正常に機能していることが確認できました。
この結果は、「適切な権限設計と詳細なプロンプト」という前提条件さえ満たせば、AIブラウザはサービスを横断する複雑なアーキテクチャすら自動で構築可能であるという、AIブラウザのポテンシャルを示すものとなりました。
今回の検証では、AIブラウザが秘める大きな可能性を実感すると同時に、一つの重要な疑問が浮かび上がりました。それは、「結局、再現性や管理性を考えるとIaC(Infrastructure as Code)で良いのでは?」という、既存手法との関係性についての問いです。
しかし、両者の特性を調べて比較した結果、私はそれらが単純な代替関係にあるのではなく、開発プロセスの異なるフェーズで互いを補完しあう形で、うまく使い分けできるのではないかと考えました。
AIブラウザとIaCは、それぞれ異なる強みを持つツールです。
この2つの特性を活かすことで、以下のような新しいハイブリッドな開発ワークフローが考えられます。
AIブラウザは、AWS CloudFormationなどのIaCを学習する際や、最初の構成を検討する際のプロトタイプ作成ツールとして、開発プロセスに新たな選択肢をもたらしてくれる可能性を感じました。
AIブラウザが持つ大きな可能性と同時に、私たちはそのリスクと技術的な課題についても理解しておく必要があります。
AIブラウザが抱える最も深刻なリスクの一つに、「間接プロンプトインジェクション」と呼ばれる脆弱性があります。
従来のプロンプトインジェクション[2]はユーザーが悪意ある指示を出すものでしたが、AIブラウザの場合は攻撃者がWebページなどのコンテンツ内に悪意ある指示を潜ませる点が異なります。
AIは、本来処理すべき「Webページの内容(データ)」と「AIへの命令(コード)」を明確に区別することが困難です。そのため、Webページ内に隠された(あるいは明記された)攻撃者の指示を読み込んでしまい、ユーザーの意図に反して個人情報を送信したり、不正な操作を実行させられたりする可能性があります。
この脅威に対する根本的な解決策はまだ確立されていませんが、ユーザー側で実施できる対策はいくつか存在します。
これらは現時点での対症療法であり、今後のAIブラウザ技術の進化と共に、より堅牢なセキュリティ対策が実装されることが期待されます。
今回のAWSにおける検証も、これらのリスクを考慮し、以下のセキュリティプラクティスの上で実施しました。
AIブラウザを試す際は、このようなサンドボックス環境を用意することが重要だと思います。
本稿では、AIブラウザ「Comet」を用いたAWSのアーキテクチャ構築検証の結果を報告しました。
検証を通じて、AIブラウザは、適切な権限設計と詳細なプロンプトさえあれば、単一のリソース作成から、ある程度複雑なサーバーレスアーキテクチャの構築まで、自動化できるポテンシャルを秘めていることがわかりました。
本稿で考察したIaCとの住み分けや、セキュリティリスクといった懸念点は依然として存在しますが、AIブラウザがエンジニアを定型的なGUI操作から解放し、より創造的な業務へとシフトさせてくれる未来は、そう遠くないのかもしれません。
この記事が、皆さまにとってAI×AWSの新たな可能性を感じる一助となれば幸いです。
本記事は TechHarmony Advent Calendar 2025 12/17付の記事です。 |
Events から条件を絞ってフィルタリングを行う際、一致条件を選択することができますが、
部分一致で検索したい場合は、Contains の利用が便利です。
例えば、複数のドメイン(*.microsoft.com)宛ての通信を検索したい場合、is, in では一つずつ指定する必要があるため手間がかかりますが、”Contains: microsoft”で検索すれば、ドメインに”microsoft”が含まれたすべてのドメインを検索にかけることができます。Application や URL など、Field で他のものを選択した際にも同じ形で検索することが可能です。
例として、”teams.microsoft.com” への通信イベントを検索する際…
▼is の場合
microsoft の指定だけではヒットせず、teams.microsoft.com で指定することにより、該当ドメインのイベントが出力されます。
▼Contains の場合
microsoft を指定した場合、”microsoft”が含まれたすべてのドメインを検索できます。
ヒットする文字列が検索されるため、microso のような指定でも検索が可能です!
あるドメインに対して接続に失敗するにもかかわらず、Events上で Domain Name で検索しても接続不可のドメインが表示されずにブロックログが見れない、というお問い合わせをいただくことがあります。
その原因の1つとして、該当通信が DNS Protection 機能でブロックされている可能性があります。
例として、以下イベントログからは、あるドメインが DNS Protection によりフィッシングサイトと判定されてブロックされていることがわかります。
しかし、該当ドメインは DNS Query として表示されており、 Domain Name では表示されません。
![]()
そのため、Domain Name で検索してもヒットしない場合は、DNS Query で検索をかけると、ブロックログが確認できるかもしれません…!
また、DNS Protection にてブロックされた場合、”DNS Protection Category”に、どのカテゴリでブロックされたかが表示されます。(カテゴリ一覧は Security > DNS Protection より確認できます)
ドメインへのアクセスがブロックされるのに Domain Name で表示されない場合は、上記をお試しください!
もう一つよくお問い合わせいただく内容として、
あるドメインを、サブドメインも含めてワイルドカード指定
(*.microsoft.com など)でポリシールールの条件として指定したいんだけど、どう設定したらいい?
というお問い合わせを受けることがあるのですが、現状Cato Cloudでは、ワイルドカード指定でのポリシールール等の設定はサポートされていません…
Cato でのドメイン・FQDN ごとの指定方法は以下のようになります。
設定したNATルールが正しく適用されているかわからないといった問い合わせもいただくことがあります。
NAT 変換後の IP アドレスは、Events の Public Source IP から確認することができます。
Public Source IP が意図したものになっていれば、NAT ルールは正しく適用されていると判断できます。
例として、主なパターンを紹介します。
こんにちは、SCSKの木澤です。
今年もAmbassadorアドベントカレンダーへ寄稿させていただきます(公開が1日遅れですみません)
ありがたいことに、今年もre:Inventに参加させていただきました。
今回は参加したキーノートやワークショップを通じて感じたAWSの戦略についてお話ししたいと思います。
私はAWS Ambassadorに認定いただいていることもあり、今年もありがたく参加させていただきました。
なおre:Inventは規模が桁違いに大きく、セッションやアクティビティも多いので、イベントで満足感を得られるかどうかは各参加者の行動計画に委ねられることと感じています。私の過去の体験としてはこんな感じで
今年は過去の体験を踏まえ、キーノートとワークショップ、EXPO巡回を中心に若干余裕を持ったスケジュールで計画しましたが、過去と比較しても満足感は高かったですね。
本イベントに参加する意義や感じ方は人それぞれかと思いますが、私としてはしっかりキーノートでトレンドを抑える、それとワークショップで新サービス中心に手を動かすことに価値があるのではないかというのが結論です。
なお、今年のre:Inventのレポートは、同行者の蛭田さんから多く発信いただきました。
現地の雰囲気を良く伝えられているかと思いますので、ご紹介いたします。
さて、re:Invent 2025の話に入る前に現在のトレンドから触れたいと思います。
現在、AI革命がもの凄い速度で進行中ですね。
私がIT業界に入って四半世紀過ぎましたが、これほどの激動を感じたことはありません。
なお約30年前にはインターネット革命がありました。
現在のIT覇権を握る企業には、その頃に起業された方々も多いです。
AI革命によって、今後数十年の覇権を握る企業が現われるのでは?
と投資家が思ってマネーが渦巻いている…というのが現在の状況と認識しています。
現在のAI革命におけるステイクホルダーとしては、このように整理するとわかりやすいかと思います。
現在のトレンドとして、あいにく 1.チップメーカーに富(利益)が集中する歪な状況 になっています。
急速なAI利用拡大に伴い、全世界的にデータセンターが不足する状況になっています。
特にAI利用においては多くの電力を消費するGPU等を大量に利用しますので、電力消費が莫大となります。
以下ガートナー社のレポートのリンクを掲載しますが、2030年までに電力需要は2倍に達する予想となっています。
米国では盛んな電力需要に応えるため、原発の新設などが計画されています。
参考:Gartner、データセンターの電力需要は2025年に16%増加し、2030年までに2倍になるとの予測を発表
https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20251119-dc
それを踏まえて、re:Inventで感じたことを綴りたいと思います。
Matt Garman CTOのキーノートでは、冒頭多めの時間をとって、新しいAI学習用チップであるTrainium3プロセッサと、それを144基搭載したTrn3 UltraServersの発表がありました。
なぜ、主にインフラ担当のPeter DeSantisのキーノートでなく、Matt CEOのキーノートで採りあげるのか、とお感じの方もいるかもしれませんが、やはりAIモデルの開発ベンダー等、大規模利用顧客へのメッセージがあるのかと思います。
Trainium3プロセッサと、それを144基搭載したTrn3 UltraServersの特徴を挙げますと
敢えて電力効率を推しているあたりで、AWSとしての推しは「コスパ」なんだろうと推察します。
今後電力が逼迫することが予想される状況においては、より低消費電力で動作するAIサーバの需要が高まるという予測もあるのかと思います。
余談になりますが、1ラックにこれだけ詰めて凄いですね。従来型のIAサーバーでもここまで詰めたら熱で異常が起こりそうです。ASICベースのTrainiumプロセッサだからこそできる芸当なのか、と思うとワクワクします。
Amazon Bedrock AgentCoreは、現在AWSイチオシのサービスと言って差し支えないかと思います。
今年7月の発表、10月のGA以降、急激に利用拡大が進んでいると聞いています。
今回re:Invent中の各種発表の中でも、AWSはAIエージェントを動かす環境として最適な基盤だというメッセージが多く含まれていたのが印象的でした。
主なAIエージェント関連のアップデートは以下となります。
今回のre:InventはAIエージェント一色と言っても過言でないプログラムとなっており、キーノートで発表されたアップデート以外にも多くのワークショップでAIエージェントの活用ユースケースについて触れたものがありました。
私が参加したワークショップの概要だけ書きますと…
障害時の一時切り分け、AIによる障害原因の分析、復旧までAIエージェント経由でやってもらうワークショップ。
これらのなツールをAIエージェントに与えることで、障害原因の分析と復旧まで行うことができました。
SecurityHub⇒S3に保存したセキュリティログをAIエージェントに分析させるワークショップ。
自然言語を使ってAIエージェントに「重要な発見を教えて」「どう解決できるか」を指示することで、SecurityHubで発見されたポイントとそれに対応する解決手段を得ることができました。
また、「解決してください」と指示すると、エージェントが問題を解決してくれました。
このようなワークショップ(ハンズオン)がありました。
Amazon Bedrock AgentCoreの周辺機能拡充で「使い勝手の良い」AIエージェント開発環境を提供することや、具体的なAIエージェントのユースケースを伝えることで、より開発者(ビルダー)に、AWSのAIエージェント環境を使ってもらいたい!という意思を明確に感じることができました。
ここまで、基盤側のアップデートと、AIエージェント環境拡充と両面の話をさせていただきました。
総合すると、AWSの戦略が見えてくると思います。
そんなメッセージを強く感じた今回の訪問でした。
本内容については、2025/12/16に開催した JAWS-UG Sales #4のLTで発表させていただきました。
ご聴講いただいた皆様、ありがとうございました。
本記事は TechHarmony Advent Calendar 2025 12/16付の記事です。 |
本記事では、TerraformのCato Providerを利用してCato Cloud上にサイトを構築する手順を解説します。
Terraformは、HashiCorp社が提供するInfrastructure as Code(コードによるインフラ管理)ツールです。マルチクラウド環境や各種SaaSに対応することで、インフラの構成・変更・管理を一貫して実施できます。
Terraformから操作できるCatoクラウドの機能についてはCatoクラウドでのTerraformの使用参照ください。
公式ドキュメント(https://registry.terraform.io/providers/catonetworks/cato/latest/docs )のサンプルコードを使用し、Windowsパソコン上にTerraformのインストール、コードの修正、構築、コンソール上の確認を行います。
Terraformの公式サイトにアクセスしてください。ここでは[Windows]-[Binary download]-[386]-[Download]と選択してください。
Zipファイルとしてダウンロードされるので、任意のフォルダですべて展開してください。ここでは[C:\morimura\app\terraform]としています。

どのパスからも実行できるように環境変数を設定します。
ここではユーザー環境変数に設定します。システム環境変数でもかまいません。[Path]を選択し[編集]ボタンをクリックしてください。
[新規]ボタンをクリックし、[terraform.exe]を保存したパスを入力し[OK]ボタンをクリックしてください。開いていた元のウィンドウも[OK]ボタンをクリックし閉じてください。
コマンドプロンプトを起動します。
[terraform -v]を入力し、Enterキーを押します。
CMAにログインし、[Resources]→[API Keys]とクリックしてください。[New]ボタンをクリックしてください。
API Permissionは[Edit]、その他の項目は適宜入力し、[Apply]ボタンをクリックしてください。
API Keyが表示されるので□の部分をクリックし、Keyをコピーします。
メモ帳等に貼り付けて保存してください。厳重に管理してください。
任意のフォルダを作成し、main.tfというファイルを作成し、メモ帳※で開いてください。※使い慣れているエディタで問題ありません。
公式ドキュメント(https://registry.terraform.io/providers/catonetworks/cato/latest/docs )のサンプルコードで[Copy]ボタンをクリックした後、作成したmain.tfに貼り付けてください。
貼り付けたコードをメモ帳上で下記置き換えてください。
provider "cato" {
baseurl = "https://api.catonetworks.com/api/v1/graphql2"
token = "xxxxxxx"←さきほどCMAで作成したAPIキーを貼り付けてください
account_id = "xxxxxxx"←利用のアカウントのIDを入力してください
}
site_location = {
country_code = "FR"
timezone = "Europe/Paris"
}
↓
site_location = {
country_code = "JP"
timezone = "Asia/Tokyo"
}
#resource "cato_static_host" "host" {
#site_id = cato_socket_site.site1.id
#name = "test-terraform"
#ip = "192.168.25.24"
#}
その他IPアドレスレンジやサイト名等既存と重複する場合は別途書き換えをお願いします。
コピペできませんが、以下の内容になります。

コマンドプロンプト上で先ほど作成したmain.tfのフォルダに移動してください。
Terraform環境を初期化します。
[terraform init]と打ち込んでください。
実行計画の確認をします。
[terraform plan]と打ち込んでください。
実行計画の確認ができ、ApplyするとCatoクラウドにサイトが構築されます。
[terraform apply]と打ち込んでください。
実行するか確認されるので[yes]と打ち込んでください。
Catoクラウドにサイトが構築されました。
Catoクラウドにサイトが構築されたことをCMA上で確認します。
CMAにログインし、[Network]→[Sites]とクリックしてください。作成された[SOCKET Site – X1700]をクリックしてください。
[Site Configuration]→[General]とクリックしてください。
サンプルコードで定義した値が設定されていることを確認してください。
できる限り単純な構成、環境でTerraformからCatoクラウドの操作を行いました。
Terraformを活用することで、インフラ運用の効率化や構成管理の厳格化が可能となります。
Cato Cloudにおいても同様にコード管理が有効ですので、本手順を参考に自動化の導入を推進いただければ幸いです。
]]> 本記事は TechHarmony Advent Calendar 2025 12/16付の記事です。 |
こんにちは。SCSKの さと です。
2025年のre:Inventは何が印象に残ったでしょうか。DevOps Agent?新しいSecurity Hub?あるいはDr. Werner Vogelsの最後のKeynoteでしょうか。
さて、今回はre:Inventで発表された自動推論チェックについてご紹介します。とはいっても2024年のre:Inventです。本機能は長らくプレビュー状態で申請をしないと利用できない状態だったのですが、8月ごろにGAとなっていたため、触ってみました。
自動推論チェック機能はBedrockのガードレールポリシーの一つとして追加され、大規模言語モデル(LLM)によって生成される出力を検証可能な推論エンジンを用いて評価し、応答の正確性を検証するものです。
自動推論は人工知能の一分野として長年研究されてきた技術であり、統計モデルを用いる機械学習とは異なり、論理式やルールに基づく推論を用いて結論を導きます。推論過程が明確で説明可能性が高いことから、高い信頼性が求められる領域で有効です。
AWSではすでにIAM Access Analyzerなどで自動推論の技術が使われてきましたが、今回は同様の技術がBedrock Guardrailsに取り込まれ、最大99%の検証精度が実現されると宣伝されています。
ユーザーが自然言語でドキュメントをソースとして読み込ませると、サービスはドキュメントからルールを抽出し、ポリシーを生成します。自動推論チェックでは、LLMの応答とポリシーを照合し、以下の検証結果を返します。
| 結果タイプ | 説明 |
| VALID | 入出力の組をポリシーから導くことができ、さらに矛盾するポリシーが存在しない |
| INVALID | 入出力の組に対して明確に矛盾するポリシーがある |
| SATISFIABLE | 他の条件によっては入出力が真とも偽ともなりうる |
| IMPOSSIBLE | 入出力に含まれる前提がポリシーと矛盾している、またはポリシー同士で論理的な競合が起こっている |
| NO_TRANSLATIONS | 入出力がポリシーと無関係等の理由により、入力の一部または全てが形式的な表現に変換できなかった |
| TRANSLATION_AMBIGUOUS | 入出力が曖昧なため適切に形式論理として解釈できず、さらに質問をするなどで追加情報が必要 |
| TOO_COMPLEX |
入出力が複雑であり、有効な時間内に回答できない |
なお、記事執筆時点において自動推論チェックは検出モードのみをサポートしており、このためLLMの回答に対してINVALIDと判定された場合であっても自動で回答がブロックされることはありません。このため、無効と判定された回答に対して再生成を促すワークフローを組むなど、適宜ユーザー側で実装が必要である点については留意が必要です。
というわけで、本記事ではカスタムのドキュメントを読み込ませ、生成されるポリシーをテストするところまで実際に行ってみようと思います。今回は成績を評価するためのルールをChatGPTに作ってもらいました。(実際にはこちらを英訳したものを読み込ませています)
自動推論のコンソールで「ポリシーを作成」をクリックし、ソースとなるドキュメントをアップロードします。その下には、ドキュメントの説明を入力する欄があります。こちらの入力は任意ですが、入力された情報はルールの抽出処理で使われるため、どのようなドキュメントなのか、どのような質問が想定されるのかを書いておくことが公式ドキュメントで推奨されています。
ドキュメントからポリシーを抽出するのに数分待ったあと、抽出されたポリシーの定義が表示されます。ポリシーは、ドキュメントに登場する主要な概念を表す変数、変数間の論理的関係を規則の形式として表すルール、変数がブール型・数値型のいずれでもない場合に取りうる値を規定するカスタム型から構成されます。
ポリシーの生成と同時に、ポリシーがドキュメントの内容を正しく反映しているか検証するためのテストケースも自動で生成してくれます。これに加えて、テストケースを追加で生成、あるいはユーザー自身で作成することも可能です。
今回は次のようなテストケースを作成しました。軽微な不正行為により、成績が最大でもDになるというシナリオです。
一定の条件に当てはまる場合、点数が高くても評定の上限がかかります(上げる方向には働きません)。
9.1 軽微な学術不正
軽微な学術不正(不適切な引用等)がある場合、最終評定は 最大でもD です。
※点数が60未満ならFのままです。
9.2 出席キャップ
換算無断欠席が4回以上の場合、最終評定は 最大でもC です。
(本来C+以上になる点数でもCまでに制限されます)
テストケースを保存すると、自動で評価が走ります。結果を見ると、本来応答が正しい(Valid)と判定されるべきところをSatisfiable、すなわち「応答結果が有効とも無効ともなりうる」と判断されて失敗してしまったようです。
詳細を開くと、どのようなシナリオで失敗しているかを確認することができます。今のルールでは、与えられた条件から、今回はDで確定されるべきfinalLetterGradeがBとなりうると導かれてしまっているようです。

テスト結果から想定されない最終評定が導かれてしまっていることが分かったため、ポリシーを修正していきます。最終評定(finalLetterGrade)が関係するルールを検索すると、以下のようなものがありました(実際のルールを日本語に読み下しています)。
finalLetterGrade is equal to:
if at least one of the following 5 statements is true:
1) calculatedLetterGrade is equal to F
2) academicMisconduct is equal to SEVERE
3) convertedUnexcusedAbsences is at least 6
4) tookFinalExam is false
5) submittedFinalProject is false
then F
else if at least one of the following 2 statements is true:
1) the following 2 statements are true:
1a) academicMisconduct is equal to MINOR
1b) at least one of the following 9 statements is true:
1b1) calculatedLetterGrade is equal to A_PLUS
1b2) calculatedLetterGrade is equal to A
1b3) calculatedLetterGrade is equal to A_MINUS
1b4) calculatedLetterGrade is equal to B_PLUS
1b5) calculatedLetterGrade is equal to B
1b6) calculatedLetterGrade is equal to B_MINUS
1b7) calculatedLetterGrade is equal to C_PLUS
1b8) calculatedLetterGrade is equal to C
1b9) calculatedLetterGrade is equal to C_MINUS
2) the following 2 statements are true:
2a) convertedUnexcusedAbsences is at least 4
2b) at least one of the following 7 statements is true:
2b1) calculatedLetterGrade is equal to A_PLUS
2b2) calculatedLetterGrade is equal to A
2b3) calculatedLetterGrade is equal to A_MINUS
2b4) calculatedLetterGrade is equal to B_PLUS
2b5) calculatedLetterGrade is equal to B
2b6) calculatedLetterGrade is equal to B_MINUS
2b7) calculatedLetterGrade is equal to C_PLUS
then gradeCap
else calculatedLetterGrade
一見してルールが正しく反映されてそうですが、よく見ると他のルールでgradeCapの値がどうなるか定義されておらず、どのような値でも正しいと評価されてしまう状態となっていました。
ポリシーの修正も自然言語で行うことができます。今回は、以下のように上限評定(gradeCap)を定義するルールを追加しました。
If academicMisconduct = MINOR, then gradeCap = D.
Else if convertedUnexcusedAbsences >= 4, then gradeCap = C.
Otherwise, gradeCap = A_PLUS.
再度評価を実行し、結果がValidとなることを確認できました。
いかがだったでしょうか。確率的な応答をする生成AIに対して、推論システムの力を借りて説明可能性を高めるというアプローチは魅力的な一方、今回のハンズオンを通じて分かったように、生成されたポリシーを手放しでデプロイできる、というまではまだ難しいようです。
実は、今回のハンズオンでは一部AWSの定めるベストプラクティスから外れた部分があります。
AWS公式の自動推論に関するドキュメントでは、まずは核となる最小限のポリシーを生成し、そこから十分なテストを繰り返しながら段階的にルールを付け加えていくことを推奨しています。だからこそ、コンソール上でテストを行い、結果を反映させるための機能が充実している点も触ってみる中で強く印象に残りました。
ここまでお読みいただきありがとうございました。よい年をお迎えください。
]]>こんにちは、SCSKの坂木です。
クラウドを活用する上で、ファイルストレージの選定は重要なテーマの一つです。「複数のサーバーからアクセスできる共有ストレージが欲しい」「Windowsのファイルサーバーをクラウドに移行したい」といったニーズは尽きません。
AWSにはその答えとして、Amazon EFS と Amazon FSx という強力なマネージドサービスが用意されています。
この記事では、IaC (Infrastructure as Code) ツールである Terraform を使い、これら2つのサービスを実際に構築してみます。
Terraformはインフラをコードで管理するためのIaCツールです。AWSのwebインタフェースを何度もクリックする代わりに、サーバやストレージの構成をコードとして記述します。
これにより、誰が実行しても全く同じ環境を正確に再現でき、コードをGitなどでバージョン管理することも可能になります。
今回はAWSを対象としますが、TerraformはAzureやGoogle Cloudといった他のクラウドでも全く同じ書き方でインフラを管理できます。

Amazon EFS (Elastic File System) は、主にLinux向けのファイルストレージです。
Amazon EFSの最大の特徴は、データ量に応じてストレージ容量が自動で拡張・縮小できる点です。
NFSプロトコルで接続し、複数のサーバーから同時にアクセスできるため、Webサーバのコンテンツ共有やデータ分析基盤に適しています。
Amazon FSx for Windows File Serverは、Windows環境に特化したファイルストレージです。
SMBプロトコルで接続し、Active Directoryと連携します。これにより、従来のWindowsサーバと同様に、ユーザ・グループ単位でのアクセス権設定やシャドウコピーといったネイティブ機能を利用できるのが大きな魅力です。
今回構築するEFSの設定は下表のとおりです。
サブネットとセキュリティグループは既存のものを利用するため、これらは事前に作成しておいてください。
| 設定項目 | 設定値 |
| 名前 | Iac-efs |
| デプロイ | 1ゾーン (ap-northeast-1a に作成) |
| 保管時のデータ暗号化 | 有効 |
| スループットモード | バースト |
| 自動バックアップ | 有効 |
| サブネット | subnet-xxxxxxxxxxxxxxxxx(作成済みのものを指定) |
| セキュリティグループ | sg-xxxxxxxxxxxxxxxxxx(作成済みのものを指定) |
terrformのコードは以下の2つを作成します。
▼main.tf
# EFS ファイルシステム
resource "aws_efs_file_system" "iac_efs" {
creation_token = "Iac-efs"
encrypted = true
performance_mode = "generalPurpose"
throughput_mode = "bursting"
availability_zone_name = "ap-northeast-1a"
tags = {
Name = "Iac-efs"
}
}
# 自動バックアップ設定(有効化)
resource "aws_efs_backup_policy" "iac_efs_backup" {
file_system_id = aws_efs_file_system.iac_efs.id
backup_policy {
status = "ENABLED"
}
}
# マウントターゲット
resource "aws_efs_mount_target" "iac_efs_mt" {
file_system_id = aws_efs_file_system.iac_efs.id
subnet_id = "subnet-xxxxxxxxxxxxxxxxx"
security_groups = ["sg-xxxxxxxxxxxxxxxxxx"]
}
▼provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.10.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
main.tfとprovider.tfを同じフォルダに配置し、以下のコマンドを実行してリソースをデプロイします。
>terraform init #Terraformの初期化を行います。 #「Terraform has been successfully initialized!」と表示されれば成功です。 >terraform plan #作成されるリソースの実行計画をプレビューします。 #「Plan: X to add, 0 to change, 0 to destroy.」のように表示されることを確認します。 >terraform apply #planの内容でリソースを実際に作成します。 #「Apply complete! Resources: X added, ...」と表示されればデプロイ成功です。
AWSのインタフェースから、リソースが作成されていることを確認します。
動作確認として、EC2①とEC2②の両方からEFSをマウントし、EC2①で作成したファイルがEC2②からも参照できるか検証します。
EC2①にログインし、「Hello, EFS!」と記載されたtest.txtを作成します。
▼EC①のコンソール # yum install -y amazon-efs-utils # mkdir /mnt/efs # mount -t efs fs-xxxxxxxxxxxxxxxxx:/ /mnt/efs # df -h /mnt/efs Filesystem Size Used Avail Use% Mounted on 127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs # echo "Hello, EFS!" | sudo tee /mnt/efs/test.txt ←ここでファイルを作成 Hello, EFS! # cat /mnt/efs/test.txt Hello, EFS!
EC2②で、EC2①で作成した「Hello, EFS!」と記載されたtest.txtが存在するか確認します。
▼EC2➁のコンソール # yum install -y amazon-efs-utils # mkdir /mnt/efs # mount -t efs fs-xxxxxxxxxxxxxxxxx:/ /mnt/efs # df -h /mnt/efs Filesystem Size Used Avail Use% Mounted on 127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs # ls /mnt/efs/ ←ここでEC2➀で作成されたファイルが共有されたことを確認 test.txt # cat /mnt/efs/test.txt Hello, EFS!
こちらのようにファイルが共有されていることを確認できました。
今回構築するFSxの設定は下表のとおりです。ADは Amazon Managed AD ではなく、自己管理型の Active Directory を利用します。
サブネットとセキュリティグループは既存のものを利用するため、これらは事前に作成しておいてください。
| 設定項目 | 設定値 |
| 名前 | Iac-fsx |
| デプロイタイプ | シングルAZ (ap-northeast-1a に作成) |
| ストレージタイプ | SSD |
| ストレージ容量 | 32GB |
| スループットキャパシティ | 32 MB/秒 |
| サブネット | subnet-xxxxxxxxxxxxxxxxx(作成済みのものを指定) |
| セキュリティグループ | sg-xxxxxxxxxxxxxxxxxx(作成済みのものを指定) |
| 認証タイプ | セルフマネージド型 Microsoft Active Directory |
| 完全修飾ドメイン名 | test.local |
| DNS サーバーの IP アドレス | 10.0.2.241 |
| サービスアカウントのユーザー名 | <Secrets Managerから取得したパスワード> |
| サービスアカウントのパスワード | <Secrets Managerから取得したパスワード> |
| 組織単位 (OU) | OU=FSx,DC=test,DC=local |
| ファイルシステム管理者グループ | Domain Admins |
| 毎日の自動バックアップ | 有効 |
| 自動バックアップ保持期間 | 7日 |
| 毎日の自動バックアップウィンドウ | 03:00 (UTC) |
AD管理者のログイン情報は AWS Secrets Manager で管理するため、シークレットも作成します。
| 設定項目 | 設定値 |
| シークレット名 | Iac_fsx_secret |
| ユーザー名 | Administrator |
| パスワード | XXXXXXXXXX |
terrformのコードは以下の2つを作成します。provider.tfはEFS作成時と同じものを利用します。
▼main.tf
# ---------------------------------------------------------------------
# Secrets Manager
# ---------------------------------------------------------------------
# 1. シークレットの器を作成
resource "aws_secretsmanager_secret" "fsx_ad_secret" {
name = "Iac_fsx_secret"
tags = {
Name = "Iac_fsx_secret"
}
}
# 2. シークレットの値を設定
resource "aws_secretsmanager_secret_version" "fsx_ad_secret_version" {
secret_id = aws_secretsmanager_secret.fsx_ad_secret.id
secret_string = jsonencode({
username = "Administrator"
password = "XXXXXXXXXX"
})
}
# 3. JSON から "username" と "password" を個別に抽出
locals {
# 作成したリソースを参照するように変更
ad_credentials = jsondecode(aws_secretsmanager_secret_version.fsx_ad_secret_version.secret_string)
}
# ---------------------------------------------------------------------
# FSx for Windows File System
# ---------------------------------------------------------------------
resource "aws_fsx_windows_file_system" "iac_fsx" {
storage_capacity = 32
storage_type = "SSD"
throughput_capacity = 32
deployment_type = "SINGLE_AZ_1"
subnet_ids = ["subnet-xxxxxxxxxxxxxxxxx"]
security_group_ids = ["sg-xxxxxxxxxxxxxxxxxx"]
self_managed_active_directory {
dns_ips = ["10.0.2.241"]
domain_name = "test.local"
username = local.ad_credentials.username # JSONから抽出
password = local.ad_credentials.password # JSONから抽出
organizational_unit_distinguished_name = "OU=FSx,DC=test,DC=local"
file_system_administrators_group = "Domain Admins"
}
automatic_backup_retention_days = 7
daily_automatic_backup_start_time = "03:00"
tags = {
Name = "Iac-fsx"
}
}
main.tfとprovider.tfを同じフォルダに配置し、以下のコマンドを実行してリソースをデプロイします。
>terraform init #Terraformの初期化を行います。 #「Terraform has been successfully initialized!」と表示されれば成功です。 >terraform plan #作成されるリソースの実行計画をプレビューします。 #「Plan: X to add, 0 to change, 0 to destroy.」のように表示されることを確認します。 >terraform apply #planの内容でリソースを実際に作成します。 #「Apply complete! Resources: X added, ...」と表示されればデプロイ成功です。
AWSのインタフェースから、リソースが作成されていることを確認します。
動作確認として、EC2①とEC2②の両方からFSxをマウントし、EC2①で作成したファイルがEC2②からも参照できるか検証します。
このとき、EC2➀と②はFSxと同じドメインに属している必要があります。
EC2インスタンス①と②のそれぞれで、以下のnet useコマンドを実行してFSxをマウントします。
コマンド実行後、ドメイン管理者のユーザ名とパスワードの入力を求められるので、入力してください。
「The command completed successfully.」と表示されれば、マウントは成功です。
C:\Users\Administrator>net use Z: \\amznfsxlerptxpk.test.local\share Enter the user name for 'amznfsxlerptxpk.test.local': [email protected] Enter the password for amznfsxlerptxpk.test.local: The command completed successfully.
EC2①で、testfile.txtを作成します。
EC2②で、EC2①で作成したtestfile.txtが存在するか確認します。
こちらのようにファイルが共有されていることを確認できました。
Terraformで作成したリソースは、コマンド一つで簡単にクリーンアップできます。
EFSやFSxのmain.tfファイルが保存されているディレクトリで、以下のコマンドを実行します。
>terraform destroy
※本番環境など、重要なリソースが含まれるディレクトリで誤って実行しないよう、コマンドを実行する際はカレントディレクトリを十分に確認してください。
本記事では、Terraformを使い、AWSが提供する2つの主要なマネージドファイルストレージであるAmazon EFSとAmazon FSx for Windows File Serverを構築する手順を解説しました。
TerraformというIaCツールを利用することで、このようなインフラ環境をコードとして定義し、誰でも・何度でも同じ構成を正確に再現できるメリットを実感いただけたかと思います。
今回のコードをベースに、バックアップ戦略のカスタマイズやライフサイクルポリシーの設定など、より高度な機能にもぜひ挑戦してみてください。この記事が、皆さんのAWS環境構築の効率化の一助となれば幸いです。
▼ AWSに関するおすすめ記事


本記事は TechHarmony Advent Calendar 2025 12/15付の記事です。 |
CatoクラウドのSD-WANライセンスにPooledライセンスが追加されてしばらく経ちましたが、2025年8月のメニュー改定で、これまで最低契約帯域が1000Mbpsだったのが100Mbpsから契約可能になったため、拠点数が少ないお客様にもPooledライセンスが身近な選択肢となりました。
今後、お客様の次回契約更新時にPooledライセンスへの切り替えが増えることが予想されますので、この記事ではあらためてPooledライセンスの概要と、CMAにおける実際のライセンス切り替え操作方法についてご紹介します。
2025年12月現在、CatoクラウドのSD-WANライセンスには以下の4種類があります。(モバイルライセンスは除く)
| No | ライセンス種別 | Socket | 概要 | |
| 1 | Siteライセンス | SASE | 要 | 拠点接続の標準ライセンスで、接続帯域メニューが最小 25Mbpsから50M・100M・250M・500M・1,000M・2,000M・3,000M・5,000M、最大10,000Mがラインナップされています。 |
| 2 | SSE | 不要 | CatoクラウドとIPsec接続するライセンス。Socketが不要なので安価にはなりますが、SD-WANの機能をフル活用できません。 vSocket接続ができないクラウド(2025年12月現在OCIなど)接続や、小規模拠点接続用。 |
|
| 3 | Pooledライセンス | 要 | 100Mbps以上の帯域をプール契約して、お客様ご自身で拠点に帯域を割り当てることができます。特に帯域幅が小さな拠点が多数あるネットワークではコストメリットがあります。 ・初回契約時は100Mbps以上10M刻みで契約可能 ・追加契約は100M単位で追加可能 ・1拠点の最小割り当て帯域は10Mbps ・プール帯域の範囲内であれば、拠点の帯域割り当ての増減は自由(一時的に10Mbps→30Mbpsに帯域UPなど) ・お客様アカウント内でSiteライセンスとの同時利用は可能、但しSiteライセンスの拠点にプール帯域を追加することは不可 |
|
| 4 | Cloud Interconnect 「旧称:Cross Connect」 |
不要 | Cato版のAWS Direct Connect, Azure Express Route, OCI Fast Connectです。これらクラウドと専用線接続するライセンスです。(こちらは251Mbps以上のSiteライセンス契約が必須です。つまり500Mbps以上のSiteライセンスのご契約となります) | |
では、Pooledライセンスを利用した事例をご紹介します。
実際には、Pooledライセンスだけで構成しているケースはほぼ無いと思われます。高帯域が必要な拠点もプール帯域で賄おうとすると費用も高くなるので、高帯域拠点はSiteライセンスにして、その他低帯域拠点はPooledライセンスにするパターンが一般的です。
以下の表は、34拠点を繋ぐネットワークで、Siteライセンスを中心に契約していたものを、契約更新時に低帯域拠点をPooledライセンスに変更する例です。
No5~7のSiteライセンスの合計帯域は1,000Mbpsですが、Pooledライセンスだと実際のトラフィック量に応じて設定できるので合計帯域は800Mbpsで済みます。また、No5~7の部分を弊社提供価格で試算すると、約40%のコストダウンになります。
また、ある拠点のトラフィック増に備えて合計1,000Mbpsを契約しても、それでも約30%弱のコストダウンとなります。1,000Mbpsを契約した場合200Mbpsの余剰があるので、ある支店のトラフィックが増えてネットワークが遅いという声が上がった場合は、20Mbpsを追加して70Mbpsにするなど、繁忙期の帯域増や営業所が増える場合もライセンスの追加契約が必要ありません。
| No | 拠点 | 用途/拠点規模 | 変更前 | 変更後 | ||
| 1 | データセンター | 社内システム | Siteライセンス | 100Mbps | Siteライセンス | 100Mbps |
| 2 | AWS | 各種サービス利用 | Siteライセンス | 250Mbps | Siteライセンス | 250Mbps |
| 3 | OCI | データベース | Siteライセンス(SSE) | 100Mbps | Siteライセンス(SSE) | 100Mbps |
| 4 | 本社 | 社員数100名 | Siteライセンス | 100Mbps | Siteライセンス | 100Mbps |
| 5 | 支店(全国10拠点) | 社員数40~50名 | Siteライセンス | 50Mbps | Pooledライセンス | 50Mbps |
| 6 | 営業所-a(全国10拠点) | 社員数10~20名 | Siteライセンス | 25Mbps | Pooledライセンス | 20Mbps |
| 7 | 営業所-b(全国10拠点) | 社員数2~5名 | Siteライセンス | 25Mbps | Pooledライセンス | 10Mbps |
ただし、拠点数や想定される割り当て帯域との組み合わせによっては、Siteライセンスのみを利用した方が安価になる場合もあります。
Pooledライセンスの場合は、現状のトラフィック利用状況に基づき、各拠点に何Mbpsを割り当てるかを決定して合計帯域を算出する必要があります。また、ある拠点はSiteライセンスで継続するか、あるいはPooledライセンスに切り替えるかなど、さまざまなパターンが考えられるため、検討すべき点が多く悩ましいところです。
続いて、Pooledライセンスに切り替える場合の具体的な対応内容をご紹介します。
上記の34拠点のネットワークを例に、2月28日に契約が満了し3月1日に契約を更新する場合を想定します。このとき、支店・営業所30拠点分のSiteライセンスを解約し、代わりに800MbpsのPooledライセンスを契約するケースをシミュレーションしてみます。
大まかな流れは次の通りです。
では、実際のCMAの画面で操作方法をご紹介します。
以降の図は、弊社の検証環境で操作したものです。切り替えのイメージをもっていただけると幸いです。
① 従来のSiteライセンスに加えて、50MbpsのPooledライセンスが付与された状態(Account > License でBandwidth)
② ライセンス切り替え前の状態(Siteライセンス25Mが割り当てられている)
(「該当Site」のSite Configuration > License)
③ License TypeでPooledライセンスを選択して、割り当て帯域30Mbpsを入力して「Add」ボタンを押下(その後Save)
数分でPooledライセンスに切り替わりますが、この間通信断はありません。
無事切り替えが終われば、あとは実際のトラフィック状況を確認して、割り当て帯域の妥当性をチェックしていけば良いかと思います。
将来は、AWS Auto Scalingみたいな「帯域が不足した拠点には自動で追加帯域が割り当てらる」ようになることを期待しています。
こんな事態になった場合、ライセンスの追加契約なしで帯域増ができるのがPooledライセンスのメリットです。
但し、Pooledライセンスに余剰があるのが前提です。
④ 20Mを追加して合計50Mを割り当てた状態(これで余剰帯域なしの状態)
トラフィック増が一時的なもので再び元の状態に戻ったら、追加した20Mは「ゴミ箱」から削除できます。
(元の30Mの削除もできます)
帯域を増減設定は、上記④のように「Add」と「削除」の操作になるので、帯域の余剰がない状態だと帯域ダウンする場合は要注意です。以下は、契約帯域を50Mbpsを全て割り当て済みの状態から30Mbpsにダウンする例です。
⑤ まず、契約しているプール帯域50Mを全てを割り当てた状態
⑥ 余剰がないので、割り当て帯域は選択できない
⑦ 割り当て済みの50Mを削除してもsaveができない。該当サイトをdisableにしないとダメと怒られる。
⑧ 該当サイトをdisableにすると、50Mを削除してsaveが押せるようになった。
※ただし、サイトをdisableにした時から当然通信断が発生
➈ saveするとライセンス未割り当て状態に。
⑩ 新規設定時と同様30Mを割り当ててsaveし、その後サイトをEnableにすれば帯域ダウンが完了!
※サイトをEnableにすると通信再開
このようなシチュエーションだと通信断ありきの作業になってしまうので、さすがにこれは受け入れられないと思われます。
ただし、Cato側でも既に仕様改善の動きがあるようなのでもう暫くするとアップデートにより改善されるはずです。
なお、現時点で余剰がない状況で帯域変更を行いたい場合は、ダミー(?)ライセンスを使って通信断なく帯域ダウンはできますので、
その際はご相談ください。
今回は、Pooledライセンスについてご紹介してきました。
お客様毎にネットワークの色んな事情があるかと思いますので「うちにはPooledライセンスが合いそうだ」と思われたらお声がけください。
弊社では、SiteライセンスとPooledライセンスのベストな組み合わせから、将来の拡張を考慮してどういうライセンスの買い方が良いのかについてもご提案させていただきますので、よろしくお願いいたします。
本記事は TechHarmony Advent Calendar 2025 12/15付の記事です。 |
こんにちは!
SCSK 品田です。
もうすぐクリスマスということで、アドベントカレンダーのイベントに参加させていただいております。
その他の記事については以下をご覧ください🎁
サンタさんは世界中にいると信じてやまないですが、サンタさんにもプロジェクトマネジメント(PM)は存在するのでしょうか…?
もしPMが存在するのであれば、納期ゼッタイ、納品物は冬くらいにならないとわからない、納品先は世界全体だったりするので、大変なのでしょうか…
では。
・AWSのインフラ構築にはなるべくIac(Infrastructure as Code)を導入する。
・アプリケーション側のソースコードもAIエディタが参照できる場所に配置する。
上記構成を取ることで、VSCode+Amazon Q/Kiro等のAIエディタによる開発が行いやすくなる。
・IaC利用ができるプロジェクトであること。
・VSCode+Amazon Q / Kiro等のAIエディタを利用できるプロジェクトであること。
・マークダウン化されている設計書を利用できるプロジェクトであること。
・インフラ側とアプリケーション側でチームが別れている場合、インフラ側とアプリケーション側で綿密にコミュニケーションが取れること。(または、デプロイ状態とソースの状態を確認しやすいこと)
したがって、2025年12月時点では、小規模アプリケーションかつ新規開発の場合が推奨となります。
project-root/ │ ├── documents/ # 設計資料 │ ├── 01_project/ │ │ ├── 01_overview/ # プロジェクト概要 │ │ │ ├── プロジェクト概要.md │ │ │ └── 用語集.md │ │ └── 02_requirements/ # 要件定義 │ │ ├── 機能要件.md │ │ ├── 非機能要件.md │ │ └── ユースケース.md │ │ │ ├── 02_architecture/ # アーキテクチャ │ │ ├── システムアーキテクチャ.md │ │ ├── 技術スタック.md │ │ └── セキュリティ設計.md │ │ │ ├── 03_design/ │ │ ├── 01_infra/ # インフラ設計 │ │ │ ├── インフラ構築図.drawio.svg │ │ │ └── インフラ設計方針.md │ │ │ │ │ └── 02_app/ # アプリ設計 │ │ ├── 機能設計書.md │ │ ├── API設計書.md │ │ └── データモデル.md │ │ │ ├── 04_operation/ # 運用 │ │ ├── デプロイ手順.md │ │ └── トラブルシューティング.md │ │ │ └── 99_misc/ # その他 │ ├── 議事録/ │ └── 参考資料/ │ ├── src/ # 実装ソース │ ├── frontend/ # アプリケーション(Next.js) │ │ ├── app/ │ │ ├── components/ │ │ ├── lib/ │ │ ├── types/ │ │ ├── middleware.ts │ │ ├── auth.ts │ │ ├── Dockerfile │ │ └── package.json │ │ │ ├── infrastructure/ # インフラコード(CDK) │ │ ├── bin/ │ │ ├── lib/ │ │ └── package.json │ │ │ └── utils/ # 共通ライブラリ、あれば │ ├── README.md # プロジェクトREADME └── package.json # ルートpackage.json(モノレポ管理)
レポジトリ構成案のポイント✏️
project-root/
│
├── documents/ # 設計資料 # 上と同じ
├── src/ # 実装ソース # 上と同じ
│
├── .kiro/ # Kiro設定
│ ├── settings/
│ └── specs/
│
└── package.json # ルートpackage.json(モノレポ管理)
Kiro利用の場合のレポジトリ構成案のポイント👻
本記事はモノレポ構成として例示していますが、実運用上はマルチレポ構成の方がよい場合があります。プロジェクトの規模やGitHub連携の特性を考慮して検討する必要があります。
モノレポとは?
本記事では、アプリケーションのフロントエンド、バックエンド、インフラソース(IaC)すべてを単一のgitプロジェクトで管理することをモノレポと呼ぶこととします。
| モノレポ構成 | マルチレポ構成 | |
| 【単一レポジトリの範囲】 | 設計書、アプリケーションソース、インフラソース(IaC)すべて | 設計書のみ / アプリケーションソースのみ / インフラソース(IaC)のみ |
| GitHub/GitLabの管理上のメリデメ | ・シンプルで管理しやすい。 ・アプリケーション/インフラソースのソース管理責任者を分けにくい。 |
・アプリケーション/インフラソースで、ソース管理責任者を分けやすい。 |
| CI/CD観点の自動デプロイ上のメリデメ | ・Gitコミットをデプロイのトリガーとしている場合、デフォルトではアプリケーション/インフラのトリガーが同一となってしまう。(ため、制御する必要がある。) | ・Gitコミットをデプロイのトリガーとしやすい。 |

・CORSエラー対処についてはアプリケーション側/インフラ側双方の把握が必要ですが、アプリケーション側/インフラ側双方の情報がレポジトリに集約されているため、解析と対処が容易となります。

小規模アプリケーションの実プロジェクトにて、このような構成を利用してみました。
Gitはモノレポ、フロントエンドはAmplify、インフラはCDKを利用しました。
Good
No Good
総じて快適なので、どんどん取り入れて行きたいです。
]]> 本記事は TechHarmony Advent Calendar 2025 12/14付の記事です。 |
こんにちは、Catoクラウド担当SEの中川です!
先日、Cato Networksから Advanced AI Assistant がリリースされました。このアップデートにより、AIが アカウント固有の情報に基づいて回答できる ようになったという、驚きの機能拡張です。
従来のCatoのAIアシスタントは、主に 仕様や設定手順の解説 を行うもので、Knowledge Baseを参照しながら一般的な質問に答える仕組みでした。しかし、今回のアップデートでは、自分のアカウントに紐づく情報(例:Siteの状態、ユーザの接続状況など)をもとに、より具体的な回答が可能になっています。
この機能により、運用担当者は 「今、自分の環境で何が起きているのか」 をAIに直接尋ねることができ、トラブルシューティングや日常運用の効率が大幅に向上します。
本記事では、この新機能の概要、利用方法、そして実際にどんな質問ができるのかを紹介していきます。
そもそもですが、Cato Networksが提供する Ask AI Assistant とは、CMAに搭載されているCatoクラウドの運用をサポートするためのAI機能です。
従来のAIアシスタントは、CatoのKnowledge Baseを参照しながら、仕様や手順に関する一般的な質問に回答してくれるものでした。
これまでのAIでもかなり便利で、特に設定手順を聞きながらその画面で設定ができることが魅力的でした。しかし、自分のアカウントに関する情報にはアクセスできなかったため、回答はあくまで一般論に留まっていました。
これまでのAIアシスタントについては、下記のブログでご紹介しておりますので、よろしければご参照ください。
【Catoクラウド】新機能「AIアシスタント」がリリース – TechHarmony
今回のアップデートでは、アカウント固有の情報にアクセスし回答できる ようになりました。
イベントログやXOpsで検知したStoryを直接AIが確認することは2025年12月現在では難しいようです。
どのようにイベントログを確認して、どのような設定・調査をすべきかといった指南をするレベルにとどまっていました。
利用方法はこれまでと変わらず、CMAの右上「Ask AI」をクリックするとHelpウィンドウが展開します。一番上にAI Assistantへのメッセージ入力欄がありますので、そこから問い合わせするだけです。
適用されていると、以下のコメントが表示されます。
Advanced AI Assistant capabilities (account-specific answers) are now available as a free trial.
運用担当者が拠点の接続が不安定であると現場から問い合わせを受けた際の対応を想定して、次の質問をAIに投げてみました。
AIは過去24時間のネットワークパフォーマンスデータを取得し、以下のような詳細な回答を返してくれました。
回答のポイント
このように、単なる数値の羅列ではなく、評価基準と結論まで提示してくれるのが大きな特徴です。従来の「管理画面を見て自分で判断する」作業が、AIによって大幅に効率化されます。
AIは調査観点・原因候補・推奨手順まで整理した包括的なレポートを返してくれました。
回答のポイント
このレベルの回答が即座に得られることで、運用担当者の調査時間を大幅に短縮できます。従来なら「イベントログ確認 → KB検索 → 切り分け」という流れを自分で組み立てる必要がありましたが、AIがそのプロセスをガイドしてくれるのは非常に強力です。
AIは、Zoomアプリケーションのパフォーマンスデータとネットワーク品質を組み合わせて、以下のような詳細な分析を返してくれました。
回答のポイント
従来なら、Zoomの品質問題を切り分けるためにネットワーク分析+アプリケーションログ+QoS設定確認を手動で行う必要がありましたが、AIがそのプロセスを一括でガイドしてくれます。
定期的にレポート出力を行う業務を想定して、次の依頼をしてみました。
回答のポイント
レポーティングはこれまではAPIを活用して、トラフィック情報を取得しデータ処理を行う必要がありましたが、AIの強化により、データの取得からその拠点の品質評価まで実施してくれるようになりました。
ただし、1か月間など長い期間を指定するとレポーティングは出来ませんでした。長期間の場合は現時点でのAIでは難しいようです。
今回紹介した Advanced AI Assistant はいかがでしたでしょうか。アカウントの情報が見られるようになったことで、AIによって調べられる範囲がかなり広がったことを感じられたのではないでしょうか。
また、現在この機能は 無料トライアルとして利用可能ですが、今後有償になることも予想されます。無料期間中に、ぜひCMA右上の 「Ask AI」 をクリックして実際に試してみてください!
参考リンク
本記事は TechHarmony Advent Calendar 2025 12/13付の記事です。 |
こんにちは。廣木です。
本記事はLink Health Rules活用法の後編です。
「Quality Health Rule(品質監視)」にフォーカスし、その概要と活用方法を解説します!
前回の「Connectivity Health Rule(接続性監視)」 はネットワークが正常に利用可能な状態にあるか監視するための機能でしたが、「Quality Health Rule(品質監視)」は快適に利用可能な状態にあるかを監視するための機能です。
Link Health Rulesの概要や「Connectivity Health Rule(接続性監視)」については前編をご参照ください。
Quality Health Rulesでは以下のような接続の品質閾値を設定し、評価期間にその設定した閾値を満たない場合に通知を行います。
この閾値は自由に設定することが可能です。
表1:Quality Health Rulesで設定可能な品質閾値一覧
| No | 品質閾値の種類 | 説明 |
| 1 | Packet Loss (%) | 送信パケットのうち、ロスした割合 (%) |
| 2 | Distance (msec) | 拠点から送信されたパケットがPoPに到達するまでにかかる遅延時間 (ミリ秒) |
| 3 | Jitter (msec) | 上記の遅延時間のパケット間の揺らぎ(ミリ秒) |
| 4 | Congestion | 輻輳が発生し、評価期間に破棄されたパケットが1%を超えた状態 |
なお、複数項目で閾値の設定をした場合は「OR」の関係が成り立ちます。つまり、いずれかの項目で閾値を満たない場合に通知が行われます。
次に、具体的な設定例を見ていきます。
※本記事でご紹介するのはあくまで一般的な設定例です。実際の設定は、各企業の環境に応じて設定いただきます。
今回はこんなシナリオを想定して設定を行っていきます。
2025年12月現在、Quality Health Rulesの設定項目は以下の通りです。
表3:Quality Health Rulesの設定項目
| No | 設定項目 | 設定内容 | |
| 1 | General | Name | 任意のルール名を入力 |
| Direction | トラフィック方向をAny/Upstream/Downstreamから選択 | ||
| 3 | Source | – | 監視対象をAny/Site/Group/System Group/User Groupから選択 |
| 4 | Network Interface | – | 監視対象のインターフェイスを選択 ・Socket接続の場合は、WAN1/WAN2/WAN3/Alternative WAN/Anyから選択 ・IPsec接続の場合は、Primary/Secondaryから選択 |
| 5 | Condition | Thresholds | 品質閾値の設定 |
| 6 | Limits | 通知の条件を設定 | |
| 7 | Tracking | Frequency | Immediate/Hourly/Daily/Weekly |
| 8 | Send notification to | Mailing List/SubscriptionGroup/Webhookから選択 | |
設定値はこちらです。
今回、Limitsはデフォルト設定としています。デフォルトで以下のように設定されます。
ここで、Limitsの設定を行う際に押さえておきたいポイントをご紹介します。
デフォルトでは以下の設定になるとお伝えしましたが、この場合「10分間の評価時間枠において、合計8分間(80%)リンク品質の問題が発生した場合」に通知されます。
ポイントは、8分間継続した場合に通知がされるのではなく、合計で8分間品質問題が発生していた場合に通知を行うという点です。
例えば、品質問題が最初の3分間発生し、その後2分間は正常な状態となり、再び5分間品質問題が発生した場合、10分間の評価時間枠のうち合計8分間(80%)品質問題が発生していると判断し、にルールに従って通知されます。
この評価時間枠は、極端に短い期間を設定すると通知が大量に発生する可能性があるので注意が必要です。
今回のシナリオにおける、通知タイミングをまとめるとこうなります。
通知タイミング
それでは、Link Health Ruleの際と同様に、通知が大量に発生してしまった場合はどうすればよいでしょうか?
Quality Health Ruleでも、通知条件をカスタマイズして環境やご要件に応じてチューニングを行うことができますのでご紹介します。
品質閾値が実環境に則していない場合は、先ほどご紹介した設定項目ConditionのThresholdの設定値を変更しましょう。
例えば、Packet Lossが常時10%を超えている場合は(そんな状態はほとんどないはずですが…)以下のように15%と設定することで通知の頻度を減らすことが可能です。
今回ご紹介した設定値はあくまで一例です。
設定値は実際の接続状況を確認しながら、適切な値を設定することを推奨します。
ここまで、設定方法についてご紹介してきました。続いて、設定後の運用イメージをご紹介します。
「Quality Health Rule」は、ネットワークが快適に利用できる状態を維持するための重要な機能です。
アラートが通知された場合は、原因を確認し、必要に応じて設定や環境の見直しを行うことが推奨されます。
そこで、よくあるアラートと対応例を2つご紹介します。
【例1】 Congestion(輻輳)のアラートが頻繁に通知される場合
(原因)この場合は、帯域が不足している可能性があります。
(対応)回線の増速を検討してみましょう。
【例2】Congestion は問題ないが、Packet Loss や Distance のアラートが頻繁に通知される場合
(原因)この場合は、インターネット回線に問題が発生している可能性があります。
(対応)回線事業者や ISP に状況を確認してみましょう。
今回は、Link Health Rulesの中でもQuality Health Rulesについてご紹介しました。
運用にお役立ていただければ幸いです!
こんにちは。SCSKの谷です。
AWSへのアクセスを社内からのみに制限する際などに用いられる方法の一つとして、IAMポリシーでの接続元IPアドレス制限があります。
では、社内でAWSへアクセスしたIAMユーザがそのままPCを社外へ持ち出し別IPになった場合、AWSの操作は引き続き行えるのか?それとも行えなくなるのか?
本記事では、上記疑問について検証・解説していこうと思います。
IAMユーザでAWSリソースの操作を行う際に、以下のようなIAMポリシーを付与することで、接続元のIPアドレスを制限することができます。
以下の例では”aws:SourceIp”に記載されている”192.0.2.0/24″と”203.0.113.0/24″のIPアドレスから接続した場合のみ、AWSの操作を行うことができます。
{
"Version":"2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.0.2.0/24",
"203.0.113.0/24"
]
}
}
}
}
※参考:AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する – AWS Identity and Access Management
IPアドレス制限されたIAMユーザは正規の指定されたIPからアクセスすることで、AWS上の操作を行うことができます。
しかし、もし接続元IPアドレスがAWSコンソール操作中に変わってしまった場合(例えば社内でコンソールへログインし操作を行っていたが、その後コンソールの画面はそのままに自宅に移動し引き続き操作を続けた場合)、その後の操作は制限されるのか、、?
それとも、ログインには成功しているのでログイン時の情報をもとに自宅でもそのまま操作ができてしまうのか、、?
上記疑問について、どちらの動作となるのか検証していこうと思います。
以下IAMポリシーを付与したIAMユーザを作成します。
(操作確認のためにS3の操作権限を付与しています。)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<社内IPアドレス>"
}
}
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
上記IAMユーザを用いて、以下のパターンでS3の操作ができるか試してみます。
まずはシンプルに社内からアクセスしてみます。
当然ながらAWSコンソールでS3の操作を行うことができました。
次に社外(IAMポリシーで指定していないIPアドレス)からアクセスしてみます。
この場合、AWSコンソールへのログイン自体はできますが、S3の操作を行うことはできませんでした。
→IAMポリシーの”Condition”句のIPアドレス制限がしっかりと機能していることを確認。
本題です。
社内でAWSコンソールへアクセスしS3の画面が見えている状態から、コンソール画面はそのままに社外へPCを持ち出し接続元IPが変わった状態でS3の操作ができるのかを試してみます。
結果としては、社外(指定外のIP)から操作を続けようとすると操作が拒否されるようになっていました!
■社内からアクセスしたときに見えるS3の画面
■上記画面のまま社外へ移動し、画面更新をした結果
AWSのIAMポリシーは、AWSコンソールでの操作やAPIコールなど、リクエストが発生するたびに評価されるようになっています。
そのため、一度サインインに成功したからといって、その後のすべての操作が許可されるわけではないようです。
今回の検証では以下のようなシナリオとなり、操作ができなくなっています。
<ポイント> IAMポリシーはリクエスト毎に評価される!
今回は社内アクセスのみ許可された(接続元IPアドレスが制限された)IAMユーザが、社内でAWSコンソールへアクセスした後にPCを社外へ持ち出して引き続き操作が可能なのかを検証しました。
結果として、社外へ持ち出した(=接続元IPアドレスが変わった)時点でAWSの操作はできなくなるようです。
→IAMポリシーはリクエスト毎に評価されるため。
検証結果から、社内でアクセスしたユーザが社外へPCを持ち出して自由に操作することはできず、IAMポリシーによる操作場所の制限が行えることがわかりました。
これで、もし悪意のあるユーザがいたとしても社外での操作を制限することができますね。
こんにちは。SCSKの松渕です。
先日、発表されたばかりのGoogle Antigravityをインストール&簡易WEBサイト構築してみましたが、
今回はもう少しアプリ開発をしてみた実体験をブログに書きます!
AWSのKiroと同様に、AIエージェント型統合開発環境(Agentic IDE)と呼ばれるものです。
Antigravityのポイントとしては、特に以下の点になるかと思っております。
・ AIによるブラウザ操作も可能
・ AIによる自律的な実装
・ アウトプット品質の高さ(これはGemini 3のポイントではありますが)
・ Google Cloud環境とのシームレスな連携
類似サービスとの比較は以下の通りです
| IDE/プラットフォーム | 開発元 | 主な設計思想と特徴 | 類似サービスとの差別化ポイント |
| Antigravity | エージェント・ファースト。AIが自律的にタスクを計画・実行・検証する。マルチエージェントによるタスクのオーケストレーション。 | 自律性のレベルとEnd-to-End(ブラウザ操作を含む)実行能力。開発の監督に特化。 | |
| Kiro | AWS | 仕様駆動開発(Spec-Driven Development)。要件→設計→タスク分解をAIと共同で体系的に進める。SpecモードとVibeモード。 | 開発プロセスの構造化。ドキュメント(仕様書)を起点とし、検証可能なコード品質を重視。エンタープライズ親和性が高い。 |
| Cursor | Cursor, Inc. | AIアシスタント型IDE。コードの生成、編集、質問応答を強力にサポートする。AIチャットが非常に軽快で対話的。 | AIはあくまでアシスタントであり、線形的なチャットベースの対話が中心。即応性と軽快さに優れる。 |
| VS Code | Microsoft | 広く普及した高機能なコードエディタ/IDE。AI機能は拡張機能(例: Copilot)として追加される。 | AI機能は拡張機能であり、IDEのコア機能ではない。 |
私は、ブログを書くとき画面キャプチャ画像をぺたぺた貼り付けることが多いです。
その際行う、以下2点の加工をするアプリを作ってみました。
Antigravityへの指示だしを行います。
私の前回のブログの通り、インストールおよび環境構築を実施いたします。
Antigravityを起動し、「Ctrl + E」でAgentモード起動します。
以下のようなプロンプトでアプリ開発を指示しました。
ちょっと長くなりますが全文載せます。
# 目的 ブログ用のキャプチャ画像編集プログラムを作成したいです。 やりたいことは2つです。 ①公開すべきではない情報を黒塗りする機能 ②画像の中で、選択するべき項目、クリックする項目、箇所を赤枠で囲う # 動作説明 ##メニュー画面で、①公開すべきではない情報を黒塗りする機能 と ②画像の中で、選択するべき項目、クリックする項目、箇所を赤枠で囲うのどちらを利用するか選択する画面を出してください。 ##①の処理 ①-1複数枚の画面キャプチャをインプットとして受け付ける。 pngもしくはjpegのみの前提でいいです。 1枚当たり最大500kbとしてください。 10枚程度想定としてください。 ①-2それらの画面をgeminiにてブログで公開するには公開すべきではない情報を黒塗りする個所を 画像上のどの部分かを提示してください。 GoogleCloudのプロジェクトIDやプロジェクト名、GithubのID等は公開したくありません。 また、写真の場合は人の顔部分を黒塗りにしてください。 そのほかは、一般的な判断で構いません。 ①-3インプット画像の1枚1枚をユーザが確認して、黒塗りの箇所をOKとするか、黒塗りから戻したり、追加したりなどユーザ側で修正します。 修正できるようなUIをお願いします。 画像上で、マウスで範囲をドラックすると黒塗り範囲指定できるような仕様をイメージしてます。 ①-4インプット全量の画像で①-3が完了したら、最後に一覧表示して最終確認画面に出します。 ##②の処理 ②-1 複数枚の画面キャプチャ と、 ブログ文章 をインプットとして受け付けます。 前提として、技術ブログにおける、システム検証の画面キャプチャをインプット画像となる想定です。 インプット画像の中で、注目すべき項目と、次の手順に進むためにクリックする項目/箇所を赤枠で囲ってください。 ブログ文章をインプットにしてください。 ②-2 赤枠で囲う想定の箇所が画像上のどの部分かを提示してください。 ②-3インプット画像の1枚1枚をユーザが確認して、赤枠で囲う箇所OKとするか、赤枠から外したり、追加したりなどユーザ側で修正します。 修正できるようなUIをお願いします。 画像上で、マウスで範囲をドラックすると赤枠範囲指定できるような仕様をイメージしてます。 ②-4インプット全量の画像で①-3が完了したら、最後に一覧表示して最終確認画面に出します。 # 環境前提 Pythonを想定してますが、環境について提案あれば言ってください。検討できます。 ## 開発環境:PC上 ローカル環境はPC上で、そちらの環境で動作するものをまず作成ください。 これは、簡易的な動作確認用です。 Google AI StudioのAPIキー [実際のプロンプトにはキー記載] ## 本番環境:Cloud Run上 他者も利用できるようにGoogleCloud環境上でも動作するようにします。 その際、公開アクセスにはしない下さい。 ## 環境差異 2点だけです。 ①GeminiのAPI呼び出しの方法が変わります。 PC上ではGoogle AI StudioのAPI使います。 Cloudrun上では、vertex aiのAPIを使ってgemini呼び出しをしてください。 ②入力/出力ファイルの保存先 PC上の場合、PCに保存。 Cloudrun上の場合、GoogleCloudStorageに保存。
プロンプトを実行すると、実装計画を出力します。
最初は英語で実装計画出してきたので、日本語で出してというと出してくれます。
実装環境は提案してといった通り、提案してくれてます。
実装計画に従って実装の依頼をします。
コンテナで実装するため、Dockerの拡張機能のインストールを依頼されたので、インストールします。
Cloud Runでの実装の前にローカルで動作確認を依頼されました。
すごいのは、プロンプトで指示していないのにこういった段階テストおよび実装の計画を立ててくれています。
言われるがままテストしてみます。すごい。画面イメージについて一切指示しなくてもここまで実装してくれてます。
おっと、画面キャプチャ選んで黒塗り箇所をAIで判断させる処理でエラー出ました。
エラーコードを見ると、もうEOLになっているGemini 1.5 flashを使おうとしてます。
Julesの時もありましたが、このGeminiバージョンミスはなかなか解消しないもんですね。。
修正依頼出して修正してもらいます。Gemini 3 preview版を使います。
このエラーだけでうまくいきました!!
古いGeminiのモデルを指定された時はヒヤッとしましたが、やはり大幅に進化はしてます!さすがGemini 3ですね。
以下の簡易テストもクリアしました!ほとんどやり直しなしでここまでとは・・・。すごいの一言。
若干黒塗りずれている気もしますが、、そういう時は手動で直す方針とします。
(名前はそもそも公開しているから黒塗りしなくてもいいですし。)
ローカルでの動作確認は完了したのでCloud Runでの実装を依頼します。
細かい依頼出します。数分でデプロイしてくれました。
リージョン指定していなかったら、us-central1での実装になってます。
前回は自動でasia-northeast1になってたので気にしてませんでした。
動作確認していきます。今度はエラー等出ずに動作しました!
赤枠付与のほうも同じように確認しました。
→
AIによる黒塗り、赤枠付けは正直期待通りとは言えませんでした。
が、そこの指示プロンプトも適当ですし、手動で直す機能はイメージ通りで、画像編集効率化の目的は達成されてます。
いったん深掘りしないでOKとしてます。
今回のブログでは、GoogleのAIエージェント型IDE「Antigravity」と Gemini 3 を使い、複雑な要件を持つ画像編集アプリを開発し、Cloud Runへデプロイする過程をご紹介しました。
AntigravityのようなAIエージェント型IDEは、開発の初期段階からデバッグ、インフラ設定、そしてリソース増強といった広範な領域を自律的に担当してくれます。これにより、私のようなインフラエンジニアでも、コードの実装からデプロイまでを非常に高い品質で完結できる時代になりました。
一方で、これはエンジニアの責任が「コードを書くこと」から「AIの出力を監督し、評価すること」へシフトしたことを意味します。
エージェントの自律的なリソース増強(メモリやCPUの変更)がクラウドコストに与える影響。
エージェントが選択したリージョンやサービスアカウントが組織のルールに適合しているか。
これらのセキュリティやコスト、アーキテクチャといった本質的な観点から、AIの行動を監査し、軌道修正できる能力こそが、これからのエンジニアに最も求められるスキルでしょう。
ぜひ一度 Antigravity を試してみて、この新しい開発の波に乗ってみてはいかがでしょうか。
]]> 本記事は TechHarmony Advent Calendar 2025 12/12付の記事です。 |
こんにちは。SCSK 中山です。
今回はX1600 LTEモデル を実際に触る機会がありましたので、その詳細なレビューをお届けしようかと思います。
検討にあたりスペックシート上で見たことはあっても、実物や管理画面を直接見たことがある人はまだ少ないかと思います。本記事が、導入を検討されている方々の参考になれば幸いです。
尚、このX1600 LTEモデルは4G/LTEに対応したモデルのため、残念ながら5Gには対応しておりません。
まずは筐体の外観から見ていきましょう。 X1600は、おなじみのX1500と比較すると一回り大きいサイズ感です。
写真の通り、背面のLTE用のアンテナ接続端子が追加されているのが大きな特徴です。設置の際は、このアンテナ部分のスペースも考慮する必要があるかもです。


▼X1500(上)とX1600(下)の比較

次に、X1600 LTEモデルの主要なスペックを確認します。 詳細なスペックシートは公式サイトにまとまっています。
Cato Socket Deployment Guides and Data Sheets
特に注目すべきポイントは以下の通りです。
Siteの作成からCato Cloudへの接続までの基本的な流れは、X1500と全く同じ手順で進めることができます。Cato製品に慣れている方であれば、迷うことはないでしょう。
ただし、いくつか注意すべき差異点があります。
今回は、通常のインターネット回線(有線)とLTE回線の2系統を接続し、冗長構成のテストを行いました。
LTE回線を利用するためには、Socketに対してAPN(アクセスポイント名)などの情報を設定する必要があります。
この設定はSocketのWeb UIから行います。PCをMGMTポートに接続して直接アクセスするか、すでに有線回線でCato Cloudに接続済みの場合は、CMA経由でリモートアクセスすることも可能です。
▼設定手順
(APN情報や認証情報は契約キャリアによって異なります。不明な場合はキャリア側へお問い合わせください。)
正しく設定が完了すると、SocketはLTE網を認識し、Cato Cloudへの接続経路として利用可能になります。
LTE回線の設定が完了すると、デフォルトでは「Last-resort」というモードで動作します。
これは「最後の手段」という意味で、メインの有線回線が両方とも切断された場合にのみ通信を行う、純粋なバックアップ回線としての設定です。この状態では、通常時のLTEデータ通信量はほぼ発生せず、コストを抑えることができます。
Catoでは、回線の優先度を以下のように柔軟に設定できます。
この優先度設定(Active > Passive > Last-resort)をうまく活用することで、コストと可用性のバランスを取ったネットワーク設計が可能になります。
せっかく実機があるので、皆さんが特に気になるであろうポイントを実際に検証してみました! (私の手違いで検証結果のスクリーンショットが消えてしまったので、今回は文字だけのレポートとなる点、ご容赦ください…!)
LTE回線をバックアップとして利用する上で最も重要なのが、メイン回線障害時の切り替え(フェイルオーバー)のスムーズさです。この時、Cato経由でアクセスしているユーザーの通信はどの程度影響を受けるのでしょうか。
▼検証方法 X1600に有線接続したPCからインターネット上のサーバーへPingを打ち続けた状態で、X1600のWAN側ケーブルを物理的に引き抜きます。この瞬間のPingの応答ロスを確認しました。
▼検証結果 結果としては、Pingがタイムアウトしたのはケーブルを抜いた直後の1回のみで、すぐにLTE回線経由での通信に切り替わり、Pingは正常に応答し続けました! 正直なところ、もう少し通信が不安定になるかと想像していたので、このシームレスさにはちょっと感動しました(笑)。 Pingでのロスが1回ということは、通常のWeb会議や業務アプリケーションなどの通信であれば、ユーザーは切り替わりに気づくことなく業務を継続できるレベルと言えるのではないでしょうか。
「モバイル回線は、やっぱり有線より遅いのでは?」というイメージをお持ちの方も多いかと思います。そこで、LTE接続時の通信速度についても簡易的なテストを行いました。
▼検証方法 有線接続時とLTE回線のみでの接続時、それぞれでSocket配下のPCからスピードテストサイトを利用し、通信速度を計測しました。
▼検証結果 結果は、有線・LTE回線ともに約25Mbpsとなり、明確な速度差は確認できませんでした。 これは、今回利用した環境のSiteライセンス上限が25Mbpsに設定されていたため、どちらの回線もその上限値に達してしまった、というのが実情です。 そのため、この結果自体はあまり意味のある比較ではありませんが、「少なくともライセンスで許可された帯域は、LTE回線でも十分に使い切れる」という一つの参考値として捉えていただければと思います。実際の速度はご利用になるSIMキャリアや電波状況に依存します。
今回検証を進める中で、チーム内である疑問が話題になりました。それは「X1600のスループットは公称値以上に向上させられるのか?」という点です。
前述の通り、X1600のポート5~8は物理的に2.5Gbpsに対応しています。そして、これらのポートはCMAからWANポートとして設定変更が可能です。 一方で、Catoの公式ナレッジでは、X1600の最大スループットは1Gbpsと記載されています。
では、2.5Gbps対応ポートをWANとして利用すれば、この1Gbpsの壁を越えられるのではないか?という仮説です。
結果としては…
Socket側のスループットの上限があるため、ポート側が2.5Gbps対応でも1Gbpsを超えることはできないとのことでした。。
とはいえ、2.5GbpsポートをLAN側で利用すれば、拠点内の高速なデータ転送には大いに貢献します。
ここまでの仕様や検証結果を踏まえ、X1600 LTEモデルが特に有効なユースケースを考えてみました。
最も代表的なケースです。 通常、回線の冗長性を確保するには、主回線とは別のキャリアで物理回線をもう1本契約し、開通工事を行う必要があります。これには時間も手間もコストもかかります。
しかし、X1600 LTEモデルであれば、SIMカードを1枚契約するだけで、すぐにバックアップ回線を用意できます。これにより、工事日程の調整といった煩わしさから解放され、迅速に事業継続性を高めることが可能です。SIMのプランによっては、月々の通信コストも抑えられます。
次に思いつくのが、物理的な回線工事が困難な場所での利用です。
このような環境では、電源さえ確保できれば、X1600 LTEモデルを使って即座にセキュアな企業ネットワークを構築できます。LTE回線を主回線として利用することで、ビジネスの機動力を大幅に向上させることができるでしょう。
今回は、Cato Networks X1600 LTEモデルを実機でレビューしました。 設定方法は従来のX1500とほとんど変わらず、直感的に扱うことができます。LTEモジュールが内蔵されたことで、これまで以上に「手軽」で「迅速」な回線冗長化と拠点展開が可能になった点が最大のメリットだと感じました。
このような課題をお持ちの企業にとって、X1600 LTEモデルは非常に強力な選択肢となるはずです。
#5G対応モデルも出て欲しいー
]]>
本記事は TechHarmony Advent Calendar 2025 12/11付の記事です。 |
Cato クラウドでは、提供されるネットワークやセキュリティ機能の様々なログが “イベント” という形でクラウド側で保管され、Web 画面を通じてログを検索・絞り込みしつつ参照できるようになっています。この機能はシステム運用やセキュリティ運用において非常に活躍してくれるものですので、弊社のお客様にはログをできるだけ全て出力することを推奨しています。
一方で、Cato においてはログ出力できるイベントの量には、1時間あたり250万件までという上限があります。
ログを全て出力しておくようにしていると、その上限に達してしまい、本来必要なログが出力されないといった問題を引き起こすことがあります。実際、弊社の複数のお客様環境でもこの上限を超えてログが出力されなくなる事態が発生し、“Cato events Quota Exceeded” と書かれた Cato からの通知メールを受信して初めて気付くということもありました。
こういった事態の発生を解消・予防するには、不要なログの出力を抑制するという運用も必要となってきます。
そこで本記事では、ログ出力に関する考え方や、実際に抑制する方法について解説します。
Cato クラウドの利用に限ったことではありませんが、システムにおけるログ出力・ログ管理の目的は、一般的に次の3種類に大別できると考えています。
Cato クラウドの利用においては、主に2のシステム管理の目的でログを出力し、実際に利用されているものと思います。また、お客様によっては事業上の要件やセキュリティポリシーにより、1の監査証跡の目的でもログを保管されているのではないでしょうか。
監査証跡が目的のログは法律や規則の求めにより必要となるものですので、出力すべきログは明確に決まっているはずです。
一方、システム管理が目的のログは何を出力すべきか明確というわけではありません。特にトラブルシューティングを行う状況において、ログは多ければ多いほど解決に役立ちますので、Cato を利用開始するお客様には出力できるログは全部出力しておくというシンプルな戦略を推奨しています。
しかし、冒頭に記載した通り Cato ではログ出力できる量に上限があります。Cato を導入して大規模に利用する段階になると、ログ出力が上限に達してしまい、必要なログが出力されない問題が生じる可能性があります。
Cato では追加ライセンスを契約すればログ出力の上限を増やせますが、その分の費用が必要となってきますので、上限に達してから機動的にライセンスを追加契約するという選択肢は採りにくいです。また、外部の SOC サービス等を利用している場合も、通常はログ量が増えると費用も増えていきます。
そのため、Cato を導入して支障なく利用できる状況になってきたら、次は目的に照らし合わせてログ出力を抑制していく運用も重要となってきます。
さて、ログ出力の抑制とは具体的にどのように進めていけばいいのでしょうか。
不正発生時やトラブルシューティング時にもログを利用することから、必要なログを予め特定してそれだけを出力することはできません。そのため、明確に不要なログを出力しないようにする方針で進めていくことになります。
具体的には、次のようなログのうち、大量に出力されているログの出力を抑制していくのが良いと考えます。
1についですが、例えば Microsoft 365 や Google Workspaces を全社的に導入しているお客様の場合、それらサービスへのWebアクセスが Monitor として多数記録されているのではないでしょうか。全ての社員が当然利用するサービスのログは、その内容を解析して何かアクションを行うこともないでしょうから、出力を抑制してもおそらく問題ないでしょう。
また他にも、Cato では標準のルールとして QUIC (HTTP/3) がブロックされるようになっていますが、それも出力を抑制しても問題ないと思います。インターネットアクセスで HTTP/3 がブロックされたとしても、通常は HTTP/2 や HTTP/1.1 にフォールバックされ、Cato では別のイベントとしてログ出力されますので、監査でもトラブルシューティング等でも特に問題はないはずです。
2についてですが、弊社のお客様の例ではありますが、Windows Update の配信最適化機能により多数の Windows マシン間で通信が行われ、膨大なログが出力されているケースがありました。この機能を有効にするか無効にすべきかという議論はさておき、このログは解析することもないため抑制して良いでしょう。他にも、多数の機器への監視 (SNMP や Zabbix など) の通信もログが多くなりがちで、これも通信内容が明確ですので抑制して良いと思います。
ログ出力の抑制に先立って、CMA の Events 画面にてログ量が多い通信を見つけましょう。
様々なフィルタを駆使して少しずつ絞り込んで見つけていくわけですが、最初は Events 画面の左側にある “Sub-Type” を展開してみてください。
おそらく Internet Firewall や WAN Firewall のログが非常に多く出力されているのではないでしょうか。展開して表示された箇所にマウスポインタを当てると “⊕” や “-” のアイコンが表示されますので、”⊕” のアイコンをクリックして選択したログだけが表示されるようにフィルタを適用しましょう。
次は同様に “Destination Port” を展開してみてください。上部の入力欄に “port” と入力すると見つけやすいです。
Internet Firewall でフィルタした場合、どのお客様も443番ポート (HTTPS) 宛の通信が最も多いのではないでしょうか。その後に80番ポート (HTTP) や53番ポート (DNS) 宛の通信が並ぶだろうと思います。
ここでさらに443番ポート宛の通信だけが表示されるようフィルタを適用した後、”Domain Name” を展開してみてください。
Microsoft 365 をお使いの会社ですと “microsoft.com” や “office.com” などを含むドメイン名が上位に並んでいるかと思います。他にも、OS が標準的に行う通信 (Windows Update や iOS 関連) や、全社的に導入しているシステムのドメイン名も上位に来るのではないでしょうか。上位に表示される中で、信頼できるドメイン名のものがログ出力を抑制する候補となります。
WAN Firewall でフィルタした場合は、”Destination Port” の上位に来るものの傾向は Internet Firewall の場合と異なるはずで、次のような宛先ポートが並ぶのではないでしょうか。
そして、ポート番号ごとに “Destination IP” や “Source IP” も見て通信の多い宛先・送信元IPアドレスも把握し、ログ出力を抑制する候補を見つけましょう。システム的に行われる通信のログは抑制してしまって良いと考えており、上記ですと宛先・送信元IPアドレスも考慮した上で7680, 161, 162, 10050, 10051, 389番ポートの通信は抑制しても良さそうです。
ログ出力を抑制する通信を決めたら、実際に Internet Firewall や WAN Firewall のルールを追加または変更し、ログが出力されないようにしましょう。
先ほどまで見ていた Events 画面の右側には個別のイベントログの内容も表示されており、その中の “Rule” というフィールドにはそのイベントがマッチした Internetl Firewall や WAN Firewall のルール名が表示されています。該当のルールを変更してログ出力されないようにするか、そのルールよりも上位にログ出力をしないルールを追加しましょう。
例えば Microsoft 365 をお使いのお客様がその通信のログ出力を抑制するなら、Internet Firewall では次のような設定内容になるかと思います。
App/Category で “microsoft.com” や “office.com” ドメインを対象と、Track では何もチェックを入れず “N/A” となるようにしています。ルールを追加する際、Action を “Allow” に変更しない通信できなくなってしまいますので、ご注意ください。
また、例えば Windows Update の配信最適化機能と SNMP 監視の通信のログ出力を抑制するなら、WAN Firewall では次のような設定内容になるかと思います。
Windows Update の配信最適化機能は任意のPC同士で TCP 7680 番ポートを宛先とした通信を行います、上の画像では Source や Destination を指定せず、Service/Port では Custom Service として “TCP/7680” を指定し、ログ抑制対象の通信を限定しています。Action を “Allow” にするか “Block” にするかは、お客様の環境によって異なります。
また、SNMP は、特定 SNMP マネージャから多数の SNMP エージェントの UDP 161 番ポート宛に行うポーリングや、逆に SNMP エージェントから SNMP マネージャの UDP 162 番ポート宛に行うトラップの2種類の通信がありますので、それぞれをルールに設定しています。SNMP マネージャは少数でIPアドレスは明確でしょうから、上の画像では仮に “10.1.1.1” とし、その SNMP マネージャが発着信する通信に限定しています。
本記事では Cato クラウドの利用時におけるログ出力量の上限到達という問題への対応方法として、ログ自体の目的を踏まえたログ出力を抑制する方法を解説しました。こういった運用に関する知見は Cato 公式ドキュメントには記載されておりませんので、本記事を参考にしていただけると幸いです。
また、ログ出力の抑制は、単にログ量を削減して追加ライセンスを購入しなくて済むようにするというだけのものではありません。不要なログが多いと CMA の画面上でのログの参照に時間がかかったり、トラブルシューティング時に余計な手間がかかったりもします。
Cato クラウドを安定的に利用するにはログの存在は不可欠ですので、ログを扱いやすくして効率的な運用を行えるようにするためにも、ログ出力ルールを継続的に見直していきましょう!
]]>こんにちは。SCSKの井上です。
New Relicを導入する際には、いくつかの鍵を正しく設定する必要があります。この記事では、ライセンスキーとユーザーキーの概要、用途、発行手順、そしてセキュリティを確保するための管理方法を解説します。鍵の種類や管理方法を理解するための参考になれば幸いです。
New Relicへデータを送る際に使用する鍵(ライセンスキー/ブラウザキー)と、データを操作する際に使用する鍵(ユーザーキー)があります。これらの鍵は、外部システムとの連携や内部操作を安全に行うために不可欠な要素です。特に、APIキーは発行したユーザーの権限を継承するため、誰が発行するかによって操作可能な範囲が大きく変わります。どんな鍵があり、どの点に注意すべきかを解説していきます。
この記事はNew Relicを全く触ったことがないかたを対象としています。New Relicの無料プラン※を利用して操作を行いますので、New Relicを費用無しで実施いただくことができます。
※無料プランに含まれる内容は、月間100GBまでのデータ容量と全機能にアクセスできるユーザー1名です(Basicユーザについては無償)。無料プランの場合、一部機能に制約がある可能性はあります。
アプリやサーバーからNew Relicにデータを送るためには、License Keyが必要です。New Relicのコンソールで見るだけならUser Keyは不要ですが、NerdGraph APIを使ってアラート設定やダッシュボードをスクリプトで自動化やAWSやAzureなどの外部連携する場合は、必要になります。
| キータイプ | 意味 | 主な用途 | 発行対象 |
| Ingest – License Key | New Relicにデータを送る「入口の鍵」。
データ送信用のAPIライセンスキー。APM、Infrastructure、ログなどのデータをNew Relicに送るために使用。 |
エージェント設定ファイル、環境変数、サードパーティー製品との連携など | アカウント
(組織単位) |
| Ingest – Browser Key | New Relicにデータを送る「入口の鍵」。
ブラウザ監視用のAPIライセンスキー。Webページに埋め込まれたNew RelicのJavaScriptエージェントがデータを送るために使用。 |
Browser monitoring
Webページに埋め込むJavaScriptエージェント用 |
アカウント
(組織単位) |
| User Key | 送られたデータを分析や設定を操作する「操作の鍵」。
API操作用の個人キー。ユーザーがNew Relicの設定やデータにアクセス・操作するために使用。NRAK-から始まる規則となっている。 |
NerdGraph API、Terraform設定など | 個人
(ユーザー単位) |
New Relicに初めてサインアップすると、デフォルトのLicense KeyとBrowser Keyが自動で作成されます。この鍵はアカウントに紐づいており、削除や変更はできません。セキュリティ上の理由から、独自に新しい鍵を発行して使用することが推奨されています。デフォルトの鍵は、初期設定時に誰でも知り得る可能性や、デフォルトのライセンスキーは削除することができないため、外部に漏れた際にサポートに問い合わせて新たな鍵を発行いただく間に、脅威は進行してしまいます。Full platform user権限を持つユーザであれば、いくつでもLicense keyおよびBrowser keyを作成することができ、削除も可能ですので、デフォルトの鍵は使わないようにした方が良いですね。
エージェントがデータを送る対象が「サーバーやバックエンド」からのデータであればLicense Key、「フロントエンド」からのデータであればBrowser Keyになります。Browser KeyはWebブラウザに埋め込むため、不特定多数に閲覧されます。もし、License KeyとBrowser Keyを分けずに使用した場合、予期せぬデータをNew Relicへ大量に送信し、課金されてしまう恐れがあります。そのため、リスクを抑えるためにも二つに分かれている設計になっているのですね。
モバイルアプリトークン用の鍵もありますが、モバイルエージェント導入時に説明することとして、この記事では割愛します。
ここでは実際にNew Relicのライセンスキーの発行手順について解説していきます。Full platform user権限を持つユーザーがライセンスキーを何度でも作成することができます。ライセンスキーの発行にお金もかかりません。ライセンスキーがたくさん作成されてしまうと管理が大変になりますので、組織に一つ、環境ごとに一つ、チームで一つなどセキュリティのリスクに応じて使い分けることを推奨します。
ライセンスキーはアカウント単位で管理されるため、誰が作成したかはNew Relicのコンソールから確認できません。命名規則を設けるか、備考欄にどのような用途の鍵なのかを記載しておくことで鍵の管理がしやすくなります。以下の手順にて作成ができます。
ここでは実際にNew Relicのユーザーキーの発行手順について解説していきます。ユーザーキーも何度でも発行は可能です。お金もかかりません。ライセンスキーと異なり、ユーザーキーについては自身以外に開示しないでください。ユーザーキーの発行はUser API Keys (for self)のロール権限が付与されていれば、Full platform user権限がなくても作成することができます(Standard rolesにおいて、Billing Userロール以外は付与されています)。
ユーザーキーは、発行したユーザーに割り当てられたロールの権限に基づいて動作します。たとえば、管理者ロールを持つユーザーが発行した場合、そのキーには管理者権限が付与されます。一方、Read-onlyロールのみを持つユーザーが発行した場合、そのキーは読み取り専用の権限しか持ちません。必要に応じて外部連携との設定する際は、ロール権限を最小限に抑えた専用のユーザーを推奨します。
ユーザーキーはユーザー単位で管理されるため、誰が作成したかNew Relicのコンソールから確認できます。以下の手順にて作成ができます。
発行した鍵はNew Relicにログインすることで見れてしまうのか気になりますね。以前まではNew Relicコンソールにログインすることで見ることができていましたが、セキュリティ向上のため見ることができなくなりました。発行済のライセンスキーはライセンスキーのIDとユーザーキーの2つをもって確認することができます。ユーザーキーもわからない場合は、ユーザーキーを新規発行いただいてから、この手順を実施することができます。他のユーザーが発行したライセンスキーも見ることができます。
※クエリ文
query {
actor {
apiAccess {
key(id: "INGEST_KEY_ID", keyType: INGEST) {
key
name
type
... on ApiAccessIngestKey {
ingestType
}
}
}
}
}
各種鍵について、定期的なローテーションや設定鍵の棚卸、誤って設定キーが外部に流出しないよう、環境変数で管理することを推奨します。これにより、セキュリティリスクを抑えられます。Ingest License Key をローテーションする場合、古い鍵を使っているエージェントやアプリケーションが新しい鍵に更新されるまで、データ送信が停止する可能性があります。そのため、ローテーションする際は、すべてのデータが転送できていることをコンソール上から確認した上で、古い鍵を消す考慮が必要です。
鍵を作成したユーザーを削除した場合、鍵はどうなるのでしょうか。ユーザーキーはユーザーに紐づいていますが、ユーザーを削除してもそのユーザーが作成した鍵は残っています。ユーザーキーを完全に削除するには、API Keys画面より削除が必要です。ライセンスキーは アカウントに紐づいています。ユーザーキー同様にユーザーが削除されても そのユーザーが作成したライセンスキーは引き続き有効です。誤って設定鍵が外部に流出しないためにも、環境変数で管理することでリスクを抑えることも重要です。
モバイルアプリトークンについては、トークンを削除したり、追加のトークンを作成したりすることはできない旨、記載されています。トークンが流出した場合の対処については、公式の情報がないため、New Relic サポートに連絡することが必要です。
New Relicへデータを送る際に使用する「鍵」と、データを操作する際に使用する「鍵」について解説しました。特に、APIキーは発行したユーザーの権限を継承するため、誰が発行するかによって操作可能な範囲が変わることについて、この記事を読んで、New Relicの設定鍵の運用に少しでもお役に立てれば幸いです。
SCSKはNew Relicのライセンス販売だけではなく、導入から導入後のサポートまで伴走的に導入支援を実施しています。くわしくは以下をご参照のほどよろしくお願いいたします。
]]> 本記事は TechHarmony Advent Calendar 2025 12/10付の記事です。 |
こんにちは! Catoクラウド担当、佐藤です。
以前、AWSのvSocket構築手順を解説したブログを作成しました。
本記事では、vSocketを冗長化したHA構成の構築手順について解説いたします。
HA(High Availability)構成とは、システム障害時でもサービスを継続するための構成のことです。複数の機器や経路を組み合わせて冗長化し、単一の機器が停止してもシステム全体しないようにします。
特にネットワークの停止は日常業務に大きな影響を与えるため、冗長化によってトラブル時でもシステムを維持できる構成が必要です。
CatoクラウドのAWS vSocketにおいても、2台以上のvSocketを配置することで冗長化を実現します。
プライマリ側に障害が発生した場合でも、自動的にセカンダリに切り替わることで、組織の内部環境とCatoクラウドの接続を維持することができます。以下はイメージとなります。
AWS vSocketでHA構成を構築するには、プライマリとセカンダリのvSocketをデプロイする必要があります。
1台のvSocketのデプロイには2つのElastic IP(MGMT用、WAN用)が必要になります。
さらに、別々のAZ(Availability Zone)にて2台のvSocketをデプロイしてHA構成を組む場合、合計で4つのElastic IPを使用します。
デフォルトでは、AWSアカウントでリージョン当たり5つのElastic IPが割り当てられております。現在の割り当て状況をご確認の上、空きがない場合はご用意をお願いいたします。
AWSマネジメントコンソールで、「EC2」>「Elastic IP」より上限の確認が可能です。
HA構成のための設定手順を説明していきます。
以下のステップで設定を進めます。
HA構成を構築したいSiteに対してCMA上でセカンダリvSocketを追加する設定を行います。
1.CMAのメニューから、「Network」>対象のSiteをクリック
2.「Site Configuration」>「Socket」>「Add Secondary Socket」をクリック
3.Secondary Socketの設定項目は3つあります。以下の設定項目を入力し、「Apply」を実行します。
4. サイトの設定が完了すると以下の画面になるので、セカンダリvSocketのシリアル番号をメモなどに控えておいてください。
※シリアル番号はAWSでのインスタンス起動時の設定で使用します。
次に、AWS側での設定を行います。
AWSマネジメントコンソールにおける具体的な操作手順については、上で紹介した関連ブログに詳しくまとめていますので、必要に応じてご参照ください。
セカンダリvSocketのデプロイ手順を説明します。
必要な設定事項は以下になります。
MGMT ENIとWAN ENIに割り当てるためのElastic IPを取得します。
AWSマネジメントコンソール 「VPC」>「Elastic IP」>「Elastic IPアドレスを割り振る」より設定が可能です。
通常のAWS vSocket構築と同様の手順で、MGMT用、WAN用のEIPをご用意ください。
こちらも通常のAWS vSocket構築と同様の手順で、以下3つのサブネットを作成してください。
AZはプライマリと別のものを選択してください。
※プライマリとセカンダリが同じAZの場合MGMT用、WAN用のサブネットは不要です。
AWSマネジメントコンソール 「VPC」>「サブネット」>「サブネットを作成」より設定が可能です。
ルートテーブルの追加作成は必要ありません。
プライマリvSocketで作ったものにセカンダリのサブネットを割り当てます。
内容は以下の通りです。
※MGMTとWANのルートテーブルは分けて2つになっていても問題ありません。それぞれ対応するサブネットの関連付けを行ってください。
以下の操作で設定が可能です。
AWSマネジメントコンソール 「VPC」>「ルートテーブル」>対象のルートテーブルを選択
「サブネットの関連付け」タブ > 明示的なサブネットの関連付けの「サブネットの関連付けを編集」をクリック
セカンダリvSocketで用いるENIを作成します。
プライマリ同様以下3点のENIを作成してください。
セキュリティグループは特に指定がなければ、プライマリvSocketで作成したもので問題ありません。
※ENI作成手順はすべて通常のvSocketと同じです。詳細はvSocket構築手順のブログをご参照ください。
最後に、セカンダリvSocket用のEC2インスタンスの起動を行います。
こちらもプライマリvSocketでの設定とすべて同じになります。
最後の「高度な詳細」ではセカンダリvSocketのシリアル番号を「ユーザーデータ」に貼り付けてください。
設定をすべて終えたら、右下の「インスタンスを起動」をクリックします。
Cato vSocketのHA構成ではプライマリvSocketにトラブルが生じた際、自動でvSocketがルートテーブルを変更し、セカンダリvSocketへの切り替えを行います。そのために必要な権限をIAMロールで作成し、インスタンスにアタッチします。
まず、IAMロール用のポリシーを作成していきます。
IAMポリシーに書き込む権限は以下の3つです。
1. AWSマネジメントコンソールから「IAM」>「アクセス管理」>「ポリシー」>「ポリシーの作成」をクリックします。
2. 「アクセス許可を指定」で「JSON」を選択し、以下のポリシーを「ポリシーエディタ」に張り付け、「次へ」をクリックします。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"ec2:CreateRoute",
"ec2:DescribeRouteTables",
"ec2:ReplaceRoute"
],
"Resource": "*"
}
}
3. 任意のポリシー名を入力し、「ポリシーの作成」をクリックします。
次に、作成したポリシーを用いてロールの作成を行います。
4. AWSマネジメントコンソールから「IAM」>「アクセス管理」>「ロール」>「ロールの作成」をクリックします。
5. 信頼されたエンティティタイプを「AWSのサービス」、ユースケースを「EC2」と選択し「次へ」をクリックします。
6. 「許可ポリシー」の項目で先程作成したポリシーを検索し、選択した後、「次へ」をクリックします。
7. 任意のロール名を入力し、「ロールを作成」をクリックします。
続いて作成したIAMロールを、プライマリ、セカンダリの両方のvSocketにアタッチします。
アタッチ方法について説明します。
1. AWSマネジメントコンソールから「EC2」>「インスタンス」>vSocketのインスタンスを選択します。
2. 「アクション」>「セキュリティ」>「IAMロールを変更」をクリックします。
3. 作成したIAMロールを選び、「IAMロールの更新」をクリックします。
最後に接続確認を行います。
1. AWSマネジメントコンソールから「EC2」>「インスタンス」>プライマリとセカンダリvSocketのインスタンスを選択します。
2. 「インスタンスの状態」>「インスタンスを開始」をクリックし、各インスタンスを起動してください。
※すでに起動してある場合はスキップしてください。
1~2分ほど待ち、CMA上で状態を確認します。
3. CMA上で「Network」>「Site Configuration」>「Socket」と進みます。
4. 以下のように各Socketが「Connected」、中央のHA Statusが「Ready」となっていることを確認してください。
まずは、これまでの手順の中で、以下の項目が正しく設定されているかご確認ください。
本記事では、AWS vSocketのHA構成について解説を行いました。
実際に構築を行ってみて、接続が正常にできない場合に「どこまで正しく動いているのか」を意識しながら確認項目を絞ることで、原因が特定しやすくなると感じました。
今回は主に構築手順の解説となりましたが、HA環境での実際の挙動などについて検証してブログにまとめられたらと考えています。
最後までお読みいただき、ありがとうございました!
こんにちは。SCSKの星です。
今回はServiceNowのバージョンアップ期限に間に合わない場合の対応方法について書いていきます。
バージョンアップには期限があります。基本的には期限内に終わらせることが好ましいです。
※期限内のスケジュール変更や期限の確認方法についてはこちらをご覧ください。
→【ServiceNow】バージョンアップのスケジュール変更方法 – TechHarmony
ただどうしても期限に間に合わない場合もあると思います。その場合はServiceNowにお願いして延長してもらうことも可能です。
ただ、毎回この方法が有効なのかもわかりませんし、場合によっては拒否されてしまうこともあるようです。
そもそもServiceNowの担当者にご迷惑をおかけするのも、あまり望ましくありません。ですので、
「この方法でServiceNow社に延長お願いすればいいや」と思うのではなく、業務上の都合や対応日程など、どうしてもバージョンアップが間に合わなかった場合の手段
としてご認識ください。
延長をするには、NowSupportで延長申請フォームのリンクをもらう必要があります。
そのためまずはNowSupportにログインします。
https://support.servicenow.com/now
※誰でも作成可能なServiceNowIDではなく、NowSupport専用のアカウントが必要です。わからない場合はライセンス管理者にお問い合わせいただくとよいかと思います。
ログイン後、上部にあるタブから インスタンス > インスタンスダッシュボード を開きます。
インスタンスダッシュボードからバージョンアップを延長したいインスタンスを選択します。
予定されている変更一覧から、メジャーバージョンアップに関するものの変更番号をクリックすることで開きます。
「Family EOL Upgrade…」と書いてあるのが該当します。

開いた変更スケジュールページのアクティビティタブにバージョンアップが間に合わない旨のメッセージを送ります。
こちらにメッセージを送ることでServiceNow担当者が内容を確認し、延長申請フォームのリンクを送ってくれます。
下の図はVancouverバージョン時に延長をお願いした時の例です。

延長願いを出すと、バージョンの期限切れに関する変更チケットに延長申請用のフォームURLが共有されます。
Xanadu→Zurichバージョンアップの際のチケットの名前は「2025 Xanadu End of Life Upgrade」でした。
※もしかしたら「Family EOL Upgrade…」のチケットではなく、既にチケットが作成されていれば「2025 Xanadu End of Life Upgrade」チケットに直接延長願いをした方が良いかもしれません。試したことがないのでわかりませんが…
ServiceNowから延長申請フォームリンクを共有いただいたら、そちらを記入していきます。
全項目必須回答となっており、不完全な回答を送信すると延長申請は却下されるそうですので慎重に回答ください。
質問は選択肢式の設問が多く、希望延長日時や期限内にバージョンアップできない理由、バージョンアップ計画などについて計22項目聞かれます。また英語での質問・回答になりますのでご注意ください。
またこの際にCISOまたは情報セキュリティ担当者の氏名と連絡先情報を記入する必要があります。
事前にどなたが該当するか等の確認・調整が必要な場合がありますのでご注意ください。
フォーム送信後、審査にかけられパスすれば自動的に希望した日時でバージョンアップがスケジュール設定されます。
以上となります。この記事が役に立つ場面がないことが理想ですがどなたかの役に立てば幸いです。
]]>
こんにちは、ひるたんぬです。
この度「AWS re:Invent 2025」に参加できることになりましたので、現地での出来事や参加したセッションについてのレポートをお送りしたいと思います!
今回は、帰国の路と振り返りをしていきます!
帰国時は午前4時前の集合でした。
私は寝てしまうと起きられないリスクがあったので、集合時刻までは寝ずに過ごしました。
▼ 帰国前の預け荷物。半分空けたところ(& 現地で消費して空いた部分)が全て埋まるくらいの荷物です!
※ 空港で計量したところ、アメリカ国内線の手荷物重量制限ギリギリでした…(49.5 / 50 ポンド)

▼ 国内線でサンフランシスコ国際空港へ移動。
到着後は、トラムで国際線ターミナルへ移動します。

▼ 国際線のチェックイン。
見慣れた日系企業のロゴを見て少し安心しました。

▼ 成田空港到着!
約11時間のフライトでしたが、機内食以外は寝ていたためあっという間に着いてしまいました。
荷物受取時に、スーツケースの持ち手が手前に揃えられている姿は、やはり日本のおもてなしの心なのだなと改めて実感しました。

最後に、今回のAWS re:Invent 2025に参加した振り返りをしていきます。
今回は以下のセッションに参加しました。
初参加ということに加え、過去に参加されていた方から「現地でしか体験できないことを優先するべき」というアドバイスをいただいていたため、WorkShopやGameDay・Jamなどのセッションを中心とし、空き時間もExpo見学やHouse of Kiroなど、現地でしかできない体験をするようにしていました。
その結果、re:Inventのスケールの大きさを実感しつつ、国を超えた多くの交流をすることができました。
この経験は、今後の私のAWSに対する学習意欲を間違いなく高めてくれました。
改めて、今回このイベントに参加できたことを嬉しく思います。
この連載の初回に、私の持ち物についてご紹介しましたが、帰国した今、改めて持ち物について振り返りをしていきます。
出発から到着まで計8日間の出来事でしたが、最初から最後まで大変充実した日々を過ごすことができました。
私自身は周りの経験者の方の多くの助言によって、今回のイベントを楽しく、そして有意義に過ごすことができたので、今度は私もこれからre:Inventに参加される方向けにアドバイスをしていけたら良いなと思っております。
本記事が、来年以降re:Inventに参加される方の参考に少しでもなれば幸いです。
最後までご覧いただき、ありがとうございました!
]]> 本記事は TechHarmony Advent Calendar 2025 12/9付の記事です。 |
Catoクラウドの管理機能「Advanced Groups」について紹介します。
Catoクラウドの設定、運用管理を行う上で、「『工場』に該当する拠点からのアクセスのみを許可/拒否するようにしたい」「いくつかの特定IPレンジに対するルールを設定したい」など、複数の対象をひとまとめに扱いたいという状況に直面することが考えられます。
こういった需要に応える機能が、2025年に入ってから実装された「Advanced Groups」です。
……しかし、Catoには以前から同じような用途の「Groups」機能が存在していました。
「Advanced Groups」は「Groups」の名前を変えたものではなく、別機能として従来の「Groups」と共存しています。
では、何が違うのか?
この記事では、「Advanced Groups」がどうAdvancedなのか、これまでの「Groups」との違いを解説していきます。
「Advanced Groups」には、既存の「Groups」よりも優れた点が複数存在します。
「Groups」と「Advanced Groups」は、メンバーとして入れられる項目の属性が異なります。
2025/12現在、「Advanced Groups」でしか指定できない属性が存在する一方で、逆はありません。この点においては、「Advanced Groups」は既存の「Groups」を上回っています。
なお、「Advanced Groups」にて指定できる属性は今後も追加予定とアナウンスされています。
| 「Groups」での属性名 | 「Advanced Groups」 での属性名 |
備考 |
| Site | Site | |
| Network Interface | Network Interface | |
| Interface Subnet | Site Network Subnet | Advanced Groupsでは、 「Interface Subnet」と「Grobal Range」が 「Site Network Subnet」に統合されています。 |
| Grobal Range | ||
| Floating Subnet | Floating Subnet | CMAの[Resources] > [Floating Ranges]にて定義したFloating Rangeを選択できます。 |
| Hosts | Hosts | 各Siteの[Site Configuration > Static Host Reservations]にて、Static Hostとして登録したHostsを選択できます。 |
| – | Global IP Range | CMAの[Resources] > [IP Ranges]にて定義したIP Rangeを選択できます。 「Advanced Groups」でしかメンバーにできない属性です。 |
「Groups」「Advanced Groups」は共に様々な属性のオブジェクトをまとめて登録することができますが、それぞれの属性は使用する目的が微妙に異なります。
例えば、「Link Health Rule」はSiteの状態を監視して条件を満たした場合にメールで自動連絡をさせることが可能な機能です。この機能が「Source」として指定する対象は当然Siteであり、IPレンジでの指定には対応していません。
しかし、上記の状況で「Source」としてGroupsを使用すると、IPレンジがメンバーとして登録されているGroupを対象に指定できてしまいます。
幸い、この例であればCato側で無視されるため問題は生じませんが、誤設定に気が付かない、思わぬ不具合の引き金になるといったリスクが存在します。
「Advanced Groups」はこの問題を解決します。
Catoが自動的に「メンバーと設定しようとしている項目に互換性があるか」をチェックし、
互換性のないAdvanced Groupは選択肢に表示されないようになっています。
さらに、何らかのポリシーに利用されているAdvanced Groupは、
互換性が無くなるようなメンバーの追加がブロックされるように制御されます。
不具合の危険を排除できるほか、使えない属性のGroupが大量表示されて本命を探すのが大変……といった悩みも解決できるうれしい機能です。
「Advanced Groups」は、既存の「Groups」と比べてUIや管理機能が大幅に向上しています。
従来の「Groups」の一覧は、名前とDescriptionだけが表示される仕様です。
このため、似たような名前のGroupが多数存在する場合、「どれがどれだかわからない」問題が発生する恐れがありました。
もちろんDescriptionに詳しく書けば対策にはなりますが、更新されているかどうかまでは中を見なければわかりません。
一方、「Advanced Groups」は、入っているメンバーの属性と数、最終変更日、変更者まで一覧で確認できるようになりました。
これにより、各Advanced Groupがどのような目的のものなのか、大幅に判別しやすくなっています。また、最終変更日が確認できるため、「許可していない対象を勝手に追加する」といった行為が万一発生した場合でもすぐに特定可能であり、変更者表示から誰の作業で変更されたのかも確認可能です。セキュリティ面も大きく向上していると言えます。
「Advanced Groups」は、RBAC(Role-Based Access Control)機能に対応しています。
CMAの[Account] > [Administrators]から、管理者ユーザ毎に、Advanced Group個別で編集権限 / 閲覧権限を付与可能です。大きな組織で、各拠点の管理者には対応するAdvanced Groupだけの編集を許可する……といった運用が可能です。
この項目は従来の「Groups」も対象として追加はできるのですが、
メンバーが「Site」のGroup以外を指定した場合は機能しないという仕様がありました。
「Advanced Groups」ではそのようなことは無く、どのような属性のメンバーが入ったAdvanced Groupであっても個別の権限設定が可能です。
「Groups」はCMAでの手動更新にのみ対応していますが、「Advanced Groups」はAPIでの設定に対応しています。大規模な設定変更や、メンバーが大量に存在する場合の管理に力を発揮することが期待されます。
「Advanced Groups」は比較的最近になって実装された機能であるため、制約も少なからず存在します。
既存の「Groups」は、各Groupに紐づける形でDNS、DHCPの設定を行うことが可能です。
一方、「Advanced Groups」は2025/12現在、これに対応していません。
グループ個別でのDNS設定を行いたい、といった場合は既存のGroupを使用する必要があります。
(機能追加予定とされていますが、時期は未定です。)
2025/12月現在、「Advanced Group」を対象として利用できるのはInternet FirewallとWAN Firewallだけとなっています。
せっかくのメンバー属性識別機能も、現状では使える場所が少なすぎてまともに機能しないというのが現実です。
こちらも対象は順次追加予定であるようなので、今後に期待しておきましょう。
「Advanced Groups」機能は、既存の「Groups」では手の届かない細かなアップデートが光る一方、実用性はまだ発展途上といえる機能です。
Catoは今後「Advanced Groups」を主流としていく方針を発表しており、いずれは利用可能箇所も大きく増加することが見込まれます。
既存の「Groups」も併存していますが、今のうちに少しずつ触れてみても良いかもしれません。
前にEligible user(有資格者)側としてMicrosoft Entra Privileged Identity Management(PIM)を利用していました。

今回はAdministrator(管理者)側の操作を検証してみます。
PIMグループを作成して、アクティブ化の承認を実施する。
承認依頼のメールとか、承認完了までの操作をブログに記載したい。
ユーザーは2人設定。
Administrator:ad_tomioka
Eligible user:kottomioka
kottomiokaがPIMのアクティブ化を依頼し、ad_tomiokaが承認します。
現時点でkottomiokaは何も権限を有していません。
リソースグループrg-tomiokaをターゲットに、kottomiokaに対して共同作成者をPIMで割り当てます。
まずはグループを作成します
Azure Portal > Entra IDで検索 > グループ > 新しいグループ
から「PIM-tomioka-共同作成者」のグループを作ります。
所有者にad_tomioka、メンバーにkottomiokaを指定しています。
グループ作成後、アクティビティ>Privileged Identity Management
から「このグループのPIMを有効にする」をクリックします。
これでグループ作成完了です。
Azure Portal > PIMで検索 >管理 > Azureリソース
からリソースグループrg-tomiokaを指定し、リソースの管理を押します。
管理>割り当て から割り当ての追加を押します。
ロールの選択:共同作成者、選択されたメンバー:PIM-tomioka-共同作成者 を指定します。
これからアクティブ化に承認が必要な設定をします。
PIM-tomioka-共同作成者の画面より、割り当て>設定
からロールのMemberをクリックします。
余談ですがこの画面にいくまで少し苦労しました。
編集画面が出てきて、「アクティブにするには承認が必要です」にチェックを付けて、承認者を設定します。
これでPIMグループ作成完了です。
kottomiokaでポータルにログインし、PIMでアクティブ化の申請をします。
そしたらメールが来ました。
ad_tomioka側で承認ボタン押すと、承認者にも理由が求められました。
承認後すぐにkottomiokaに対してアクティブ化されました。
ずっとやってみたかったPIMの承認を体験しました。
承認する際にも理由を記載しないといけないことが判明しました。
手作業で承認するので実際の運用では、要求が来るたびに承認するのか、時間を指定して一斉に承認するかの考慮が必要そう。
こんにちは、SCSK斉藤です🐧
2025年11月にSnowflake Intelligenceがついに一般提供(GA)になりました。こちらは生成AIを利用して自然言語によるデータ検索や要約を可能にしてくれるインテリジェンスエージェントサービスです。
前回のブログでは、Snowflake Intelligenceの概要とセットアップ方法について弊社松岡より紹介しました。今回はその続きとして、実際にSnowflake Intelligenceを利用する為の過程・SCSKならではの支援について案内します!

企業が生成AIを活用するためには、データ活用が必要不可欠です。
Snowflake Intelligenceを活用することで「データが散在している」「非構造化データが活用できない」「誰が使えるのか不明」などの課題を解決することが可能です。
具体的には
データの一元管理:構造化・非構造化データを統合
権限設計:部門や役割に応じたアクセス制御を設定
Snowflake Intelligenceにより、現場の意思決定スピードが飛躍的に向上します。
つまり、データ活用は生成AI活用のスタートラインであり、Snowflake Intelligenceはその上で最大の効果を発揮するツールです。
例えばsnowflake Intelligenceは、こんな利用シーンがあります。
営業部門:
SQLやデータ分析に不慣れな営業担当者でも、「今月の地域別売上を教えて」と入力するだけで即座に分析結果を取得可能です。営業戦略の意思決定が迅速化。
製造部門:
設備稼働率や不良率などのデータが散在しがちな現場で、「今週のライン別稼働率を比較したい」といった質問を簡単に実行できます。改善活動に直結。
それではSnowflake Intelligenceを利用するための準備をしていきましょう。
以下の4つの主要機能で構成されており、それぞれが異なる役割を担っています。ここでは、機能の概要をご紹介します。
また4つの機能は全て、Snowflakeの[AIとML]からアクセスできます。
自然言語で問い合わせた内容を SQL に変換する Text-to-SQL サービスです。
会話型の質問をSQLクエリに変換することで、SQLの専門知識を持たないユーザーでも容易にデータへアクセスすることを実現します。
例)住んでいる国、ユーザー名、購入した商品のデータの場合
本機能により、「国ごとの購入数を教えてください」といった自然言語を解釈してSQLを組み立てることが可能
Cortex Analyst | Snowflake Documentation
Snowflake内の非構造化データに対する高品質・低レイテンシの検索サービスです。
ベクトル検索とキーワード検索のハイブリッドアプローチを活用し、検索やAIチャットボット向けのRAG(Retrieval Augmented Generation)などのユースケースをサポートします。
例)住んでいる国、ユーザー名、購入した商品のデータの場合
本機能により、SQLを使わず日本のユーザーの検索が可能
Cortex Search | Snowflake Documentation
構造化・非構造化データの両方を横断してインサイトを提供するオーケストレーションサービスです。上述のCortex Analyst(構造化データ用)・Cortex Search(非構造化データ用)をツールとして活用し、LLMと組み合わせてデータ分析を実行します。
例)住んでいる国、ユーザー名、購入した商品のデータの場合
本機能により、AIボットが検索と分析を交えた回答を可能
また関西弁で回答する設定もできるんやで
Cortex Agents | Snowflake Documentation
自然言語を使用してグラフなどのチャート作成や、テキストでの分析結果の返答を行います。
Cortex Analyst・Cortex Search を活用することにより、構造化データと非構造化データを含む様々なデータソースにアクセスし、統合的なデータ分析を行うことが可能です。
ガバナンス、セキュリティの観点としてはすべての回答については、その元となるソース(SQLクエリまたはドキュメント)まで追跡が可能です。また、Snowflake の既存のロールベースアクセス制御を活用することが可能です。
例)住んでいる国、ユーザー名、購入した商品のデータの場合
本機能により、一般ユーザーがチャット形式でデータ分析が可能
Snowflake Intelligence の概要 | Snowflake Documentation
みなさんSnowflake Intelligenceについて興味を持ってもらえたでしょうか?
Snowflake Intelligenceローンチパートナーの弊社ならではのサービスの一環として、以下が提供できます。
Snowflake Intelligenceの導入にあたり、業務に合わせたAIボットの設計から、実装・運用までを弊社がサポートしながら進める「伴走型支援」を提供します。
具体的には以下のような支援内容を想定しております。
SCSKならではの支援例)
・ユースケースに沿った生成AIモデルを選べるようサポート
・回答精度を上げる「整備→QA作成→検証→誤り修正」サイクルをサポート
・お客様のデータの特性や業務に合わせてCortex Agents、Cortex Analyst、Cortex Searchそれぞれの最適な分割方針を提案
・Snowflake Intelligence活用にあたり事前考慮すべきチャットやデータへの最適な閲覧/利用権限設計を提案
Snowflake Intelligenceだけではなく、DWH/ETL基盤としてのSnowflakeの導入支援も可能です。PoC(概念実証)から始めて、段階的に本番導入まで進めることが可能です。
データ活用上流から運用/データ活用高度化まで一気通貫でサポートします。
サービスに関する最新URLは以下をご参照ください!
Snowflakeソリューション│SCSK株式会社|サービス|企業のDX戦略を加速するハイブリッドクラウドソリューション
一般的なデータ活用のファーストステップとして、BIの固定帳票/ダッシュボードの開発・リリースを目標として掲げられるお客様が多いかと思います。
ただ、実際にはプロジェクトの中で現場関係者を巻き込み切れず、各利用部門のニーズを正確に把握しきれないまま進めた結果、導入したものの「使われないBI」になってしまうという事態に陥ってしまうことも多いのではないでしょうか。
Snowflake Intelligenceを活用することで、会話型のやり取りを通じて構造化・非構造化データの分析が可能になります。これにより、事業部門側でのデータ利活用が促進され、現場から多様なニーズが顕在化することが期待できます。
さらに、Snowflake Intelligenceでは、ユーザーが入力するプロンプトや利用状況のログを分析できます。これにより、よくある問い合わせや分析軸を抽出し、固定帳票/ダッシュボードに反映することが可能です。
このように、Snowflake Intelligenceの活用とその利用状況をもとにしたBIのブラッシュアップを組み合わせることで、現場にとって「本当に使える BI」を提供し、社内全体のデータ利活用をさらに加速できると考えています。
引き続き、Snowflake Intelligenceの可能性を一緒に探っていきましょう!
]]>SCSK いわいです。
前回からだいぶ間が空いてしまいましたが、今回はRaspberry Pi 5で気温/気圧/湿度センサーを使って測定し、
Webで表示するシステムを構築したいと思います。
DBに取得データを格納し、あとから検索できるといろいろ便利です。
今回は前回セットアップした環境をそのまま流用します。(Rapspberry Pi5のみ)
使用するRaspberry Piは前回同様に以下のものです。
【Raspberry Pi 5】
CPU: Broadcom BCM2712 quad-core Arm Cortex A76 processor @ 2.4GHz
Memory: 8GB
OS: Bookworm
前回同様にflaskを利用してWeb画面に測定結果を表示、DBから過去の測定結果を表示できるシステムを組んでみます。
【追加で用意するもの】
温湿度・気圧センサーモジュールキット(BME280使用)
ジャンパーケーブル×5
ブレッドボード×1
Webサーバアクセス用PC
PythonでFlaskアプリケーションを作成します。今回はWeb画面に測定結果をグラフ表示するようにしてみます。
さらにDB(sqlite3)を使用して、センサーでの測定結果をローカルDB(bme280_data.db)に格納し、
過去のデータを検索できるようにします。
イメージはこんなカンジで。
今回のシステムで導入する機能と各ライブラリの説明は以下のとおりです。
| 機能 | ライブラリ | 説明 |
|---|---|---|
| Webサーバ | Flask | 軽量なWebフレームワーク。センサー値や予測結果をWebアプリとしてブラウザに表示。 |
| センサー通信 | Smbus2 | ラズパイとI2C通信する。BME280と通信するために利用。 |
| bme280 | Bosch製の温湿度・気圧センサー BME280用のPythonライブラリ。データ取得する。 | |
| データ保存 | sqlite3 | 軽量な組み込み型データベースSQLiteを操作するためのライブラリ。計測データをローカルDBに保存・検索するために利用。 |
| 時刻処理 | datetime | 計測時刻の記録に利用。ローカルDBに保存するtimestampを生成。 |
Flaskとsmbus2とbme280は前回導入済み、sqlite3とdatetimeはデフォルトでインストールされているライブラリです。
前回同様にブレッドボードに温湿度・気圧センサーモジュールキットを接続します。
※BME280のSDOもRaspberry Piの6ピンに接続します。
次に回路とRaspberry Pi 5を接続します。
| センサ側 | Raspberry Pi 5 |
|---|---|
| BME280 VDD | 3.3V:1ピン |
| BME280 GND | GND:9ピン |
| BME280 SDI | GPIO2(SDA):3ピン |
| BME280 SDO | GND:6ピン |
| BME280 SCK | GPIO3(SDL):5ピン |
【Raspberry Pi 5のピン配置】
Raspberry Pi 5 Pinouts including GPIO for the 40 Pin Header – element14 Community
接続が終わったら、以下のコマンドを実行します。
| sudo i2cdetect -y 1 |
実行結果に「76」という表記があれば、正常に接続できています。
ファイル名はtemp_DB.pyにしてみました。
ChatGPTを利用してPythonスクリプトを作りました。
Pythonスクリプトで実行していることは以下です。
センサーからデータを読む
BME280から温度・湿度・気圧の最新値を取得します。
データを保存する
取得した値を毎回データベース(SQLite)に記録していきます。
Webページで表示する
FlaskでWebページを作り、以下を表示します。
2秒ごとに自動更新
ブラウザは2秒ごとに新しい測定値を取りに行き、自動でグラフや数値を更新します。
次にRaspberry PiでWebサーバを起動します。
| python3 temp_DB.py |
Webサイトアクセス用PCでブラウザを起動し、以下のURLにアクセスします。
| http://Raspberry Pi 5のIPアドレス:5000 |
センサーが稼働し、2秒ごとに現在の「温度」「気圧」「湿度」が表示されます。
画面右側では2秒ごとに「温度」「気圧」「湿度」のグラフが表示されます。
画面下側では過去データの検索結果を表示します。
これで乾燥対策もばっちりです。
次はDBに格納したデータを使っていろいろ試してみたいと思います。
]]> 本記事は TechHarmony Advent Calendar 2025 12/8付の記事です。 |
こんにちは、SCSK株式会社の中野です。
Zabbixは、システム監視・運用に欠かせないオープンソースの監視ツールです。しかし企業や各種プロジェクトでは、外部インターネットに直接アクセスできない、「オフライン環境」でZabbixを導入しなければならないケースも多くあります。
通常の導入手順では、公式リポジトリやインターネット経由でのパッケージ取得が前提となっていますが、オフラインではこの方法は使えません。
本記事では、AWS環境に構築したRed Hat Enterprise Linux 9.6上に、Zabbix 7.0を「オフライン環境」で導入する手順についてご紹介します。
今回の構成は以下とさせていただきます。
オフライン環境として、インターネットにアクセスできない状態を想定しています。そのため、Zabbixインストールに必要なファイルや依存パッケージは、事前に外部環境からダウンロードして持ち込む必要があります。
この記事では、Zabbix本体や必要なライブラリ・依存パッケージの準備からインストールまで、実際に試した手順をベースに解説します。
オフライン環境でZabbixを導入するためには、事前に必要なパッケージ類をすべてダウンロードしておく必要があります。
今回は、yumコマンドの–downloadonlyオプションを利用して、Zabbix関連パッケージをまとめて取得します。
# 関連パッケージのダウンロード
sudo yum install --downloadonly --downloaddir=/tmp/zabbix <パッケージ名>
※<パッケージ名>はzabbix-server、zabbix-webなど必要なパッケージ名に置き換えてください
この作業には、インターネットに接続されたオンライン環境のRHEL9サーバーが1台必要です。オンライン環境はあくまでダウンロード用に利用するだけなので、検証機や既存のRHEL9環境を流用しても構いません。
取得したパッケージはファイル転送コマンドや、USBメモリなどのメディアでオフライン環境へ持ち込んでください
# 関連パッケージのダウンロード(mysql, httpd)
sudo yum install --downloadonly --downloaddir=/tmp/mysql mysql-server
sudo yum install --downloadonly --downloaddir=/tmp/httpd httpd
# 関連パッケージのダウンロード(zabbix)
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-5.el9.noarch.rpm
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-server-mysql
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-web-mysql
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-web-japanese
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-apache-conf
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-sql-scripts
sudo yum install --downloadonly --downloaddir=/tmp/zabbix zabbix-agent2
関連パッケージをダウンロードしましたので、オフライン環境でZabbixをインストールします。まずはMySQLとApacheをインストールします。
# MySQLのインストール
dnf localinstall /tmp/mysql/*
# MySQLのインストール
dnf localinstall /tmp/httpd/*
# データベースを起動
systemctl start mysqld
systemctl enable mysqld
続いて、Zabbix用データベースを作成します。 DB名、アカウント名やパスワード環境に応じて設定いただければと思います。
# DBへの接続
mysql -uroot -p
Enter password: (MySQLのrootアカウントのパスワードを入力)
# DB、アカウントを作成
> CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
> CREATE USER zabbix@localhost IDENTIFIED BY 'zabbix';
> GRANT all privileges ON zabbix.* TO zabbix@localhost;
> SET global log_bin_trust_function_creators = 1;
> exit
続いてZabbixをインストールします。
# Zabbixサーバのインストール
dnf localinstall /tmp/zabbix/*
続いて、Zabbix用データベースへ初期データをインポートします。
# DBへ初期データをインポート
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
Enter password: (MySQLのzabbixアカウントのパスワードを入力)
初期データのインポート後、log_bin_trust_function_creatorsを無効にします。
# DBへの接続
mysql -uroot -p
Enter password: (MySQLのrootアカウントのパスワードを入力)
> SET global log_bin_trust_function_creators = 0;
> exit
その後、Zabbixサーバーの設定と起動を行います。
# 各パラメータ設定
/etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
# サービスの起動
systemctl start zabbix-server zabbix-agent2 httpd php-fpm
systemctl enable zabbix-server zabbix-agent2 zabbix-agent httpd php-fpm
Zabbixのインストールは完了しましたので、Webコンソール上でセットアップしていきます。
ブラウザを立ち上げて、以下にアクセスします。
http://xxx.xxx.xxx.xxx/zabbix
xxxには、今回構築したIPアドレスを入れてください。例えば、もしZabbixサーバーのIPアドレスが192.168.0.1なら、アドレスバーには”http://192.168.0.1/zabbix”と入力します。
言語を【日本語(ja_JP)】に変更して、【次のステップ】をクリックします。
すべての項目が「OK」になっていることを確認し、【次のステップ】をクリックします。
パスワード欄に先ほど設定したZabbixDBのパスワードを入力し、【次のステップ】をクリックします。
タイムゾーン欄で【(UTC+9:00) Asia/Tokyo】を選択、Zabbixサーバ名を記入し、【次のステップ】をクリックします。
設定内容に問題がなければ、【次のステップ】をクリックします。
【終了】をクリックすると、以下のようなログイン画面が表示されます。
初期状態でユーザーが登録されているので、以下のユーザー名・パスワードでログインします。
ログインすると、WEBコンソール画面が表示されます。
以上でZabbixのインストールは完了です。
今回は、オフライン環境でのZabbix導入手順についてご紹介しました。ネットワークに接続できない制約がある場合でも、事前に必要なパッケージをダウンロードし、オフライン環境に持ち込むことでZabbixを導入することが可能です。
監視システムの導入は、障害の早期発見や安定稼働のために大変重要な作業です。Zabbixはオープンソースでありながら高機能な監視を実現できますので、ぜひ今回の記事を参考に、オフライン環境でもZabbixの導入・活用にチャレンジしてみてください。
オフライン環境ならではのハードルもありますが、事前準備をしっかり行うことで、その壁を乗り越えることができます。
本記事がみなさまの環境構築のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました。
]]> 本記事は TechHarmony Advent Calendar 2025 12/7付の記事です。 |
こんにちは!SCSKの安藤です。
毎年恒例、TechHarmonyのアドベントカレンダー企画です!🎉🎉🎉
今年は、前半の約3分の1日程でZabbix枠を頂くことになり、投稿のお誘いをいただきましたので参加させていただくことになりました。
Zabbixは、オープンソースの監視ソリューションとして世界中で利用されています。
その進化の方向性を示す「Zabbix Roadmap」と、Zabbix Conference Japan 2025での発表内容から、次期バージョン Zabbix 8.0 LTSの、注目すべきポイントを整理しました。
以下のページには2026年Q1と記載ありますが、大方の予想はQ2とのことです。
Zabbix Life Cycle and Release Policy
Conferenceのテーマと公式ロードマップの情報より、以下の注目機能があげられます。
Zabbix8.0LTSの注目機能の1つとして、オブザーバビリティがあります。
「監視(Monitoring)」と「オブザーバビリティ(Observability)」は似ているようで、目的とアプローチが異なります。
| 監視(Monitoring) | オブザーバビリティ(Observability) | |
|---|---|---|
| アプローチ | システムや構成要素の状態を定常的に観察
閾値を設定してアラートを発報 |
システム内部の状態を把握するため、メトリクス・ログ・トレースなど多様なデータを収集・分析
問題発生時に「なぜ起きたか」を探ることが可能 |
| 目的 | 障害検出や稼働状態の把握 | 障害調査や原因分析 |
| イメージ | 症状の確認 | 診断と治療 |
監視では、なぜ問題が起きたかまでは分かりません。
環境やサービスが分散・分割され、変化し続けていくクラウドネイティブや分散システムでは、障害調査や原因分析に強いオブザーバビリティが不可欠です。
Conferenceでは、OpenTelemetryがオブザーバビリティ実現の鍵として紹介されました。
Zabbixのモバイルアプリが登場します。
新しいiOS/Android対応アプリでは、問題通知、履歴データ参照、問題管理が可能になり、外出先でも迅速な対応が実現します。
SREや運用担当者にとって、スマートフォンからの監視・管理は大きな利便性向上です。
実は随分前にはリリースされていたとの話もありますが、私は見かけたことはなく、公開されたら自分のスマホにインストールしてみたいと思っています!
複雑なイベント管理を効率化するため、エンタープライズアラームコンソールが導入されます。
タグや重大度の変更、フィルタリング、重複排除、さらにカスタムJavaScriptによる高度なパターンマッチングが可能。
セキュリティ監視や不正検知にも活用でき、運用負荷を大幅に削減します。
ネットワークの可視化と分析機能が強化されます。
NetFlowデータ収集・可視化により、帯域使用状況や通信経路を詳細に把握可能。
さらに、ネットワーク機器からのリアルタイムストリーミング対応で、異常検知のスピードが向上します。
Zabbixは「監視」から「オブザーバビリティ」へ進化し、クラウドネイティブやSREのニーズに応える機能を拡充していきます。
Zabbix 8.0 LTSは、企業の監視基盤を次のレベルへ引き上げる重要なアップデートになるでしょう。
最後まで読んでいただき、ありがとうございました。明日のアドベントカレンダーもお楽しみに!
弊社ではZabbix関連サービスを展開しています。以下ページもご参照ください。
★Zabbixの基礎をまとめたeBookを公開しております!★
★SCSK Plus サポート for Zabbix★
★YouTubeに、SCSK Zabbixチャンネルを開設しました!★
★X(旧Twitter)に、SCSK Zabbixアカウントを開設しました!★
]]>
→ FQDN として指定!
・ドメイン(例:*. microsoft.com)
→「*」を除いて、Domain として指定!
・URL(例:*microsoft.com*)
→ Cato では部分一致による URL 指定はサポートされていないため、
FQDN の完全一致、または Domain 単位で指定!