0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

agents-cliでお手軽にAIエージェントを開発する

0
Last updated at Posted at 2026-08-13

AIエージェントを手軽に作りたい

ちょっとしたAIエージェントを作りたいけど、ADKやLangGraph等を勉強するのは大変そう…という方にAIエージェントを簡単に作れる方法を紹介します。
それは、Google Cloudが提供しているagents-cliです!
Google Cloudプロジェクトを用意した状態なら自然言語で作りたいエージェントを伝えて、デプロイまでできます。
ちなみに、agents-cliの実態はCLIとSkillsのようです。
Antigravity CLIやClaude Code等から利用することが想定されています。

環境構築

WSL(Ubuntu)に環境構築するためのコマンドは以下の通りです。

インストール方法は私の趣味が含まれています。(homebrewとmise)
便利なので使ったことがない方はこれを機にぜひ!

ローカル環境構築を一から実施する方法

諸々のインストールに必要なパッケージのインストール

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential procps curl file git unzip ca-certificates gnupg

Homebrewのインストール(macOS・Linux向けのパッケージマネージャー)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# PATHに追加(bashの場合。zshなら ~/.zshrc に)
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

miseのインストール(開発環境のセットアップツール )

brew install mise

# シェル連携(bashの場合)
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
eval "$(mise activate bash)"

Python & uvのインストール

mise use -g python@latest
mise use -g uv@latest

Node.jsのインストール

mise use -g node@lts

gcloud sdkのインストール

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
sudo apt-get update && sudo apt-get install google-cloud-cli

Antigravity CLIのインストール

curl -fsSL https://antigravity.google/cli/install.sh | bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

作成したAIエージェント

AWS, Azure, Google Cloudについて、直近1週間に公開された情報をまとめるAIエージェントを作ってみました。
収集先はパブリッククラウドのリリースノートとQiitaの記事です。
パブリッククラウドの情報収集に利用したいと思っています。

Webサイトからツールで情報収集する際、意図せずサーバに負荷をかけてしまうことがあります。
サイトによっては規約で禁止しているので、規約違反にならないようご注意ください。

パブリッククラウドの公式ドキュメントはスクレイピングで情報収集しなければなりませんでした。
そこで、スクレイピングが利用規約で禁止されていないことを確認しました。

QiitaはAPIで記事を取得します。こちらも利用規約上問題ないことを確認しました。

今回は収集範囲が狭く1回の実行で同一サイトに行うアクセスはせいぜい数回なので実施していませんが、数十回とアクセスする場合はアクセス間隔をあけてサーバに負荷がかからないようにするのがおすすめです。

AIエージェントを作る

agents-cliをインストールした状態でAntigravity CLIを起動し、以下のプロンプトでAIエージェントを作ってもらいました。

agents-cliを使ってパブリッククラウドの情報収集をするエージェントを作ってください。

## 収集するクラウド
* AWS
* Azure
* Google Cloud

## 情報源
* 各クラウドのリリースノート
* Qiita

## 取得対象期間
* エージェント実行時から過去1週間に投稿された内容(タイムゾーンは日本)

## 取得方法
* Qiita:APIで新着記事を取得後、各記事の本文を取得
* その他:RSSで新着記事を取得後、各記事の本文を取得

## 収集結果のまとめ方
クラウド毎にMarkdownファイルを作成し、GCSに格納する。
Markdownファイルの内容は、以下の構成とする。
* 今週のサマリ
* 注目度の高い記事
* 注目の新機能
* 参考文献 ※参照したサイトへのリンク

すると、自動的にADK(Python)を使ったAIエージェントが作られます。

作成されたAIエージェントはこちら
agent.py
# ruff: noqa
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import datetime
from zoneinfo import ZoneInfo

from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.models import Gemini
from google.genai import types

from app.tools import (
    fetch_qiita_articles,
    fetch_rss_feeds,
    save_cloud_summary_markdown,
    upload_to_gcs,
)

MODEL = "gemini-3.6-flash"

SYSTEM_INSTRUCTION = """\
あなたはパブリッククラウド(AWS、Azure、Google Cloud)の最新情報収集とサマリ作成を行うアシスタントです。

【重要な用語規定】
- Google Cloudについては、絶対に「GCP」と略さず、必ず「Google Cloud」と表記・命名してください。

【タスク手順】
1. 指定された対象クラウド(AWS、Azure、Google Cloud)について、過去1週間(実行時から7日前まで)の最新情報を以下のツールを用いて取得してください:
   - `fetch_qiita_articles(cloud)`: Qiitaの新着記事と本文
   - `fetch_rss_feeds(cloud)`: 公式リリースノートのRSS情報と本文

2. 収集した情報から、各クラウドごとに以下の構成でMarkdownサマリを作成してください:
   ---
   # [クラウド名] 最新技術・リリース情報サマリ ([実行日])

   ## 今週のサマリ
   (過去1週間の全体的なトレンド、主なアップデートの概要を簡潔にまとめます)

   ## 注目度の高い記事
   (Qiitaで掲載された注目の技術記事・解説記事の要約)

   ## 注目の新機能
   (公式リリースノートやUpdatesで発表された注目すべき新機能・アップデート情報の要約)

   ## 参考文献
   (参照した記事・リリースノートのタイトルとURLリンクの一覧)
   ---

3. 作成したMarkdownサマリを `save_cloud_summary_markdown(cloud, summary_content)` を使って保存してください。
   ファイル名は自動的に `yyyy-MM-dd_AWS_summary.md`、`yyyy-MM-dd_Azure_summary.md`、`yyyy-MM-dd_Google_Cloud_summary.md` となります。

4. 保存したMarkdownファイルを `upload_to_gcs(file_path)` を使用してGoogle Cloud Storage (GCS) バケットにアップロードしてください。

5. 処理結果と保存先(ローカルパスおよびGCS URI/リンク/ステータス)をユーザーに報告してください。
"""

root_agent = Agent(
    name="cloud_tech_collector",
    model=Gemini(
        model=MODEL,
        retry_options=types.HttpRetryOptions(attempts=3),
    ),
    instruction=SYSTEM_INSTRUCTION,
    tools=[
        fetch_qiita_articles,
        fetch_rss_feeds,
        save_cloud_summary_markdown,
        upload_to_gcs,
    ],
)

app = App(
    root_agent=root_agent,
    name="cloud_tech_collector_app",
)

Toolsも自動的に作られました。
Toolsで決定論的に収集先のURLを探索することでアウトプットの信頼性が向上しますね。

tools.py
import datetime
import os
import re
from typing import Any
from urllib.parse import quote
from zoneinfo import ZoneInfo

import bs4
import feedparser
import requests
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

JST = ZoneInfo("Asia/Tokyo")

# User-Agent for requests
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}


def _get_past_week_cutoff() -> datetime.datetime:
    """Returns cutoff datetime (JST) for 7 days ago."""
    return datetime.datetime.now(JST) - datetime.timedelta(days=7)


def _extract_text_from_url(url: str, max_chars: int = 3000) -> str:
    """Helper to fetch URL and extract main body text using BeautifulSoup."""
    try:
        resp = requests.get(url, headers=HEADERS, timeout=10)
        if resp.status_code != 200:
            return ""
        soup = bs4.BeautifulSoup(resp.text, "html.parser")

        # Remove script and style tags
        for tag in soup(["script", "style", "nav", "footer", "header", "noscript"]):
            tag.decompose()

        # Target specific content tags if available
        article_body = (
            soup.find("article")
            or soup.find("main")
            or soup.find("div", class_=re.compile(r"content|body|post|zn-pretty"))
            or soup.body
        )

        if not article_body:
            return ""

        text = article_body.get_text(separator="\n", strip=True)
        # Clean up excessive newlines
        lines = [line.strip() for line in text.splitlines() if line.strip()]
        full_text = "\n".join(lines)
        return full_text[:max_chars]
    except Exception as e:
        print(f"Error fetching URL {url}: {e}")
        return ""


def fetch_qiita_articles(cloud: str) -> list[dict[str, Any]]:
    """Fetch Qiita articles for the specified cloud posted in the past 7 days.

    Args:
        cloud: The targeted cloud ("AWS", "Azure", or "Google Cloud").

    Returns:
        List of dictionaries containing article details (title, url, created_at, likes, body).
    """
    cloud_lower = cloud.lower()
    if "aws" in cloud_lower:
        tag_query = "tag:AWS"
    elif "azure" in cloud_lower:
        tag_query = "tag:Azure"
    else:  # Google Cloud
        tag_query = "tag:GoogleCloud OR tag:GCP"

    url = f"https://qiita.com/api/v2/items?page=1&per_page=30&query={quote(tag_query)}"
    cutoff = _get_past_week_cutoff()
    results = []

    try:
        resp = requests.get(url, headers=HEADERS, timeout=10)
        if resp.status_code == 200:
            items = resp.json()
            for item in items:
                created_str = item.get("created_at")
                if not created_str:
                    continue
                created_dt = datetime.datetime.fromisoformat(
                    created_str.replace("Z", "+00:00")
                ).astimezone(JST)
                if created_dt >= cutoff:
                    title = item.get("title", "")
                    article_url = item.get("url", "")
                    body = item.get("body", "")[:2500]  # First 2500 chars of markdown
                    likes = item.get("likes_count", 0)
                    stocks = item.get("stocks_count", 0)

                    results.append(
                        {
                            "source": "Qiita",
                            "title": title,
                            "url": article_url,
                            "created_at": created_dt.strftime("%Y-%m-%d %H:%M:%S JST"),
                            "likes": likes,
                            "stocks": stocks,
                            "body": body,
                        }
                    )
    except Exception as e:
        print(f"Error fetching Qiita articles for {cloud}: {e}")

    return results

def fetch_rss_feeds(cloud: str) -> list[dict[str, Any]]:
    """Fetch RSS feeds from official cloud release notes for the past 7 days.

    Args:
        cloud: The targeted cloud ("AWS", "Azure", or "Google Cloud").

    Returns:
        List of dictionaries containing release note item details.
    """
    cloud_lower = cloud.lower()
    cutoff = _get_past_week_cutoff()
    feeds_to_check = []

    if "aws" in cloud_lower:
        feeds_to_check = [
            ("AWS What's New", "https://aws.amazon.com/about-aws/whats-new/recent/feed/"),
        ]
    elif "azure" in cloud_lower:
        feeds_to_check = [
            ("Azure Updates", "https://www.microsoft.com/releasecommunications/api/v2/azure/rss"),
        ]
    else:  # Google Cloud
        feeds_to_check = [
            ("Google Cloud Release Notes", "https://cloud.google.com/feeds/gcp-release-notes.xml"),
        ]

    results = []

    for source_name, feed_url in feeds_to_check:
        try:
            feed = feedparser.parse(feed_url)
            for entry in feed.entries:
                pub_date = None
                if hasattr(entry, "published_parsed") and entry.published_parsed:
                    pub_date = datetime.datetime(
                        *entry.published_parsed[:6], tzinfo=datetime.timezone.utc
                    ).astimezone(JST)
                elif hasattr(entry, "updated_parsed") and entry.updated_parsed:
                    pub_date = datetime.datetime(
                        *entry.updated_parsed[:6], tzinfo=datetime.timezone.utc
                    ).astimezone(JST)

                title = getattr(entry, "title", "")
                link = getattr(entry, "link", "")

                if pub_date and pub_date >= cutoff:
                    summary_content = getattr(entry, "summary", "") or getattr(entry, "description", "")
                    # Extract body text from URL if summary is short
                    body_text = ""
                    if len(summary_content) < 300 and link:
                        body_text = _extract_text_from_url(link)
                    if not body_text:
                        # Clean HTML from summary
                        soup = bs4.BeautifulSoup(summary_content, "html.parser")
                        body_text = soup.get_text(separator="\n", strip=True)

                    results.append(
                        {
                            "source": source_name,
                            "title": title,
                            "url": link,
                            "created_at": pub_date.strftime("%Y-%m-%d %H:%M:%S JST"),
                            "body": body_text[:2500],
                        }
                    )
        except Exception as e:
            print(f"Error fetching RSS {feed_url} for {cloud}: {e}")

    return results


def save_cloud_summary_markdown(
    cloud: str, summary_content: str, execution_date: str = None
) -> str:
    """Save the cloud summary report to a local Markdown file with execution date in filename.

    Args:
        cloud: Cloud name ("AWS", "Azure", or "Google Cloud").
        summary_content: The full markdown report text.
        execution_date: Date string formatted as yyyy-MM-dd. Defaults to today's date.

    Returns:
        Absolute filepath of the saved Markdown file.
    """
    if not execution_date:
        execution_date = datetime.datetime.now(JST).strftime("%Y-%m-%d")

    cloud_normalized = "Google_Cloud" if "google" in cloud.lower() or "gcp" in cloud.lower() else cloud.upper()
    if cloud_normalized == "AZURE":
        cloud_normalized = "Azure"

    filename = f"{execution_date}_{cloud_normalized}_summary.md"
    output_dir = os.path.join(os.getcwd(), "output")
    os.makedirs(output_dir, exist_ok=True)

    filepath = os.path.join(output_dir, filename)
    with open(filepath, "w", encoding="utf-8") as f:
        f.write(summary_content)

    return filepath


def upload_to_gcs(file_path: str, bucket_name: str = None) -> str:
    """Upload a file to Google Cloud Storage (GCS).

    Args:
        file_path: Local path of the file to upload.
        bucket_name: Optional GCS bucket name. If not provided, defaults to
            GCS_BUCKET_NAME env var.

    Returns:
        Status message with GCS URI and console link.
    """
    if not os.path.exists(file_path):
        return f"Error: File {file_path} does not exist."

    if not bucket_name:
        bucket_name = os.environ.get("GCS_BUCKET_NAME")

    try:
        from google.cloud import storage

        client = storage.Client()
        bucket = client.bucket(bucket_name)
        blob_name = os.path.basename(file_path)
        blob = bucket.blob(blob_name)

        blob.upload_from_filename(file_path, content_type="text/markdown")

        gcs_uri = f"gs://{bucket_name}/{blob_name}"
        console_link = f"https://console.cloud.google.com/storage/browser/_details/{bucket_name}/{blob_name}"
        return (
            f"Successfully uploaded '{blob_name}' to GCS bucket '{bucket_name}'!\n"
            f"GCS URI: {gcs_uri}\n"
            f"Console Link: {console_link}"
        )
    except Exception as e:
        return f"Failed to upload to GCS bucket '{bucket_name}': {str(e)}. File is saved locally at {file_path}"

Cloud Runにデプロイすることも想定されており、APIエンドポイントも作られました。

fast_api_app.py
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import contextlib
import os
from collections.abc import AsyncIterator

import google.auth
from a2a.server.tasks import InMemoryTaskStore
from dotenv import load_dotenv
from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app
from google.adk.runners import Runner
from google.cloud import logging as google_cloud_logging

from app.app_utils import services
from app.app_utils.a2a import attach_a2a_routes
from app.app_utils.reasoning_engine_adapter import (
    attach_reasoning_engine_routes,
)
from app.app_utils.typing import Feedback

load_dotenv()
otel_to_cloud = os.environ.get(
    "GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY", ""
).lower() in ("true", "1")
_, project_id = google.auth.default()
logging_client = google_cloud_logging.Client()
logger = logging_client.logger(__name__)
allow_origins = (
    os.getenv("ALLOW_ORIGINS", "").split(",") if os.getenv("ALLOW_ORIGINS") else None
)

AGENT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


@contextlib.asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
    # Runner for the A2A path, sharing the same session/artifact services as the
    # adk_api and reasoning_engine paths (see services.py). Imported here so the
    # agent is built after env/telemetry setup.
    from app.agent import app as adk_app
    from app.agent import root_agent

    runner = Runner(
        app=adk_app,
        session_service=services.get_session_service(),
        artifact_service=services.get_artifact_service(),
        auto_create_session=True,
    )
    # Shared by the A2A path and the reasoning_engine adapter routes.
    app.state.runner = runner
    app.state.agent_app_name = adk_app.name
    await attach_a2a_routes(
        app,
        agent=root_agent,
        runner=runner,
        task_store=InMemoryTaskStore(),
        rpc_path=f"/a2a/{adk_app.name}",
    )
    yield


app: FastAPI = get_fast_api_app(
    agents_dir=AGENT_DIR,
    web=True,
    artifact_service_uri=services.ARTIFACT_SERVICE_URI,
    allow_origins=allow_origins,
    session_service_uri=services.SESSION_SERVICE_URI,
    otel_to_cloud=otel_to_cloud,
    lifespan=lifespan,
)
app.title = "cloud-tech-collector"
app.description = "API for interacting with the Agent cloud-tech-collector"


# Proxy routes so the Vertex AI Console Playground (reasoning_engine SDK) can
# talk to this agent alongside the native adk_api routes.
attach_reasoning_engine_routes(app)


@app.post("/feedback")
def collect_feedback(feedback: Feedback) -> dict[str, str]:
    """Collect and log feedback.

    Args:
        feedback: The feedback data to log

    Returns:
        Success message
    """
    logger.log_struct(feedback.model_dump(), severity="INFO")
    return {"status": "success"}


# Main execution
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

Agent Runtimeにデプロイする

以下のプロンプトで簡単にデプロイできました。

Agent Runtimeにデプロイしてもらったプロンプト
agents-cliを使ってGoogle CloudのAgent Runtimeにデプロイしてください。

Antigravity CLIがagents-cliを使ってデプロイをしていました。

Antigravity CLI上の表示
Bash(agents-cli deploy --no-confirm-project --project (秘密) --region asia-northeast1)

デプロイされたエージェントは、 Agent Platform > エージェント > デプロイ > (エージェント名) > プレイグラウンド でGoogle Cloudコンソール上から動作確認できます。

image.png

プレイグラウンドから情報収集依頼をしてしばらく待つと以下のように結果が表示されます。

image.png

GCSバケットにちゃんと結果が格納されていました。

image.png

Agent RuntimeからGCSにファイルアップロードするためには、Agent Runtimeに紐づくサービスアカウントservice-(プロジェクトナンバー)@gcp-sa-aiplatform-re.iam.gserviceaccount.comに権限付与が必要です。
私はroles/storage.objectCreatorロールを付与して動作確認しました。

Cloud Runにデプロイし、Cloud Schedulerで週次実行する環境を作る

agents-cliはエージェントの実行環境としてCloud Runも指定可能です。
Cloud Runにデプロイし、Cloud Schedulerを使って毎週土曜に自動実行される環境を作ってもらいました。

Cloud RunとCloud Schedulerで自動的に情報収集する環境を作るプロンプト
Cloud RunとCloud Schedulerを使って毎週土曜午前9時にデプロイしたエージェントを実行するようにしてください。

Antigravity CLIがデプロイしてくれた様子は以下の通りです。

Antigravity CLIがagents-cliを使ってCloud Runにデプロイする様子
Bash(agents-cli deploy --deployment-target cloud_run --no-confirm-project --project (秘密) --region asia-northeast1)

Cloud Runに対してGCSにファイルアップロードする権限付与はgcloudコマンドで実施してくれました。
なお、デフォルトのサービスアカウントを使ってデプロイされていました。
権限分離を適切に行うにはデプロイ指示のプロンプトで新規サービスアカウントを使うよう明示的に指示するのがよさそうです。

Antigravity CLIがCloud RunにGCSアップロードの権限付与する様子
Bash(gcloud run services add-iam-policy-binding cloud-tech-collector --member=serviceAccount:(プロジェクトナンバー)-compute@developer.gserviceac...)

Cloud Schedulerもgcloudコマンドで自動的に構築してくれました。

Antigravity CLIがCloud Runを起動するCloud Schedulerを作る様子
Bash(gcloud scheduler jobs create http cloud-tech-collector-weekly --project=(秘密) --location=asia-northeast1 --schedule="0 9...) (ctrl+o to
expand)

これで毎週土曜9時に勝手にAWS, Azure, Google Cloudの情報収集をしてくれるようになりました!

と思いきや実行してみたらAzureのリリースノートだけうまくアクセスできていないようでした…

image.png

今回は深堀せずAzureの公式ドキュメントは諦めることにします…
無駄にアクセスを試行し続けるのはサイトにも迷惑をかけますし、ツールの実行時間も増えるのでAzureは除外しておきます。

なお、AzureのリリースノートはMCPサーバで取得できるようなので、こちらを使うのが適切かもしれません。

生成されたファイル

今回はAIエージェントの出力結果紹介の意図でそのまま掲載します。
誤りが混入しているかもしれませんのでご注意ください。

AWSの収集結果

AWS 最新技術・リリース情報サマリ (2026-08-13)

今週のサマリ

過去1週間において、AWSではAmazon Bedrockにおける新しいセキュリティ特化モデル(OpenAI Daybreak)の提供開始やIAM/EKS/EC2等のコアサービスの機能拡張が目立ちました。特にIAMロール作成を自動化する「role manager」のGAや、EC2におけるアプリケーション層の自動監視チェックの導入など、セキュリティおよび運用自動化の強化が進んでいます。また、生成AI関連ではBedrockにおけるコスト分析精度の向上やエージェント基盤の強化に関するナレッジが注目を集めました。

注目度の高い記事

  • プロンプトチェイニングとAmazon Bedrock活用法
    複雑なAIタスクを複数の工程(要件整理・構成・本文・レビュー)に分解し、前の出力を次工程へ安全に渡す「プロンプトチェイニング」の概念と、Amazon Bedrock Converse APIを使ったPythonでの実装例が解説されています。
  • AWSのAIサービス全容整理(Bedrock / SageMaker AI / Amazon Q)
    目的(生成AIアプリ構築、開発者支援、社内FAQ、独自モデル構築、特定機能API)に応じたAWS AIサービスの選定基準と使い分けのベストプラクティスが紹介されています。
  • OpenAIのセキュリティ特化モデル「Daybreak」がAmazon Bedrockで提供開始
    サイバーセキュリティに特化したモデル「Daybreak」がAmazon Bedrockから利用可能となり、既存のIAM権限やVPC構成を活かして脅威分析やセキュリティ運用を強化できる点が紹介されています。

注目の新機能

  • AWS IAM role manager の一般提供開始 (GA)
    AWSサービスのセットアップ時に必要なIAMロールを自動生成・適用する「role manager」機能がGAされました。LambdaやEventBridge等で権限設定の手間が軽減されます。
  • Amazon EKS のコントロールプレーンパラメータ設定機能
    Kubernetesのスケジューラーやコントローラーマネージャー、APIサーバーなどの詳細なパラメータ設定が可能になり、ポッドの配置戦略やオートスケーリングの応答速度のカスタマイズが容易になりました。
  • Amazon EC2 アプリケーションステータスチェック
    Webサーバーの停止やDockerデモンの不具合など、OS上のアプリケーションレベルの障害を定期的に(60秒間隔で)自動検出するステータスチェック機能が提供されました。
  • AWS Secrets Manager での外部シークレット自動ローテーション拡大
    Jenkins API Tokens および SonarQube Tokens の資格情報を、カスタムコードなしで自動ローテーションできるようになりました。

参考文献

Azureの収集結果

Azure 最新技術・リリース情報サマリ (2026-08-13)

今週のサマリ

過去1週間におけるAzureの動向として、ネットワークおよびセキュリティ性能の向上が際立っています。Azure Firewall PremiumにおけるIDPSスループットが2.2倍(最大22 Gbps)に強化されたほか、Azure Front DoorにおけるMutual TLS (mTLS) 認証のパブリックプレビューやバッチルール更新のGAが発表されました。また、PostgreSQL基盤にAI機能を統合した「Azure HorizonDB」の技術動向や、Azure Cloud Adoption Framework (CAF) を用いたAIエージェント導入の意思決定フレームワーク、Azure OpenAI (Reasoningモデル) やRAGのチューニング手法など、AI活用における実践的なナレッジが多く共有されています。

注目度の高い記事

  • Azure HorizonDB による高次元ベクトル検索
    PostgreSQL基盤にAI機能を直接統合したAzure HorizonDB(pgvectorおよびpg_diskann対応)のアーキテクチャと、SQLから直接AIモデル呼び出しやハイブリッド検索を実行する手法が解説されています。
  • Azure Cloud Adoption Framework (CAF) で作るAIエージェント導入意思決定フレームワーク
    「AIエージェント導入」を目的にせず、ビジネス目標や業務課題に基づいて決定的な処理・RAG・AIエージェントの適用を判断するための比較手法・ガバナンス設計が整理されています。
  • Azure OpenAI × RAGチャットボットの応答速度最適化
    Azure OpenAIのReasoningモデル(GPT-5系)を使ったチャットボットにおいて、429スロットリングの解消、reasoning_effort パラメータの最適化、不要なLLM呼び出しの削減により、応答時間を約20秒から9.7秒に短縮した実践例が紹介されています。

注目の新機能

  • Azure Firewall Premium のIDPSパフォーマンス大幅強化 (GA)
    TLSインスペクションおよびIDPS (Denyモード) 有効時のスループットが最大22 Gbpsに拡大(従来の10 Gbpsから120%向上)し、大規模ネットワーク通信の保護性能が向上しました。
  • Azure Front Door での Mutual TLS (mTLS) 認証サポート (Preview)
    クライアント証明書(X.509)を用いたMutual TLS認証がFront Door側で対応可能となり、B2B連携やAPIアクセスのセキュリティが向上しました。
  • Azure Front Door のバッチルール更新機能 (GA)
    複数のルール更新を一括で反映できるバッチルール更新機能がGAされました。
  • Azure Storage Mover による AWS FSx からのデータ移行対応 (Preview)
    エージェントレスで AWS FSx for Windows File Server (SMB) から Azure Files (SMB) へクラウド間直接移行ができるようになりました。

参考文献

Azureのリリースノートも参考文献にちゃんと入っていますが、各リンクの中身にアクセスできていないはずなのでサマリや注目の新機能に記載されている内容は怪しいかもしれません。

Google Cloudの収集結果

Google Cloud 最新技術・リリース情報サマリ (2026-08-13)

今週のサマリ

過去1週間のGoogle Cloudにおけるアップデートでは、AIエージェントやModel Context Protocol (MCP) との統合、コンテナ実行基盤およびデータベースの強化が大きく進展しました。Apigee API Hubでの gcloud コマンドによるMCPサーバー構築・デプロイ機能のGAや、Cloud Runでの最新NVIDIA L4 GPUドライバーサポート、BigQueryにおけるGemini 3.1 Flash-Lite / 3.5 FlashモデルのサポートGAなど、AIエコシステムとの親和性が高まっています。またコミュニティでは、IAP for Cloud Runを活用した認証構成や、公式Cloud Run MCPを用いたClaude Codeからの自然言語デプロイ検証などが注目を集めました。

注目度の高い記事

  • IAP for Cloud Run によるシンプルな認証の組み込み
    従来のGoogle Cloud Load Balancing (GCLB) なしでCloud Runに直にIdentity-Aware Proxy (IAP) をアタッチする機能について、Terraformを用いた実装例と従来構成との比較が紹介されています。
  • Google公式 Cloud Run MCP サーバーを使ったAIデプロイ検証
    Cloud Run公式のMCP (Model Context Protocol) サーバーをClaude Codeに連携させ、自然言語の指示でサンプルアプリをビルド・デプロイする一連のハンズオン手順が解説されています。
  • BigQuery Conversational Analytics によるデータエージェント構築
    BigQuery Studioで自然言語によるデータ分析を可能にする「データエージェント」の構築・用語集設定・検証済みクエリの設定手順と利用インプレッションがまとめられています。

注目の新機能

  • Apigee API Hub における MCP サーバーの構成・デプロイ機能 (GA)
    gcloud apihub locations configure-and-deploy-server コマンドを用いて、API Hub上の操作をエージェント統合用MCPツールとして構成・デプロイする機能が一般提供開始 (GA) されました。
  • Cloud Run での NVIDIA L4 GPU ドライバー 580.x.x サポート
    Cloud Run の Services、Jobs、Worker Pools にて最新の NVIDIA L4 GPU ドライバーが利用可能になりました。
  • BigQuery での Gemini 3.1 Flash-Lite / 3.5 Flash サポート (GA)
    BigQueryの生成AI関数において gemini-3.1-flash-lite および gemini-3.5-flash モデルがマルチリージョンエンドポイントで一般提供開始 (GA) されました。
  • AlloyDB for PostgreSQL と BigQuery のデータ同期機能 (Preview)
    BigQueryからAlloyDBへワンタイムまたは定期スケジュールでテーブルを同期する機能がパブリックプレビューされました。

参考文献

注目の新機能に明らかに古いのが混ざっていますね…
Google Cloudのリリースノートは過去分まで含めて1ページになっているからかもしれません。

まとめ

今回はAntigaravity CLIとagents-cliを使ってエージェント開発してみました。
どんなエージェントを作りたいか、どういう処理にしたいかを指示すればサクッと作れました。
エージェント開発の敷居はかなり下がってきているように感じます。
ただし、今回の例だとリリースノートを意図通りに取得できていない問題があり、生成物の信頼性を高めるには工夫が必要そうです。

また、さらに高度なエージェントを作ろうとしたら、そう簡単にはいかないと思いますがお試しで作ってみる分にはとても使い勝手が良いと思います。
エージェント作ってみたいけど、ハードル高くて手が出せていないという方は良かったら試してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?