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?

はじめに

以前も書いてましたが、AgentCore ハーネスがGAになったので、改めて書いてみます。
今回はS3 FilesのSkillsを使ってみます。

skillsの使い方

ここがこの記事を書こうと思ったきっかけです。タイトルの「S3 Files に配置した Skills をマウント」をそのまま実現しようとすると、実は 2つの別機能が絡みます

道①:S3 skill source(かんたん・VPC不要)

ふつうの S3 バケットにスキルを置いて、s3://... の URI を指定するだけ。

response = client.invoke_harness(
    harnessArn=HARNESS_ARN,
    runtimeSessionId=SESSION_ID,
    skills=[
        {"s3": {"uri": "s3://my-skills-bucket/skills/company-style/"}},
    ],
    messages=[{"role": "user", "content": [{"text": "スタイルガイドに従って要約して"}]}],
)
  • 実行ロールに s3:GetObjects3:ListBucket があればOK
  • VPC は不要(S3 VPC エンドポイント経由でも動く)
  • スキル1個あたり 1GB 以下

👉 「とにかく S3 のスキルを使いたい」だけなら、こっちが正解。 圧倒的に簡単です。

道②:S3 Files をファイルシステムとして /mnt にマウント(本記事の主役)

一方、タイトルにある「S3 Files」は、Amazon のファイルシステムサービスです。これを使うと、

  • S3 Files のアクセスポイント/mnt/...マウントできる
  • マウントパスのファイルは、裏側の S3 バケットと 双方向に同期される
  • ただし VPC が必須

つまり「マウント」という言葉が正しく当てはまるのはこちらです。

そして「マウントした S3 Files の中に置いた Skill を使う」には、上の表の ④ Path(ファイルシステム)ソース を組み合わせます。

S3 Files をマウント(/mnt/s3data)
        ↓
その中に Skill を配置(/mnt/s3data/skills/my-skill/SKILL.md)
        ↓
Path ソースで参照({"path": "/mnt/s3data/skills/my-skill"})

これがタイトルどおりの構成です。**①より手間はかかりますが、「S3 のデータを丸ごとファイルシステムとして扱い、その一部をスキルとしても使う」**という、より柔軟なことができます。

⚠️ どちらを選ぶ?

  • スキルを配るだけ → 道①(S3 skill source)
  • S3 のデータをエージェントの作業ディレクトリとして使いつつ、その中のスキルも使いたい → 道②(S3 Files マウント + path skill)

この記事では学習目的で 道② をメインに解説します。


ハンズオン:S3 Files をマウントして、その中の Skill を使う

全体像

┌─────────────────────────────────────────────┐
│  AgentCore Managed Harness(microVM)         │
│                                               │
│   /mnt/s3data/  ←── マウント ──┐               │
│      └ skills/my-skill/        │               │
│           └ SKILL.md           │ 双方向同期     │
│                                │               │
│   path skill として参照 ───────┘               │
└────────────────────────────────┼──────────────┘
                                  │
                         ┌────────▼────────┐
                         │  Amazon S3 Files │
                         │  (access point)  │
                         │  + 裏側のS3バケット│
                         └──────────────────┘

前提・準備するもの

道②は VPC が必須なので、準備物がやや多めです。

  • AgentCore が GA 提供されているリージョン(対応リージョン一覧
  • VPC(サブネット2つ + セキュリティグループ1つ程度)
  • S3 Files のファイルシステム + アクセスポイント
  • ハーネス用の 実行ロール(execution role)
  • AgentCore CLI(agentcore コマンド)

🛠️ VPC・S3 Files・IAM の前提条件(ネットワーク・権限・セキュリティグループ)は、ハーネスと Runtime で共通です。詳細は公式の File system configurations for AgentCore Runtime を参照してください。

ステップ1:Skill を作る

まずは簡単な SKILL.md を1枚作ります。例として「社内のリリースノートを書くスキル」を作ってみます。

---
name: release-note-writer
description: 社内ルールに沿ったリリースノートを日本語で作成する。バージョン番号、変更点、影響範囲を必ず含める。
---

# リリースノート作成スキル

以下のフォーマットでリリースノートを書いてください。

## 出力フォーマット
- **バージョン**: vX.Y.Z
- **リリース日**: YYYY-MM-DD
- **変更点**: 箇条書き(ユーザー視点で)
- **影響範囲**: 影響を受ける機能・利用者
- **移行手順**: 必要な場合のみ

## ルール
- 専門用語には必ず1行の補足をつける
- 破壊的変更には ⚠️ を付ける

ステップ2:S3 Files のバックエンドバケットに Skill を置く

S3 Files のアクセスポイントは、裏側の S3 バケットと同期します。なので、裏側のバケットにスキルを置けば、マウント先にも現れます

# 裏側のS3バケットにスキルをアップロード
aws s3 cp ./release-note-writer/SKILL.md \
  s3://my-s3files-backing-bucket/skills/release-note-writer/SKILL.md

マウント経由で書き込んでも、S3 と双方向同期されるので結果は同じです。今回は分かりやすさ優先で、先に S3 へ置いておきます。

ステップ3:ハーネスに S3 Files をマウントする

agentcore CLI でハーネスを作り、S3 Files アクセスポイントをマウントします。S3 Files のマウントには VPC モードが必須なので、サブネットとセキュリティグループも一緒に渡します。

agentcore add harness --name data-agent \
  --network-mode VPC \
  --subnets subnet-abc123,subnet-def456 \
  --security-groups sg-abc123 \
  --s3-access-point arn:aws:s3files:us-west-2:123456789012:file-system/fs-0123456789abcdef0/access-point/fsap-0123456789abcdef0:/mnt/s3data

agentcore deploy

CLI ではなく API(CloudFormation や SDK)で作る場合は、次のような JSON になります。

aws bedrock-agentcore-control create-harness \
  --harness-name "DataAgent" \
  --execution-role-arn "arn:aws:iam::123456789012:role/MyHarnessRole" \
  --environment '{
    "agentCoreRuntimeEnvironment": {
      "networkConfiguration": {
        "networkMode": "VPC",
        "networkModeConfig": {
          "subnets": ["subnet-abc123", "subnet-def456"],
          "securityGroups": ["sg-abc123"]
        }
      },
      "filesystemConfigurations": [
        {
          "s3FilesAccessPoint": {
            "accessPointArn": "arn:aws:s3files:us-west-2:123456789012:file-system/fs-0123456789abcdef0/access-point/fsap-0123456789abcdef0",
            "mountPath": "/mnt/s3data"
          }
        }
      ]
    }
  }'

📌 ハマりポイント:ARN にコロンが含まれる
S3 Files のアクセスポイント ARN 自体に : が含まれます。CLI の --s3-access-point では、最後のコロンより後ろがマウントパスとして解釈されます。

📌 マウントパスは /mnt 配下のみ。S3 Files マウントは最大2個まで指定できます。

ステップ4:マウントできているか確認する

エージェントのループを通さずに、直接シェルコマンドを実行して中身を確認できます。これが InvokeAgentRuntimeCommand(CLI なら --exec)です。モデルを介さないので、トークン課金もありません。

agentcore invoke --exec --harness data-agent --session-id "$(uuidgen)" \
  "ls -la /mnt/s3data/skills/release-note-writer"

SKILL.md が見えていればマウント成功です 🎉

ステップ5:Path ソースで Skill を参照して呼び出す

マウントしたパスを path スキルソースとして渡します。

response = client.invoke_harness(
    harnessArn=HARNESS_ARN,
    runtimeSessionId=SESSION_ID,
    skills=[
        {"path": "/mnt/s3data/skills/release-note-writer"},
    ],
    messages=[{"role": "user", "content": [{"text": "v2.0.0 のリリースノートを書いて。認証方式をCognitoに変更した。"}]}],
)

ℹ️ 公式ドキュメントの path スキルの例は .agents/skills/xlsx のような相対パスで書かれています(コンテナにバイクインしたケース)。今回のように /mnt 配下にマウントしたスキルも同じファイルシステム上に存在するため path ソースで参照できる、というのが本構成の考え方です。実際に運用する際は、ステップ4の --exec でパスが見えていることを必ず確認してから本番に進めてください。

これで、S3 Files にあるスキルを、AgentCore Managed Harness のエージェントがマウント経由で使う構成の完成です。


補足:いろんなソースを混ぜられる

スキルソースは4種類すべてを1回の呼び出しで混ぜられます。

response = client.invoke_harness(
    harnessArn=HARNESS_ARN,
    runtimeSessionId=SESSION_ID,
    skills=[
        {"awsSkills": {"paths": ["core-skills/aws-cdk"]}},          # AWS公式
        {"git": {"url": "https://github.com/anthropics/skills", "path": "skills/docx"}},  # Git
        {"s3": {"uri": "s3://my-bucket/skills/company-style/"}},    # S3 skill source(道①)
        {"path": "/mnt/s3data/skills/release-note-writer"},          # S3 Filesマウント(道②)
    ],
    messages=[{"role": "user", "content": [{"text": "このプロジェクトを手伝って"}]}],
)

また、スキルはハーネス作成時(CreateHarness / UpdateHarness)のデフォルトとしても、呼び出しごとにも指定できます。両方で同名スキルを定義した場合は invoke 時のものが勝ちます。


ハマりやすいポイントまとめ

症状 エラー / 原因 対処
S3 スキルが取れない AccessDeniedException 実行ロールに s3:GetObject / s3:ListBucket を付与
S3 オブジェクトが無い Skill source not found: s3://… URI のパスを確認
Git clone が失敗 could not resolve host VPC に NAT ゲートウェイがあるか確認
Git がタイムアウト operation timed out after 60s Git fetch は 60秒以内に完了必須
スキルが大きすぎる Skill exceeds 1GB size limit スキルは 1GB 以下
AWS スキルが一致しない AWS skill path 'x' matched no skills glob パターンを見直す
パストラバーサル Invalid AWS skill path 相対パスのみ。/ 始まりや .. は禁止

スキル取得の失敗は握りつぶされず、必ず呼び出し自体が失敗します(descriptive error 付き)。「動いてるのにスキルが効いてない…」という事故が起きにくい、良い設計です。

そして一番大事なのは、冒頭で書いた 「S3 skill source(道①)」と「S3 Files マウント(道②)」を混同しないこと

  • VPC を立てたくない / スキルを配るだけ → 道①
  • S3 をファイルシステムとして使いたい → 道②(VPC必須)

まとめ

  • AgentCore Managed Harness は、エージェントを本番運用するための「土台一式」を設定で済ませられるマネージドサービス。2026年6月 GA。
  • Skills は Markdown + スクリプトで専門知識をオンデマンドに渡す仕組み。4種類のソース(AWS / Git / S3 / Path)がある。
  • 「S3 から Skill を使う」には 2つの道がある:
    • 道①:S3 skill source{"s3": {"uri": ...}}、VPC不要、かんたん
    • 道②:S3 Files マウント + path skill/mnt にマウントして参照、VPC必須、柔軟
  • タイトルの「S3 Files をマウント」をやるなら道②。ARN のコロン、マウントパスは /mnt 配下、VPC 必須あたりがハマりポイント。

「マウント」という言葉に引っ張られて道②を選びがちですが、多くのケースでは道①で十分です。要件に合わせて選びましょう。


参考リンク

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?