curl --request POST \
--url https://compute.{region}.basaltic.sh/v1/instance-pools \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "web-asg",
"template": {
"flavor": "<string>",
"networks": [
{
"subnet": "9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60",
"mac": "02:1a:2b:3c:4d:5e",
"security_groups": [
"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"
],
"floating_ip_assignment": "none",
"addresses": [
{
"address": "<string>"
}
]
}
],
"architecture": "amd64",
"image": "<string>",
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": "<string>",
"volumes": [
{
"size_gb": 20,
"boot": false,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": true
}
]
},
"description": "<string>",
"tags": {
"environment": "production",
"team": "backend"
},
"desired_count": 2,
"min_count": 1,
"max_count": 3
}
'import requests
url = "https://compute.{region}.basaltic.sh/v1/instance-pools"
payload = {
"name": "web-asg",
"template": {
"flavor": "<string>",
"networks": [
{
"subnet": "9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60",
"mac": "02:1a:2b:3c:4d:5e",
"security_groups": ["c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"],
"floating_ip_assignment": "none",
"addresses": [{ "address": "<string>" }]
}
],
"architecture": "amd64",
"image": "<string>",
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": "<string>",
"volumes": [
{
"size_gb": 20,
"boot": False,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": True
}
]
},
"description": "<string>",
"tags": {
"environment": "production",
"team": "backend"
},
"desired_count": 2,
"min_count": 1,
"max_count": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'web-asg',
template: {
flavor: '<string>',
networks: [
{
subnet: '9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60',
mac: '02:1a:2b:3c:4d:5e',
security_groups: ['c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f'],
floating_ip_assignment: 'none',
addresses: [{address: '<string>'}]
}
],
architecture: 'amd64',
image: '<string>',
user_data: 'aSDinaTvuI8gbWludGxpZnk=',
metadata: {environment: 'production', team: 'backend'},
tags: {environment: 'production', team: 'backend'},
iam_role: '<string>',
volumes: [
{
size_gb: 20,
boot: false,
volume_type: 'nvme',
performance: {iops: 6000, throughput_mib_s: 250},
mount_path: '/data',
fstype: 'ext4',
delete_on_termination: true
}
]
},
description: '<string>',
tags: {environment: 'production', team: 'backend'},
desired_count: 2,
min_count: 1,
max_count: 3
})
};
fetch('https://compute.{region}.basaltic.sh/v1/instance-pools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://compute.{region}.basaltic.sh/v1/instance-pools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'web-asg',
'template' => [
'flavor' => '<string>',
'networks' => [
[
'subnet' => '9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60',
'mac' => '02:1a:2b:3c:4d:5e',
'security_groups' => [
'c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f'
],
'floating_ip_assignment' => 'none',
'addresses' => [
[
'address' => '<string>'
]
]
]
],
'architecture' => 'amd64',
'image' => '<string>',
'user_data' => 'aSDinaTvuI8gbWludGxpZnk=',
'metadata' => [
'environment' => 'production',
'team' => 'backend'
],
'tags' => [
'environment' => 'production',
'team' => 'backend'
],
'iam_role' => '<string>',
'volumes' => [
[
'size_gb' => 20,
'boot' => false,
'volume_type' => 'nvme',
'performance' => [
'iops' => 6000,
'throughput_mib_s' => 250
],
'mount_path' => '/data',
'fstype' => 'ext4',
'delete_on_termination' => true
]
]
],
'description' => '<string>',
'tags' => [
'environment' => 'production',
'team' => 'backend'
],
'desired_count' => 2,
'min_count' => 1,
'max_count' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://compute.{region}.basaltic.sh/v1/instance-pools"
payload := strings.NewReader("{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://compute.{region}.basaltic.sh/v1/instance-pools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.{region}.basaltic.sh/v1/instance-pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}"
response = http.request(request)
puts response.read_body{
"instance_pool": {
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"autoscaling": {
"enabled": true,
"metrics": [
{
"source": "telemetry",
"target_type": "average_value",
"target_value": 100,
"name": "queue_depth",
"labels": {
"queue": "orders"
},
"sample_aggregation": "last",
"series_aggregation": "sum",
"expected_series": 1,
"window_seconds": 120,
"max_age_seconds": 90
}
],
"warmup_seconds": 180,
"cooldown_seconds": 60,
"scale_down_stabilization_seconds": 300,
"max_scale_out_step": 4,
"max_scale_in_step": 1,
"drain_seconds": 120
},
"autoscaling_status": {
"status": "pending",
"reason": "waiting for sustained lower demand",
"history": [
{
"at": "2023-11-07T05:31:56Z",
"from": 1,
"to": 1,
"reason": "<string>"
}
],
"evaluated_at": "2023-11-07T05:31:56Z",
"last_scaled_at": "2023-11-07T05:31:56Z"
},
"rollout_surge": true,
"retiring_instances": [
{
"requested_at": "2023-11-07T05:31:56Z",
"drain_seconds": 1815,
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_acknowledged_at": "2023-11-07T05:31:56Z",
"drain_until": "2023-11-07T05:31:56Z"
}
],
"id": "8f2a1c3d-4e5b-4a6f-9c0d-1e2f3a4b5c6d",
"crn": "crn:compute:sa-saopaulo-1:my-account:instance-pool/web-pool",
"name": "web-asg",
"description": "Front-end autoscaling group",
"desired_count": 2,
"min_count": 1,
"max_count": 3,
"live_count": 2,
"member_count": 2,
"refresh_in_progress": false,
"stale_instance_count": 0,
"status": "active",
"managed_by": "customer",
"tags": {
"environment": "production",
"team": "backend"
},
"template": {
"flavor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"image_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"networks": [
{
"subnet": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/prod-web",
"vpc": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod",
"name": "prod",
"cidr_ipv4": "10.0.0.0/16",
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "Production VPC for web and app tiers",
"cidr_ipv6": "2a13:9500:1a6:100::/60"
},
"route_table": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/route-table/prod-private-rt",
"name": "prod-private-rt"
},
"name": "prod-web",
"cidr_ipv4": "10.0.1.0/24",
"gateway_ipv4": "10.0.1.1",
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "Public web-tier subnet",
"cidr_ipv6": "2a13:9500:1a6:100::/64",
"gateway_ipv6": "2a13:9500:1a6:100::1"
},
"mac": "02:1a:2b:3c:4d:5e",
"security_group_ids": [
"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"
],
"floating_ip_assignment": "none",
"addresses": [
{
"family": "ipv4",
"address": "<string>"
}
]
}
],
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": {
"id": "b2c3d4e5-f6a7-8901-2345-67890abcdef1",
"crn": "crn:iam::my-account:role/deploy",
"name": "deploy"
},
"volumes": [
{
"size_gb": 20,
"boot": false,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": true
}
]
}
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "CONFLICT",
"message": "Resource with this name already exists",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Criar um pool de instâncias
Crie um pool a partir de um modelo de lançamento e uma contagem desejada. As instâncias desired_count são geradas de forma síncrona; um reconciliador de segundo plano então converge member_count para desired_count conforme ele é alterado. No momento da criação, min_count/max_count padrão é desired_count.
As tags de nível superior rotulam o pool em si; template.tags são estampas em cada instância que ele inicia.
curl --request POST \
--url https://compute.{region}.basaltic.sh/v1/instance-pools \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "web-asg",
"template": {
"flavor": "<string>",
"networks": [
{
"subnet": "9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60",
"mac": "02:1a:2b:3c:4d:5e",
"security_groups": [
"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"
],
"floating_ip_assignment": "none",
"addresses": [
{
"address": "<string>"
}
]
}
],
"architecture": "amd64",
"image": "<string>",
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": "<string>",
"volumes": [
{
"size_gb": 20,
"boot": false,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": true
}
]
},
"description": "<string>",
"tags": {
"environment": "production",
"team": "backend"
},
"desired_count": 2,
"min_count": 1,
"max_count": 3
}
'import requests
url = "https://compute.{region}.basaltic.sh/v1/instance-pools"
payload = {
"name": "web-asg",
"template": {
"flavor": "<string>",
"networks": [
{
"subnet": "9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60",
"mac": "02:1a:2b:3c:4d:5e",
"security_groups": ["c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"],
"floating_ip_assignment": "none",
"addresses": [{ "address": "<string>" }]
}
],
"architecture": "amd64",
"image": "<string>",
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": "<string>",
"volumes": [
{
"size_gb": 20,
"boot": False,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": True
}
]
},
"description": "<string>",
"tags": {
"environment": "production",
"team": "backend"
},
"desired_count": 2,
"min_count": 1,
"max_count": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'web-asg',
template: {
flavor: '<string>',
networks: [
{
subnet: '9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60',
mac: '02:1a:2b:3c:4d:5e',
security_groups: ['c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f'],
floating_ip_assignment: 'none',
addresses: [{address: '<string>'}]
}
],
architecture: 'amd64',
image: '<string>',
user_data: 'aSDinaTvuI8gbWludGxpZnk=',
metadata: {environment: 'production', team: 'backend'},
tags: {environment: 'production', team: 'backend'},
iam_role: '<string>',
volumes: [
{
size_gb: 20,
boot: false,
volume_type: 'nvme',
performance: {iops: 6000, throughput_mib_s: 250},
mount_path: '/data',
fstype: 'ext4',
delete_on_termination: true
}
]
},
description: '<string>',
tags: {environment: 'production', team: 'backend'},
desired_count: 2,
min_count: 1,
max_count: 3
})
};
fetch('https://compute.{region}.basaltic.sh/v1/instance-pools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://compute.{region}.basaltic.sh/v1/instance-pools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'web-asg',
'template' => [
'flavor' => '<string>',
'networks' => [
[
'subnet' => '9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60',
'mac' => '02:1a:2b:3c:4d:5e',
'security_groups' => [
'c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f'
],
'floating_ip_assignment' => 'none',
'addresses' => [
[
'address' => '<string>'
]
]
]
],
'architecture' => 'amd64',
'image' => '<string>',
'user_data' => 'aSDinaTvuI8gbWludGxpZnk=',
'metadata' => [
'environment' => 'production',
'team' => 'backend'
],
'tags' => [
'environment' => 'production',
'team' => 'backend'
],
'iam_role' => '<string>',
'volumes' => [
[
'size_gb' => 20,
'boot' => false,
'volume_type' => 'nvme',
'performance' => [
'iops' => 6000,
'throughput_mib_s' => 250
],
'mount_path' => '/data',
'fstype' => 'ext4',
'delete_on_termination' => true
]
]
],
'description' => '<string>',
'tags' => [
'environment' => 'production',
'team' => 'backend'
],
'desired_count' => 2,
'min_count' => 1,
'max_count' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://compute.{region}.basaltic.sh/v1/instance-pools"
payload := strings.NewReader("{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://compute.{region}.basaltic.sh/v1/instance-pools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.{region}.basaltic.sh/v1/instance-pools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"web-asg\",\n \"template\": {\n \"flavor\": \"<string>\",\n \"networks\": [\n {\n \"subnet\": \"9b2e4f1a-3c5d-4e6f-8a90-1b2c3d4e5f60\",\n \"mac\": \"02:1a:2b:3c:4d:5e\",\n \"security_groups\": [\n \"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f\"\n ],\n \"floating_ip_assignment\": \"none\",\n \"addresses\": [\n {\n \"address\": \"<string>\"\n }\n ]\n }\n ],\n \"architecture\": \"amd64\",\n \"image\": \"<string>\",\n \"user_data\": \"aSDinaTvuI8gbWludGxpZnk=\",\n \"metadata\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"iam_role\": \"<string>\",\n \"volumes\": [\n {\n \"size_gb\": 20,\n \"boot\": false,\n \"volume_type\": \"nvme\",\n \"performance\": {\n \"iops\": 6000,\n \"throughput_mib_s\": 250\n },\n \"mount_path\": \"/data\",\n \"fstype\": \"ext4\",\n \"delete_on_termination\": true\n }\n ]\n },\n \"description\": \"<string>\",\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n },\n \"desired_count\": 2,\n \"min_count\": 1,\n \"max_count\": 3\n}"
response = http.request(request)
puts response.read_body{
"instance_pool": {
"faults": [
{
"code": "BACKUP_FAILED",
"severity": "error",
"message": "Backup upload failed.",
"details": {},
"first_at": "2023-11-07T05:31:56Z",
"last_at": "2023-11-07T05:31:56Z",
"occurrences": 1
}
],
"autoscaling": {
"enabled": true,
"metrics": [
{
"source": "telemetry",
"target_type": "average_value",
"target_value": 100,
"name": "queue_depth",
"labels": {
"queue": "orders"
},
"sample_aggregation": "last",
"series_aggregation": "sum",
"expected_series": 1,
"window_seconds": 120,
"max_age_seconds": 90
}
],
"warmup_seconds": 180,
"cooldown_seconds": 60,
"scale_down_stabilization_seconds": 300,
"max_scale_out_step": 4,
"max_scale_in_step": 1,
"drain_seconds": 120
},
"autoscaling_status": {
"status": "pending",
"reason": "waiting for sustained lower demand",
"history": [
{
"at": "2023-11-07T05:31:56Z",
"from": 1,
"to": 1,
"reason": "<string>"
}
],
"evaluated_at": "2023-11-07T05:31:56Z",
"last_scaled_at": "2023-11-07T05:31:56Z"
},
"rollout_surge": true,
"retiring_instances": [
{
"requested_at": "2023-11-07T05:31:56Z",
"drain_seconds": 1815,
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_acknowledged_at": "2023-11-07T05:31:56Z",
"drain_until": "2023-11-07T05:31:56Z"
}
],
"id": "8f2a1c3d-4e5b-4a6f-9c0d-1e2f3a4b5c6d",
"crn": "crn:compute:sa-saopaulo-1:my-account:instance-pool/web-pool",
"name": "web-asg",
"description": "Front-end autoscaling group",
"desired_count": 2,
"min_count": 1,
"max_count": 3,
"live_count": 2,
"member_count": 2,
"refresh_in_progress": false,
"stale_instance_count": 0,
"status": "active",
"managed_by": "customer",
"tags": {
"environment": "production",
"team": "backend"
},
"template": {
"flavor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"image_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"networks": [
{
"subnet": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/subnet/prod-web",
"vpc": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod",
"name": "prod",
"cidr_ipv4": "10.0.0.0/16",
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "Production VPC for web and app tiers",
"cidr_ipv6": "2a13:9500:1a6:100::/60"
},
"route_table": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"crn": "crn:network:sa-saopaulo-1:my-account:vpc/prod/route-table/prod-private-rt",
"name": "prod-private-rt"
},
"name": "prod-web",
"cidr_ipv4": "10.0.1.0/24",
"gateway_ipv4": "10.0.1.1",
"tags": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"description": "Public web-tier subnet",
"cidr_ipv6": "2a13:9500:1a6:100::/64",
"gateway_ipv6": "2a13:9500:1a6:100::1"
},
"mac": "02:1a:2b:3c:4d:5e",
"security_group_ids": [
"c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f"
],
"floating_ip_assignment": "none",
"addresses": [
{
"family": "ipv4",
"address": "<string>"
}
]
}
],
"user_data": "aSDinaTvuI8gbWludGxpZnk=",
"metadata": {
"environment": "production",
"team": "backend"
},
"tags": {
"environment": "production",
"team": "backend"
},
"iam_role": {
"id": "b2c3d4e5-f6a7-8901-2345-67890abcdef1",
"crn": "crn:iam::my-account:role/deploy",
"name": "deploy"
},
"volumes": [
{
"size_gb": 20,
"boot": false,
"volume_type": "nvme",
"performance": {
"iops": 6000,
"throughput_mib_s": 250
},
"mount_path": "/data",
"fstype": "ext4",
"delete_on_termination": true
}
]
}
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "CONFLICT",
"message": "Resource with this name already exists",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}compute:CreateInstancePool. Consulte permissões de computação para obter a lista completa, o que cada uma abrange e um exemplo de política.Autorizações
Um token bearer OAuth 2.0, enviado como Authorization: Bearer <token>. Esta é a forma recomendada de autenticação.
Obtenha o token trocando o par de chaves de acesso de uma conta de serviço em POST /v1/oauth/token com grant_type=client_credentials. Esse é o fluxo padrão de credenciais de cliente; bibliotecas compatíveis com OAuth podem obter e renovar o token para você.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Os tokens duram uma hora por padrão. O mesmo par de chaves de acesso também serve como credencial AWS SigV4 para o endpoint de objetos compatível com S3, que aceita somente esse método de autenticação.
Cabeçalhos
Chave opcional gerada pelo cliente que torna uma criação segura para reprodução. A reintentar uma solicitação com a mesma chave retorna o resultado original literalmente em vez de criar um recurso duplicado. A reutilização de uma chave com um corpo de solicitação diferente é rejeitada (422); uma solicitação cuja chave ainda está sendo processada retorna 409. Os registros são honrados por 24 horas. Use um UUID ou token exclusivo semelhante.
255Corpo
template é a configuração de lançamento — os mesmos campos que a instância create toma. Os próprios campos do pool — descrição, tags, dimensionamento — permanecem no nível superior, porque descrevem o pool e não as instâncias nele. Um flavor e uma sub-rede primária são necessários, como template.flavor + template.networks[0].subnet. Em criar somente, omitido min_count e max_count padrão para desired_count.
Os nomes de recursos não devem começar com o prefixo literal crn: ou ser UUIDs (formas canônicas, compactas, entre colchetes ou urn:uuid:, em qualquer caso).
"web-asg"
A configuração de lançamento do pool, na forma que uma instância autônoma cria: mesmos nomes de campo, mesmos tipos, mesmos significados, para que um cliente que possa criar uma instância possa criar um pool deles sem um segundo contrato mais estreito para aprender. Pertence à pool. Não há um recurso de modelo de lançamento separado para criar, versão ou compartilhar entre pools. Networking é uma lista ordenada de networks, sendo o índice 0 a NIC primária. ip_address e mac são parte daquela forma de NIC compartilhada, mas são recusadas aqui: cada réplica é iniciada a partir deste modelo, então um endereço fixo faria com que a segunda réplica perguntasse por um que a primeira já possui.
Show child attributes
Show child attributes
Rastreamento de destino compartilhado por pools de instâncias e balanceadores de carga. As atualizações substituem a política. Defina enabled=false para manter as configurações e usar o dimensionamento manual. Cada métrica recomenda uma contagem desejada; a maior recomendação vence. Observações ausentes, obsoletas ou incompletas impedem o dimensionamento, mas não bloqueiam o dimensionamento recomendado por outra métrica válida. As decisões obedecem aos recursos min_count/max_count, warmup, cooldown, estabilização, limites de passo e cotas. O estado sobrevive às reinicializações do controlador. As políticas ativas possuem desired_count; as alterações manuais são aceitas e a avaliação automática é retomada após o tempo de espera. A telemetria personalizada requer telemetria:ReadMetrics na mesma conta.
Show child attributes
Show child attributes
Rótulos no recurso de pool, para condições do IAM (basalt:RequestTag/<key> aqui, basalt:ResourceTag/<key> em operações posteriores) e atribuição de custo. Eles não são propagados para as instâncias que o pool lança; template.tags é esse conjunto. Um campo de pool, enviado ao lado de template. As tags de réplica só são acessíveis através de template.tags.
Show child attributes
Show child attributes
{
"environment": "production",
"team": "backend"
}
0 <= x <= 1002
0 <= x <= 1001
Um valor de 0 significa que o pool não possui membros até que max_count seja aumentado.
0 <= x <= 1003
Resposta
Pool criado; instâncias iniciais geradas.
Um modelo de lançamento mais uma contagem desejada. A criação de um pool gera instâncias de desired_count; um reconciliador converge member_count para desired_count à medida que ele muda. member_count é quantos membros o pool tem; live_count é quantos deles estão em execução. Um pool carrega dois conjuntos de tags e eles respondem a perguntas diferentes. tags rotula o recurso do pool — é o que uma condição do IAM lê como basalt:ResourceTag/<key> e o que um relatório de custo agrupa, e não atinge nenhuma instância. template.tags é o conjunto estampado em cada réplica que o pool lança.
Show child attributes
Show child attributes

