リースを取得し、もう一度解放する
coordination.leaseでリソースの排他リースを取得し、誰が保持しているかを確認し、終わったら手放します。
coordination.lease
coordination.leaseでリソースの排他リースを取得し、誰が保持しているかを確認し、終わったら手放します。
coordination.lease2つのエージェントが同時に本番へデプロイしてはいけません。そこでリソースにリースを設定します。最初のエージェントが保持し、2つ目は拒否され、誰が保持していて、どのくらい待つべきかが伝えられます。解放されないリースは、自動的に失効します。
コードはキーをINTRAMEDIAL_KEYから読み取ります。キーはシェルやシークレットストアに保管し、コミットするファイルには入れないでください。サインインした人が必要な呼び出しにはキーを使えず、コンソールが実行します。
リソースを欲しいエージェントとして要求します。空いているリソースには、有効期限付きのリースが返されます。
空いているリソースには{ ok: true, lease }が返ります。リースにはID、保持者、有効期限が含まれます。
{
"ok": true,
"lease": {
"id": "lease_4c1e",
"resource": "lock:deploy/production",
"holder": "did:web:acme.example:agent:release",
"expiresAtMs": ,
: { : , : [] },
: ,
: {}
}
}lease_heldで拒否されました。coordination.leasecoordination-leasecurl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())同じリソースを要求した2つ目のエージェントは、lease_held、保持者のDID、stampede.waitMsのバックオフ付きで拒否されます。すべてのリースは既定の30,000 msで、ルートはttlMsを読み取りません。
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:cost",
}),
});
const body = await res.json();
if (!body.ok) console.log(body.reason, "held by", body.holder, "wait", body.stampede?.waitMs, "ms");import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost",
},
timeout=30,
)
body = res.json()
if not body.get("ok"):
print(body["reason"], "held by", body["holder"], "wait", body["stampede"]["waitMs"], "ms")リソースとエージェントを送ります。releaseはreleasedとreleasedIdsを返します。解放されないリースは失効し、アラームが回収します。
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/release \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/release", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/release",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())転載元の資料: /docs/coordination-lease
台帳は追記専用で、Merkleルートのもとでシールされます。エントリの時刻はIntramedial自身のクロックによるもので、署名付きバンドルは公開鍵を使ってオフラインで確認できます。
保持されているリースを要求し、プレーンが示すバックオフを読み取り、枠が自分のものになるまで再試行します。
coordination.leaseエージェントがリソースに対してこれから行うことを宣言し、プレーンに未解決のクレームと照合させます。
civics.claimsロールのリースを保持し、プレーンを通じてそれを引き受けて短命の認証情報を得て、使用し、リースを解放します。
iam.assumecoordination.leaseレシピ集にレシピを追加したときだけ、短いメールを1通。ほかのメールは送らず、どのメールからも配信停止できます。
アカウントは不要です。attestルートで7日間に35回まで呼び出せ、レシートはテストレシートとして明示されます。続けたくなったら、そのときに登録してください。