要約
DigitalOcean APIは、Droplet、ボリューム、ファイアウォール、ロードバランサー、Kubernetesクラスターなどを管理します。パーソナルアクセストークンで認証し、api.digitalocean.com/v2を呼び出し、レート制限を処理します。テストには、Apidogを使用して設定を検証し、インフラストラクチャのプロビジョニングをテストし、自動化ワークフローを文書化します。
はじめに
DigitalOceanはクラウドコンピューティングを簡素化します。AWSやGCPが数百ものサービスを提供するのに対し、DigitalOceanはコンピューティング(Droplet)、ストレージ(ボリューム)、ネットワーキング(フローティングIP、ファイアウォール)、マネージドKubernetes、アプリプラットフォームといったEssentialな機能に焦点を当てています。APIもこのシンプルさにマッチしています。
開発者はDigitalOceanのAPIを以下の目的で使用します。
- 開発環境の自動的な起動
- Kubernetesクラスターの管理
- TerraformまたはPulumiによるInfrastructure as Code
- CI/CDパイプラインのプロビジョニング
- マルチリージョンデプロイメント
認証
パーソナルアクセストークン
- DigitalOceanダッシュボード → API → 新しいトークンを生成に進む
- トークンに名前を付け、有効期限を設定する
- 安全にコピーして保存する
トークンの使用方法:
curl -X GET "https://api.digitalocean.com/v2/account" \
-H "Authorization: Bearer YOUR_TOKEN"
レスポンス形式
{
"account": {
"droplet_limit": 25,
"email": "you@example.com",
"name": "Your Name",
"uuid": "abc123xyz",
"email_verified": true,
"status": "active"
}
}
Droplet(仮想マシン)
すべてのDropletを一覧表示
curl -X GET "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN"
Dropletを作成
curl -X POST "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-droplet",
"region": "nyc1",
"size": "s-2vcpu-4gb",
"image": "ubuntu-20-04-x64",
"ssh_keys": ["ssh-rsa AAAA..."],
"backups": false,
"ipv6": true,
"tags": ["web", "production"]
}'
一般的なサイズ:
s-1vcpu-1gb- 1 vCPU, 1GB RAM ($5/月)s-2vcpu-2gb- 2 vCPU, 2GB RAM ($10/月)s-2vcpu-4gb- 2 vCPU, 4GB RAM ($20/月)s-4vcpu-8gb- 4 vCPU, 8GB RAM ($40/月)
リージョン:
nyc1,nyc3- ニューヨークsfo3- サンフランシスコams3- アムステルダムsgp1- シンガポール
Dropletの詳細を取得
curl -X GET "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Dropletを削除
curl -X DELETE "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Dropletアクション
再起動:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "reboot"
}'
サイズ変更:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "resize",
"size": "s-4vcpu-8gb"
}'
スナップショット:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "snapshot",
"name": "my-snapshot"
}'
ボリューム(ブロックストレージ)
ボリュームを作成
curl -X POST "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"size_gigabytes": 100,
"name": "my-volume",
"region": "nyc1",
"description": "Data volume for web servers"
}'
Dropletにボリュームをアタッチ
curl -X POST "https://api.digitalocean.com/v2/volumes/VOLUME_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "attach",
"droplet_id": DROPLET_ID
}'
ボリュームを一覧表示
curl -X GET "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN"
ネットワーキング
フローティングIPを一覧表示
curl -X GET "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN"
フローティングIPを割り当て
curl -X POST "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"droplet_id": DROPLET_ID,
"region": "nyc1"
}'
ファイアウォールを作成
curl -X POST "https://api.digitalocean.com/v2/firewalls" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "web-firewall",
"inbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "443",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "22",
"sources": {
"addresses": ["your-ip/32"]
}
}
],
"outbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"destinations": {
"addresses": ["0.0.0.0/0"]
}
}
],
"droplet_ids": [DROPLET_ID]
}'
ロードバランサー
ロードバランサーを作成
curl -X POST "https://api.digitalocean.com/v2/load_balancers" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-lb",
"region": "nyc1",
"algorithm": "round_robin",
"health_check": {
"protocol": "http",
"port": 80,
"path": "/",
"check_interval_seconds": 10,
"response_timeout_seconds": 5,
"healthy_threshold": 3,
"unhealthy_threshold": 3
},
"forwarding_rules": [
{
"entry_protocol": "http",
"entry_port": 80,
"target_protocol": "http",
"target_port": 80
},
{
"entry_protocol": "https",
"entry_port": 443,
"target_protocol": "https",
"target_port": 443,
"tls_passthrough": true
}
],
"droplet_ids": [DROPLET_ID_1, DROPLET_ID_2]
}'
Kubernetesクラスター
Kubernetesクラスターを作成
curl -X POST "https://api.digitalocean.com/v2/kubernetes/clusters" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-cluster",
"region": "nyc1",
"version": "1.28",
"node_pools": [
{
"name": "worker-pool",
"size": "s-2vcpu-4gb",
"count": 3,
"auto_scale": true,
"min_nodes": 2,
"max_nodes": 6
}
]
}'
ノードプールを一覧表示
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools" \
-H "Authorization: Bearer YOUR_TOKEN"
ノードプールをスケール
curl -X PUT "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools/POOL_ID" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"count": 5
}'
クラスターを削除
curl -X DELETE "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Apidogを使ったテスト
インフラストラクチャのプロビジョニングは高価です。リソースを作成する前に徹底的にテストしてください。

1. 環境設定
DIGITALOCEAN_TOKEN: your_token
BASE_URL: https://api.digitalocean.com/v2
DEFAULT_REGION: nyc1
DEFAULT_SIZE: s-2vcpu-4gb
2. レスポンスの検証
pm.test('Droplet created successfully', () => {
const response = pm.response.json()
pm.expect(response.droplet).to.have.property('id')
pm.expect(response.droplet.status).to.eql('new')
})
pm.test('Token is valid', () => {
const response = pm.response.json()
pm.expect(response.account).to.exist
pm.expect(response.account.status).to.eql('active')
})
3. ドライランの概念
DigitalOceanには真のドライランはありませんが、入力の検証は可能です。
const validRegions = ['nyc1', 'sfo3', 'ams3', 'sgp1']
const validSizes = ['s-1vcpu-1gb', 's-2vcpu-2gb', 's-2vcpu-4gb']
pm.test('Region is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validRegions).to.include(requestBody.region)
})
pm.test('Size is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validSizes).to.include(requestBody.size)
})
ApidogでDigitalOceanインフラストラクチャAPIを無料でテストしましょう。
一般的なエラーと修正
401 Unauthorized(認証されていない)
原因: 無効なトークンまたは有効期限切れのトークン。
修正: ダッシュボードからトークンを再生成してください。Authorizationヘッダーの形式を確認してください。
422 Unprocessable Entity(処理できないエンティティ)
原因: 無効なパラメータ(リージョン、サイズ、イメージなどが誤っている)。
修正: DigitalOceanのAPIドキュメントで有効な値を確認してください。一般的な問題:
- リージョンが要求されたサイズをサポートしていない
- イメージIDが存在しない
- Dropletの制限に達している
429 Too Many Requests(リクエストが多すぎる)
原因: レート制限を超過した(デフォルトは2000リクエスト/時)。
修正: バックオフを実装してください:
async function doRequest(url, options, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await fetch(url, options)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
continue
}
return response
}
throw new Error('Rate limited')
}
Dropletの制限に達した
原因: アカウントにDropletが多すぎる。
修正: 未使用のDropletを削除するか、サポートに制限の引き上げをリクエストしてください。
代替サービスと比較
| 機能 | DigitalOcean | AWS | GCP |
|---|---|---|---|
| Dropletサイズ | 固定 | カスタム | カスタム |
| Kubernetes | マネージド DOKS | EKS | GKE |
| オブジェクトストレージ | Spaces | S3 | Cloud Storage |
| ブロックストレージ | Volumes | EBS | Persistent Disk |
| ロードバランサー | 組み込み | ELB | Cloud Load Balancing |
| 無料枠 | $200クレジット | 制限あり | $300クレジット |
| APIのシンプルさ | ★★★★★ | ★★☆☆☆ | ★★★☆☆ |
DigitalOceanはシンプルさで勝ります。APIは分かりやすく、ほとんどの操作は多数のネストされたサービスを扱うことなく機能します。
現実世界のユースケース
開発環境。 スタートアップがブランチごとに隔離された開発環境を作成します。プルリクエストごとにAPI呼び出しがトリガーされ、最新のコードでDropletが作成されます。マージ後、Dropletは破棄されます。開発者は手動設定なしで本番環境に近い環境でテストできます。
オートスケーリングするウェブサーバー。 ウェブアプリケーションが負荷を監視します。CPUが70%を超えると、APIは新しいDropletを作成し、ロードバランサーに追加します。負荷が下がるとDropletは破棄されます。これにより、パフォーマンスを高く保ちながらコストを低く抑えます。
データベースクラスター。 マネージドデータベースサービスは、リージョンをまたいでプライマリとレプリカのボリュームをプロビジョニングします。APIはレプリケーション設定、バックアップスケジュール、フェイルオーバー設定を自動的に処理します。
結論
学んだことは次のとおりです。
- パーソナルアクセストークンによる認証
- Dropletのプログラムによる作成と管理
- 永続ストレージのためのボリュームの使用
- ファイアウォールとロードバランサーの設定
- Kubernetesクラスターの管理
- プロビジョニング前のApidogによるインフラストラクチャテスト
よくある質問
Dropletの料金はいくらですか?料金は1 vCPU/1GBで月額5ドルから始まります。現在の料金については料金ページをご確認ください。時間単位の課金も利用可能です。
APIで作成したDropletでSSHキーは使えますか?はい。Droplet作成時にssh_keys配列にSSHキーのフィンガープリントを含めてください。
ボリュームとSpacesの違いは何ですか?ボリュームはDropletにアタッチされるブロックストレージです。Spacesはオブジェクトストレージ(S3のようなもの)です。データベースにはボリューム、ファイルにはSpacesを使用します。
Kubernetes設定を取得するにはどうすればよいですか?
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/kubeconfig" \
-H "Authorization: Bearer YOUR_TOKEN"
Dropletのサイズを変更できますか?はい、サイズ変更アクションを使用します。ダウングレードには電源オフが必要です。アップグレードは稼働中に実行できます。
バックアップとスナップショットの違いは何ですか?バックアップはDigitalOceanが管理する自動的な週次/日次コピーです。スナップショットは手動で作成するオンデマンドイメージです。
Dropletの作成にはどれくらいの時間がかかりますか?通常30〜60秒です。一部のリージョンやサイズでは時間がかかる場合があります。
TerraformをDigitalOceanで使えますか?はい。DigitalOceanは公式のTerraformプロバイダーを提供しています。Infrastructure as Codeに最適です。
