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"
}
}Crear un grupo de instancias
Cree un grupo a partir de una plantilla de lanzamiento y un recuento deseado. Las instancias de desired_count se generan de forma sincrónica; un conciliador de fondo converge member_count hacia desired_count a medida que cambia. En crear solamente, min_count/max_count por defecto a desired_count.
Las tags de nivel superior etiquetan el pool en sí; template.tags se imprimen en cada instancia que se lanza.
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 permisos de computación para obtener la lista completa, lo que cubre cada una y un ejemplo de directiva.Autorizaciones
Un token bearer de OAuth 2.0, enviado como Authorization: Bearer <token>. Esta es la forma recomendada de autenticación.
Obtén el token intercambiando el par de claves de acceso de una cuenta de servicio en POST /v1/oauth/token con grant_type=client_credentials. Es el flujo estándar de credenciales de cliente; las bibliotecas compatibles con OAuth pueden obtener y renovar el token por ti.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Los tokens duran una hora por defecto. El mismo par de claves de acceso también sirve como credencial AWS SigV4 para el endpoint de objetos compatible con S3, que solo acepta ese método de autenticación.
Encabezados
Clave opcional generada por el cliente que hace que una creación sea segura para la reproducción. Al volver a intentar una solicitud con la misma clave, se devuelve el resultado original literalmente en lugar de crear un recurso duplicado. Se rechaza la reutilización de una clave con un cuerpo de solicitud diferente (422); una solicitud cuya clave todavía se está procesando devuelve 409. Los registros se mantienen durante 24 horas. Usa un UUID o un token único similar.
255Cuerpo
template es la configuración de lanzamiento — los mismos campos que toma la instancia create. Los campos propios del grupo (descripción, etiquetas, tamaño) permanecen en el nivel superior, porque describen el grupo en lugar de las instancias en él. Se requiere un flavor y una subred primaria, como template.flavor + template.networks[0].subnet. En crear solamente, omitió min_count y max_count por defecto a desired_count.
Los nombres de los recursos no deben comenzar con el prefijo literal crn: ni ser UUID (en cualquier caso, en las formas canónica, compacta, entre corchetes o urn:uuid:).
"web-asg"
La configuración de inicio del grupo, en la forma que toma la creación de una instancia independiente: los mismos nombres de campo, los mismos tipos, los mismos significados, de modo que un cliente que puede crear una instancia puede crear un grupo de ellos sin un segundo contrato más estrecho para aprender. Pertenece a la agrupación. No hay un recurso de plantilla de lanzamiento separado para crear, crear versiones o compartir entre grupos. Networking es una lista ordenada de networks, siendo el índice 0 la NIC primaria. ip_address y mac son parte de esa forma de NIC compartida pero son rechazados aquí: cada réplica se inicia desde esta plantilla, por lo que una dirección fija haría que la segunda réplica pida una que la primera ya tenga.
Show child attributes
Show child attributes
Seguimiento de objetivos compartido por grupos de instancias y balanceadores de carga. Las actualizaciones reemplazan la política. Establezca enabled=false para conservar la configuración y usar el dimensionamiento manual. Cada métrica recomienda un recuento deseado; la recomendación más grande gana. Las observaciones faltantes, obsoletas o incompletas impiden la escalada interna, pero no bloquean la escalada externa recomendada por otra métrica válida. Las decisiones obedecen a los valores min_count/max_count, calentamiento, enfriamiento, estabilización, límites de pasos y cuotas del recurso. El estado sobrevive al reinicio del controlador. Las políticas activas poseen desired_count; se aceptan los cambios manuales y la evaluación automática se reanuda después del tiempo de reutilización. La telemetría personalizada requiere telemetry:ReadMetrics en la misma cuenta.
Show child attributes
Show child attributes
Etiquetas en el recurso de grupo, para las condiciones de IAM (basalt:RequestTag/<key> aquí, basalt:ResourceTag/<key> en operaciones posteriores) y atribución de costos. No se propagan a las instancias que el pool lanza; template.tags es ese conjunto. Un campo de pool, enviado junto a template. Las etiquetas de réplica solo son accesibles a través de template.tags.
Show child attributes
Show child attributes
{
"environment": "production",
"team": "backend"
}
0 <= x <= 1002
0 <= x <= 1001
Un valor de 0 significa que el grupo no tiene miembros hasta que se aumente max_count.
0 <= x <= 1003
Respuesta
Se creó el grupo; se generaron las instancias iniciales.
Una plantilla de lanzamiento más un recuento deseado. La creación de un grupo genera instancias de desired_count; un conciliador converge member_count hacia desired_count a medida que cambia. member_count es el número de miembros que tiene el grupo; live_count es el número de ellos que se están ejecutando. Un grupo lleva dos conjuntos de etiquetas y responden a diferentes preguntas. tags etiqueta el recurso de la agrupación, que es lo que una condición de IAM lee como basalt:ResourceTag/<key> y lo que un informe de costos agrupa, y no llega a ninguna instancia. template.tags es el conjunto estampado en cada réplica que lanza el pool.
Show child attributes
Show child attributes

