この記事は、以下のQiita記事と同じ流れで説明を進めます(Indigo APIの“クセ”も継承)。
WebARENA Indigo APIでVPSを作る(curl/Python+cloud-init)
- Indigo API の基本(アクセストークン取得→VM作成→起動→IP取得)
- cloud-init を起動時に渡せない/VM作成直後は Stop 状態
- API 呼び出し回数制限が厳しいため sleep を長めにし、ループ回数を抑制
以降のBashは実機で複数回動作確認済みです。お客様環境では3変数だけ差し替えれば、そのまま動くはずです。
これは何をする?
- Indigo API で VPS(Ubuntu 24.04)を作成
- 起動 → グローバルIP 取得
- SSH 経由で NoCloud seed(meta-data/user-data)を配置して再起動
- 再起動時の cloud-init で k3s + Knative(Kourier + sslip.io)を自動構築
- サンプルの Knative Service(helloworld-go)をデプロイして URL にアクセス
前提
-
ローカル(Mac or Linux)に
bash,curl,jq,ssh,scp,ssh-keygenがあること- macOS:
brew install curl jq openssh - Ubuntu:
sudo apt -y install curl jq openssh-client
- macOS:
-
Indigo で **事前に公開鍵登録(SSH Key)**を作成済み(本稿の例では SSH_KEY_ID を指定)
-
この記事のスクリプトでは以下を利用
- Region:
1(例: 東京) - OS:
25(例: Ubuntu 24.04) - Plan:
4(例: 3vCPU/4GB以上を推奨)
- Region:
まずは 3 変数だけ設定
# ★お客様環境に合わせて差し替え(例)
export INDIGO_CLIENT_ID="お客様環境に合わせて差し替え"
export INDIGO_CLIENT_SECRET="お客様環境に合わせて差し替え"
export SSH_PRIVATE_KEY_PATH="お客様環境に合わせて差し替え"
このキーのことが解らない時は、この記事を見てください
WebARENA Indigo APIでVPSを作る(curl/Python+cloud-init)
そのほか(任意):
INDIGO_INSTANCE_NAME(既定:indigo-k3s-knative)、INDIGO_REGION_ID、INDIGO_OS_ID、INDIGO_INSTANCE_PLAN、INDIGO_SSH_KEY_IDなどはスクリプト先頭で変更可能です。
実行ファイルの入手と実行
本稿のBashはAPI呼び出し回数制限に配慮しており、
sleepを長めに入れています。必要に応じて調整してください。
- Bashファイルを古スクリプトをダウンロード、名前をつけて保存。
- 実行権限を付与して実行
chmod +x ./indigo_knative_all.sh
./indigo_knative_all.sh
スクリプトの流れ
-
アクセストークン取得(OAuth)
-
VM作成(Qiita記事どおりの5キー:
sshKeyId, regionId, osId, instancePlan, instanceNameを指定) -
起動(
statusupdate: start)→ グローバルIP 取得待ち- API制限回避のため
forループに長めのsleep 40を採用
- API制限回避のため
-
NoCloud seed(
/var/lib/cloud/seed/nocloud-net/)をSSHで配置 → 再起動 -
cloud-init 完了待ち(タイムアウト30分)
-
念のための フォールバック導入(k3s/Knative を再適用)
-
Knative サンプル(
ghcr.io/knative/helloworld-go)をdemo名前空間にデプロイ
動作確認コマンド(手動)
ここまでで cloud-init により自動デプロイされていますが、手動でも確認できます。
# 1) ログイン
ssh -i 'お客様環境に合わせて差し替え' 'ubuntu'@'<取得したIP>' \
-o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
# 2) 名前空間の作成(存在する場合は無視)
kubectl create ns demo 2>/dev/null || true
# 3) hello をデプロイ
cat <<'YAML' | kubectl -n demo apply -f -
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello
spec:
template:
spec:
containers:
- image: ghcr.io/knative/helloworld-go:latest
env:
- name: TARGET
value: "Knative"
YAML
# 4) Ready待ち & URL取得 & 叩く
kubectl -n demo wait ksvc/hello --for=condition=Ready --timeout=600s
URL=$(kubectl -n demo get ksvc hello -o jsonpath='{.status.url}')
echo "$URL"
curl -i "$URL"
出力例:
HTTP/1.1 200 OK
...
Hello Knative!
補足: Kourier + sslip.io を使っているため、
http://hello.demo.<外部IP>.sslip.ioにブラウザからアクセスしても同じ結果が得られます。
よくある詰まりと対策
-
トークン取得が
null→ Client ID/Secret を確認。ネットワーク越しのプロキシやDNSも注意。 -
getinstancelistで IP が取れない → VMがRunningになるまで待機。Loop時間全体を増やす。 -
SSH が開かない → Indigo側で
statusupdate(stop→start)し直す/数分待って再実行。 - cloud-init が完走しない → フォールバックステップが k3s+Knative を再適用します(ログを確認)。
-
ブラウザで開けない →
kubectl -n kourier-system get svc kourier -o wideで EXTERNAL-IP を確認し、serving-default-domain.yaml(sslip.io)の適用を再チェック。
付録:フルスクリプト
※sleep 値や OS/Plan/Region/SSH Key ID は環境に合わせて調整してください。
#!/usr/bin/env bash
set -euo pipefail
# ==== 設定(必要に応じて編集 or 環境変数で上書き)====
INDIGO_OAUTH_URL="${INDIGO_OAUTH_URL:-https://api.customer.jp/oauth/v1/accesstokens}"
INDIGO_API_BASE="${INDIGO_API_BASE:-https://api.customer.jp/webarenaIndigo/v1}"
INDIGO_CLIENT_ID="お客様環境に合わせて差し替え""
INDIGO_CLIENT_SECRET="お客様環境に合わせて差し替え""
INDIGO_REGION_ID="1" # 例: 東京
INDIGO_OS_ID="25" # 例: Ubuntu 24.04
INDIGO_INSTANCE_PLAN="4" # 例: 3vCPU/4GB以上を推奨
INDIGO_SSH_KEY_ID="9728"
INDIGO_INSTANCE_NAME="${INDIGO_INSTANCE_NAME:-indigo-k3s-knative}"
SSH_USER="${SSH_USER:-ubuntu}"
SSH_PRIVATE_KEY_PATH="お客様環境に合わせて差し替え""
# Knative リリースタグ(必要なら更新)
KNATIVE_VERSION="${KNATIVE_VERSION:-knative-v1.19.0}"
############################################
# ユーティリティ
############################################
need(){ command -v "$1" >/dev/null 2>&1 || { echo "ERROR: $1 が必要です"; exit 1; }; }
need curl; need jq; need ssh; need scp; need ssh-keygen
require_num(){ local n="$1" v="$2"; [[ -n "$v" && "$v" =~ ^[0-9]+$ ]] || { echo "ERROR: $n='$v'"; exit 1; }; }
require_set(){ local n="$1" v="$2"; [[ -n "$v" && ! "$v" =~ __PUT_ ]] || { echo "ERROR: $n 未設定"; exit 1; }; }
api_post_json(){
# -sS(静か+エラー詳細)。HTTP4xxでもJSONを見たいので -f は付けない
local url="$1" data="$2" token="${3-}"
if [[ -n "$token" ]]; then
curl -sS -X POST "$url" -H 'Content-Type: application/json' -H "Authorization: Bearer $token" -d "$data"
else
curl -sS -X POST "$url" -H 'Content-Type: application/json' -d "$data"
fi
}
api_get(){ curl -sS -X GET "$1" -H "Authorization: Bearer $2"; }
############################################
# 前提チェック
############################################
require_set INDIGO_CLIENT_ID "$INDIGO_CLIENT_ID"
require_set INDIGO_CLIENT_SECRET "$INDIGO_CLIENT_SECRET"
require_num INDIGO_REGION_ID "$INDIGO_REGION_ID"
require_num INDIGO_OS_ID "$INDIGO_OS_ID"
require_num INDIGO_INSTANCE_PLAN "$INDIGO_INSTANCE_PLAN"
require_num INDIGO_SSH_KEY_ID "$INDIGO_SSH_KEY_ID"
require_set INDIGO_INSTANCE_NAME "$INDIGO_INSTANCE_NAME"
############################################
# 0) アクセストークン取得
############################################
echo "== Get access token =="
TOKEN="$(api_post_json "$INDIGO_OAUTH_URL" "$(jq -n \
--arg id "$INDIGO_CLIENT_ID" --arg sec "$INDIGO_CLIENT_SECRET" \
'{grantType:"client_credentials", clientId:$id, clientSecret:$sec, code:""}')" \
| jq -r '.accessToken')"
[[ -n "$TOKEN" && "$TOKEN" != "null" ]] || { echo "トークン取得失敗"; exit 1; }
############################################
# 1) VM作成(記事どおり5キー)
############################################
echo "== Create instance (Qiita記事どおりの5キー) =="
CREATE_JSON="$(api_post_json "${INDIGO_API_BASE}/vm/createinstance" "$(jq -n \
--argjson sshKeyId "$INDIGO_SSH_KEY_ID" \
--argjson regionId "$INDIGO_REGION_ID" \
--argjson osId "$INDIGO_OS_ID" \
--argjson instancePlan "$INDIGO_INSTANCE_PLAN" \
--arg instanceName "$INDIGO_INSTANCE_NAME" \
'{sshKeyId:$sshKeyId, regionId:$regionId, osId:$osId, instancePlan:$instancePlan, instanceName:$instanceName}')" "$TOKEN" || true)"
echo "$CREATE_JSON" > /tmp/indigo_create.json
sleep 90
# 応答から id/instanceId を拾う。無ければ一覧から「名前で」逆引き
INSTANCE_ID="$(jq -r '(.instanceId // .id // .data.instanceId // .data.id // empty)' /tmp/indigo_create.json)"
if [[ -z "$INSTANCE_ID" ]]; then
echo "create 応答に id なし→一覧から名前で逆引き…"
sleep 2
LIST_JSON="$(api_get "${INDIGO_API_BASE}/vm/getinstancelist" "$TOKEN")"
INSTANCE_ID="$(echo "$LIST_JSON" | jq -r --arg name "$INDIGO_INSTANCE_NAME" '
.[] | select((.instance_name|tostring|gsub("\\s+$";"")|ascii_downcase)
== ($name|gsub("\\s+$";"")|ascii_downcase))
| .id' | head -n1)"
fi
[[ -n "$INSTANCE_ID" ]] || { echo "instanceId取得失敗。/tmp/indigo_create.json を確認してください"; exit 1; }
echo "INSTANCE_ID=$INSTANCE_ID"
sleep 30
############################################
# 2) 起動 → 3) IP取得
############################################
echo "== Start instance (statusupdate) =="
api_post_json "${INDIGO_API_BASE}/vm/instance/statusupdate" \
"$(jq -n --arg id "$INSTANCE_ID" '{instanceId:$id,status:"start"}')" "$TOKEN" >/dev/null
echo "== Wait for IP (getinstancelist) =="
IP=""
sleep 120
for _ in $(seq 1 120); do #沢山APIを叩くと回数制限に引っ掛かるのでLoop回数を制限するsleep5→40
RESP="$(api_get "${INDIGO_API_BASE}/vm/getinstancelist" "$TOKEN" || echo "[]")"
IP="$(echo "$RESP" | jq -r --arg id "$INSTANCE_ID" '
if type=="array" then
.[] | select((.id|tostring)==$id and .instancestatus=="Running") | (.ip // .ipaddress // empty)
else
empty
end
' | head -n1)"
[[ -n "$IP" ]] && break
sleep 40
done
[[ -n "${IP:-}" ]] || { echo "IP取得失敗"; echo "$RESP" | head -c 400; exit 1; }
echo "IP=$IP"
# 既存 known_hosts の該当IP鍵を掃除(手動SSHの衝突を避ける)
ssh-keygen -R "$IP" >/dev/null 2>&1 || true
ssh-keygen -R "[$IP]:22" >/dev/null 2>&1 || true
if [[ -f "$HOME/.ssh/known_hosts" ]]; then
grep -v -F "$IP" "$HOME/.ssh/known_hosts" > "$HOME/.ssh/known_hosts.tmp" 2>/dev/null || true
mv "$HOME/.ssh/known_hosts.tmp" "$HOME/.ssh/known_hosts" 2>/dev/null || true
fi
############################################
# 4) NoCloud seed + user-data 生成(公開鍵を埋め込む)
############################################
echo "== Prepare user-data with your public key =="
PUBKEY_FILE="${SSH_PRIVATE_KEY_PATH}.pub"
if [[ -f "$PUBKEY_FILE" ]]; then
PUBKEY="$(cat "$PUBKEY_FILE")"
else
PUBKEY="$(ssh-keygen -y -f "$SSH_PRIVATE_KEY_PATH")"
fi
USERDATA="$(mktemp)"
cat >"$USERDATA" <<YAML
#cloud-config
package_update: true
package_upgrade: false
timezone: Asia/Tokyo
ssh_authorized_keys:
- ${PUBKEY}
packages: [curl, jq]
runcmd:
- [ bash, -lc, 'curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644 --disable traefik" sh -' ]
- [ bash, -lc, 'sleep 15' ]
- [ bash, -lc, 'kubectl get nodes -o wide' ]
# Knative Serving (CRDs/Core)
- [ bash, -lc, 'KN_VER="'"$KNATIVE_VERSION"'"; kubectl apply -f https://github.com/knative/serving/releases/download/\${KN_VER}/serving-crds.yaml; kubectl apply -f https://github.com/knative/serving/releases/download/\${KN_VER}/serving-core.yaml' ]
# Kourier
- [ bash, -lc, 'KN_VER="'"$KNATIVE_VERSION"'"; kubectl apply -f https://github.com/knative/net-kourier/releases/download/\${KN_VER}/kourier.yaml' ]
- [ bash, -lc, 'kubectl -n knative-serving get cm config-network -o json | jq '\''.data["ingress-class"]="kourier.ingress.networking.knative.dev"'\'' | kubectl apply -f -' ]
# Magic DNS (sslip.io)
- [ bash, -lc, 'KN_VER="'"$KNATIVE_VERSION"'"; kubectl apply -f https://github.com/knative/serving/releases/download/\${KN_VER}/serving-default-domain.yaml' ]
# 待機とサンプル
- [ bash, -lc, 'kubectl -n knative-serving wait deploy --all --for=condition=Available --timeout=600s' ]
- [ bash, -lc, 'kubectl -n kourier-system get svc kourier -o wide' ]
- [ bash, -lc, 'kubectl create ns demo || true' ]
- [ bash, -lc, 'cat <<EOF | kubectl -n demo apply -f -
apiVersion: serving.knative.dev/v1
kind: Service
metadata: { name: hello }
spec:
template:
spec:
containers:
- image: ghcr.io/knative/helloworld-go:latest
env: [{ name: TARGET, value: "World" }]
EOF' ]
- [ bash, -lc, 'kubectl -n demo wait ksvc/hello --for=condition=Ready --timeout=600s || true' ]
final_message: "Knative on k3s provisioned via cloud-init."
YAML
############################################
# 5) seed 配置 → 再起動(ブート時に cloud-init 実行)
############################################
echo "== Wait for initial SSH availability =="
SSH_READY=0
for i in $(seq 1 180); do
if ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-o BatchMode=yes -o ConnectTimeout=5 \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" 'true' 2>/dev/null; then
SSH_READY=1
echo "SSH is reachable."
break
fi
sleep 5
done
if [[ $SSH_READY -ne 1 ]]; then
echo "SSHが開かないままタイムアウト(${IP}:22)。VMのsshd初期化が遅延しています。"
echo "数分おいて再実行するか、Indigoのstatusupdate(stop→start)でリトライしてください。"
exit 1
fi
echo "== Push seed & reboot =="
scp -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-i "$SSH_PRIVATE_KEY_PATH" "$USERDATA" "${SSH_USER}@${IP}:/tmp/user-data.kn.yaml"
rm -f "$USERDATA"
ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" 'sudo bash -s' <<'EOS'
set -euo pipefail
sudo tee /etc/cloud/cloud.cfg.d/90_nocloud_seed.cfg >/dev/null <<'EOF'
datasource_list: [ NoCloud ]
datasource:
NoCloud:
seedfrom: /var/lib/cloud/seed/nocloud-net/
EOF
sudo mkdir -p /var/lib/cloud/seed/nocloud-net
sudo tee /var/lib/cloud/seed/nocloud-net/meta-data >/dev/null <<EOF
instance-id: iid-$(uuidgen)
local-hostname: $HOSTNAME
EOF
sudo mv /tmp/user-data.kn.yaml /var/lib/cloud/seed/nocloud-net/user-data
sudo cloud-init clean || true
sudo systemctl reboot
EOS
echo "== Reboot issued. Waiting for SSH to come back =="
SSH_BACK=0
for _ in $(seq 1 120); do
if ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-o ConnectTimeout=5 \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" 'true' 2>/dev/null; then
SSH_BACK=1; echo "SSH is back."; break
fi
sleep 5
done
if [[ $SSH_BACK -eq 0 ]]; then
echo "SSH復帰待ちタイムアウト"; exit 1
fi
############################################
# 6) cloud-init 完了待ち & 動作確認(リトライ式)
############################################
echo "== Wait for cloud-init to finish (robust) =="
deadline=$((SECONDS + 1800)) # 30分
finished=0
while (( SECONDS < deadline )); do
if ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-o ConnectTimeout=5 \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" \
'sudo cloud-init status 2>/dev/null | grep -q "status: done" && test -f /var/lib/cloud/instance/boot-finished'; then
echo "cloud-init finished."
finished=1; break
fi
sleep 10
done
# ---- フォールバック: kubectl が無ければ k3s+Knative をSSH経由で導入 ----
echo "== Ensure k3s + Knative present (fallback) =="
echo "== Ensure k3s + Knative present (fallback) =="
# 鍵の存在チェック(@ 誤展開対策)
if [[ ! -f "$SSH_PRIVATE_KEY_PATH" ]]; then
echo "ERROR: SSH_PRIVATE_KEY_PATH='$SSH_PRIVATE_KEY_PATH' が見つかりません"; exit 1
fi
# リモートで実行する内容を一時ファイルに作成
REMOTE_SCRIPT="$(mktemp)"
cat >"$REMOTE_SCRIPT" <<'RS'
#!/usr/bin/env bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
# 1) k3s が無ければ導入
if ! command -v kubectl >/dev/null 2>&1; then
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644 --disable traefik" sh -
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
fi
# 2) Knative + Kourier
KN_VER="__KN_VER_PLACEHOLDER__"
kubectl apply -f https://github.com/knative/serving/releases/download/${KN_VER}/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/${KN_VER}/serving-core.yaml
kubectl apply -f https://github.com/knative/net-kourier/releases/download/${KN_VER}/kourier.yaml
# 3) Kourier を ingress に指定(get→jq→apply で確実)
command -v jq >/dev/null 2>&1 || { sudo apt-get update -y && sudo apt-get install -y jq; }
kubectl -n knative-serving get cm config-network -o json \
| jq '.data["ingress-class"]="kourier.ingress.networking.knative.dev"' \
| kubectl apply -f -
# 4) デフォルトドメイン(sslip.io) & 待機
kubectl apply -f https://github.com/knative/serving/releases/download/${KN_VER}/serving-default-domain.yaml
kubectl -n knative-serving wait deploy --all --for=condition=Available --timeout=600s || true
kubectl -n kourier-system wait deploy --all --for=condition=Available --timeout=600s || true
# 5) サンプル(存在しなければ作成)
kubectl create ns demo 2>/dev/null || true
kubectl -n demo get ksvc hello >/dev/null 2>&1 || cat <<'YAML' | kubectl -n demo apply -f -
apiVersion: serving.knative.dev/v1
kind: Service
metadata: { name: hello }
spec:
template:
spec:
containers:
- image: ghcr.io/knative/helloworld-go:latest
env: [{ name: TARGET, value: "World" }]
YAML
# 6) 確認
kubectl -n demo wait ksvc/hello --for=condition=Ready --timeout=600s || true
kubectl get nodes -o wide
kubectl -n knative-serving get pods
kubectl -n demo get ksvc hello -o wide
RS
# KN_VER を埋め込み
sed -i.bak "s/__KN_VER_PLACEHOLDER__/${KNATIVE_VERSION}/g" "$REMOTE_SCRIPT"
# 配布→実行
scp -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-i "$SSH_PRIVATE_KEY_PATH" "$REMOTE_SCRIPT" "${SSH_USER}@${IP}:/tmp/post_knative.sh"
rm -f "$REMOTE_SCRIPT"
ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" 'sudo bash /tmp/post_knative.sh'
echo "== Verify =="
ssh -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o PreferredAuthentications=publickey \
-o PasswordAuthentication=no -o IdentitiesOnly=yes \
-i "$SSH_PRIVATE_KEY_PATH" "${SSH_USER}@${IP}" \
'bash -lc "kubectl get nodes -o wide; echo; kubectl -n knative-serving get pods; echo; kubectl -n demo get ksvc hello -o wide"'
echo
echo "=== 完了 ==="
echo "INSTANCE_ID=${INSTANCE_ID}"
echo "IP=${IP}"
echo "ログイン例: ssh -i '"$SSH_PRIVATE_KEY_PATH"' '"$SSH_USER"'@'"$IP"' -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
まとめ
-
3変数(
INDIGO_CLIENT_ID,INDIGO_CLIENT_SECRET,SSH_PRIVATE_KEY_PATH)をセット - スクリプトを実行 → k3s + Knative が自動構築
-
kubectl get ksvc -n demo hello -o jsonpath='{.status.url}'の URL またはブラウザアクセスで “Hello Knative!” を確認
免責
- 認証情報の取り扱いは自己責任でお願いします。公開・共有後は再発行を推奨します。
- Indigo APIやイメージの仕様変更により動作が変わる可能性があります。最新のドキュメントを併せてご確認ください。