- 技術 💻
SDKとは?API・ライブラリとの違いを再試行と中身の実測で解説
結論
SDK(Software Development Kit)は、あるサービスや OS 向けのソフトを作るための「開発道具一式」です。API が「呼び出し方の決まり」なのに対し、SDK はその決まりどおりに呼ぶためのライブラリ・ツール・ドキュメント・サンプルをまとめたもので、認証の署名・再試行・型の変換まで肩代わりします。
この記事でわかること
- SDK・API・ライブラリ・フレームワーク・IDE の違い(表と図)
- 同じ処理を HTTP 直書き33行と boto3 の7行で比べた結果
- 4つの SDK の再試行回数・送るヘッダー・依存の数の実測
SDK は、自分のコードと API の間に入って、面倒な決まりごとを代わりに処理します。SDK を使わずに API を直接呼ぶこともでき、そのときは署名や再試行を自分で書きます。
flowchart TD
A[自分のコード] --> S[SDK<br>署名・再試行・型の変換]
S --> H[HTTP の API]
A -. SDKを使わない .-> H
H --> V[サービス<br>AWS・Stripe など]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| SDKとは | 特定のサービス・OS 向けの開発道具一式(ライブラリ・ツール・文書・サンプル) | SDKとは |
| SDK の読み方 | エス・ディー・ケー。Software Development Kit の頭文字 | SDKとは |
| SDK と API の違い | API は呼び出しの決まり、SDK はそれを呼ぶ道具。SDK の中で API を呼んでいる | SDKとAPIの違い |
| SDK とライブラリの違い | ライブラリは部品。SDK はライブラリにツールや文書まで付いた一式 | ライブラリ・フレームワーク・IDEとの違い |
| SDK を使う利点 | 署名・再試行・ページ分け・型の変換を書かずに済む(33行→7行) | HTTP直接とSDKで書き比べ |
| SDK の注意点 | 既定の再試行・送られる情報・依存の重さを確かめる | 再試行の実測・ヘッダーとテレメトリー |
| SDK の中身を見る | pip download した wheel を unzip -l で開く | SDKの中身 |
| SDK か API 直接か | 公式 SDK があり言語が合えば SDK。軽さ優先・未対応の言語なら直接 | 判断表 |
確認環境:Ubuntu 24.04.5 LTS の上に Python 3.12.3 の venv を作業用の場所に作り、boto3 1.43.122(botocore 1.43.122)、moto 5.2.5、stripe 16.1.0、anthropic 2.3.0、requests 2.34.2 を入れました。AWS・Stripe・Anthropic のサービスには一度も接続していません。AWS は moto のサーバー(127.0.0.1 で起動)とメモリー上のモック(mock_aws)に、Stripe と Anthropic の SDK は接続先(ベース URL)を 127.0.0.1 の自作サーバーに向けて動かしました。環境変数はすべて消してから、ダミーの認証情報(testing・sk_test_dummy・dummy-key)だけを渡しています。再試行の既定値は boto3・Stripe・Anthropic の公式ドキュメントと照らし合わせ、Android SDK・iOS SDK(Xcode)・.NET SDK は手元で動かせないため、Android Developers・Apple Developer・Microsoft Learn の公式ページで確かめた範囲だけを書いています。図は mermaid で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「SDKとは?API・ライブラリとの違いを再試行と中身の実測で解説」
SDKとは(意味・読み方・一言でいうと)
この節では、SDK という言葉の意味と、どんな場面で「SDK」と呼ばれるのかが分かります。
SDK は Software Development Kit(ソフトウェア開発キット)の略で、読み方は「エス・ディー・ケー」です。 ある会社のサービスや OS・機器の上で動くソフトを作るために、提供元が配る道具をひとまとめにしたものを指します。
AWS の解説ページは、SDK を「プラットフォーム固有の構築ツールのセット」と説明し、中身としてデバッガー・コンパイラー・ライブラリ・ドキュメント・チュートリアル・API やフレームワークを挙げています。Microsoft Learn は .NET SDK を「一連のライブラリとツールであり、開発者はこれを使って .NET のアプリケーションやライブラリを作成できます」と説明しています。
「SDK」と呼ばれるものは、大きく2種類に分かれます。
| 種類 | 何のための SDK か | 例 | 入れ方 |
|---|---|---|---|
| プラットフォームの SDK | その OS・実行環境で動くアプリを作る | Android SDK・iOS SDK・.NET SDK・JDK | IDE(Android Studio・Xcode)や公式のインストーラー |
| サービスの SDK(クライアント SDK) | 外部のサービスの API を自分のプログラムから呼ぶ | AWS SDK(boto3)・Stripe SDK・Firebase SDK・各社の AI の SDK | pip・npm・Gradle・Swift Package Manager などのパッケージ管理 |
Web 開発や業務システムで「SDK を入れる」と言うときは、ほとんどが後者の「サービスの SDK」です。Python なら pip install boto3 の1行で入り、見た目はふつうのライブラリと変わりません。この記事では、まずサービスの SDK を手元で動かして中身と働きを確かめ、そのあとでプラットフォームの SDK を公式の情報で整理します。
SDK に含まれる4つの部品
- ライブラリ(クライアント):API を関数やメソッドとして呼べるようにしたコード。
client.get_item(...)のように書ける。 - ツール:CLI・ビルドツール・エミュレーター・デバッガー。Android SDK の platform-tools(adb など)や .NET SDK の
dotnetコマンド。 - ドキュメントとサンプル:API リファレンス・入門・コード例。
- 定義データ:API の一覧・引数・エラー・再試行の決まりを書いたデータ。boto3 は、この定義データの塊を持っています(次の節)。
SDKの中身:wheel を開いて見た構成
この節では、Python の SDK が実際にどんなファイルでできているのかが、配布物(wheel)を開いた結果で分かります。
Python の SDK は、拡張子 .whl の zip ファイルとして PyPI から配られています。 pip download で取り出し、unzip -l で中を見ると、インストールしなくても構成が分かります。
$ pip download --no-deps -d wheels boto3==1.43.122 botocore==1.43.122 \
stripe==16.1.0 anthropic==2.3.0 requests==2.34.2
$ unzip -Z1 wheels/boto3-1.43.122-py3-none-any.whl | awk -F/ '{print $1"/"$2}' | sort | uniq -c | sort -rn | head
15 boto3/data
13 boto3/docs
8 boto3/resources
5 boto3/dynamodb
4 boto3/s3
3 boto3/ec2
2 boto3/examples
| wheel | 大きさ | ファイル数 | 型の情報(py.typed) | ライセンス |
|---|---|---|---|---|
| boto3 1.43.122 | 140KB | 62 | なし | Apache-2.0 |
| botocore 1.43.122 | 15.8MB | 2,019 | なし | Apache-2.0 |
| stripe 16.1.0 | 2.6MB | 1,657 | あり | MIT |
| anthropic 2.3.0 | 2.2MB | 2,514 | あり | Apache-2.0 |
| requests 2.34.2(SDK ではない HTTP ライブラリ) | 72KB | 26 | あり | Apache-2.0 |
boto3 の本体は「API の定義データ」
boto3 自体は 140KB と小さく、重いのは土台の botocore です。botocore の 2,019 ファイルのうち、プログラム(.py など)は83個だけで、残りは botocore/data/ の下の JSON でした。展開すると 17.9MB あります。サービスごとに次のファイルが入っています。
$ unzip -Z1 wheels/botocore-1.43.122-py3-none-any.whl | grep '^botocore/data/dynamodb/2012-08-10/'
botocore/data/dynamodb/2012-08-10/endpoint-rule-set-1.json.gz ← 接続先 URL の決め方
botocore/data/dynamodb/2012-08-10/examples-1.json ← 例
botocore/data/dynamodb/2012-08-10/paginators-1.json ← ページ分けの決まり
botocore/data/dynamodb/2012-08-10/service-2.json.gz ← API の定義(操作・引数・エラー)
botocore/data/dynamodb/2012-08-10/waiters-2.json ← 待機の決まり
service-2.json.gz を Python で読むと、DynamoDB の API の決まりがそのまま書かれていました。
metadata: {"apiVersion": "2012-08-10", "protocol": "json", "serviceFullName": "Amazon DynamoDB",
"signatureVersion": "v4", "targetPrefix": "DynamoDB_20120810", ...}
58 operations
GetItem: {"http": {"method": "POST", "requestUri": "/"}, "input": {"shape": "GetItemInput"},
"errors": [ProvisionedThroughputExceededException, ResourceNotFoundException,
RequestLimitExceeded, InternalServerError, ThrottlingException]}
GetItemInput の必須: ["TableName", "Key"]
client.get_item() というメソッドは、boto3 のコードに1つずつ書かれているのではなく、この定義データから実行時に作られます。 手元の boto3 では Session().get_available_services() が 435 のサービスを返しました。AWS に新しい API が出ると botocore の定義データが更新され、新しい版が出ます。PyPI の公開日を見ると、botocore は2026年10月1日〜29日に16回(1.43.107〜1.43.122)、ほぼ平日ごとに版が上がっていました。
1SDK は「定義+共通処理」
API の一覧・引数・エラーは定義データに、署名・再試行・通信は共通のコードにある。
2型の情報の有無が違う
stripe・anthropic は py.typed があり、エディターの補完と型検査が効く。boto3 には無い。
3ライセンスは版で変わる
anthropic の LICENSE-MIT には「2.0.0 で MIT から Apache 2.0 に変えた」と書かれていた。
SDKとAPIの違い
この節では、SDK と API の関係と、混同しやすい点が分かります。
API(Application Programming Interface)は、ソフト同士がやり取りするための「決まり」です。 Web の API なら「この URL に、このヘッダーと本文で POST すると、この形の JSON が返る」という約束を指します。SDK は、その決まりに沿ってリクエストを組み立て、送り、結果を受け取るところまでを代わりに行う道具です。
レストランにたとえると
見分ける問い:「決まりそのものか、決まりを使う道具か」
| API | SDK | |
|---|---|---|
| 正体 | やり取りの決まり(URL・メソッド・形式) | 決まりを使うための道具一式 |
| 言語 | HTTP なら言語を問わない | 言語ごとに別(Python 用・Java 用…) |
| 使うのに要るもの | HTTP を送れる手段(curl・requests など) | パッケージのインストール |
| 認証・署名 | 自分で組み立てる | SDK が付ける |
| 再試行・ページ分け | 自分で書く | 既定で入っていることが多い |
| 関係 | SDK の中で API を呼んでいる。SDK を使っても、通信の中身は API そのもの | |
SDK を使っても、通信の中身は API と同じです。boto3 の get_item が送る直前のリクエストを、botocore のイベント(before-send)で取り出しました(日時の部分は省いています)。
POST http://127.0.0.1:47105/
X-Amz-Target: DynamoDB_20120810.GetItem
Content-Type: application/x-amz-json-1.0
X-Amz-Date: …
Authorization: AWS4-HMAC-SHA256 Credential=testing/…/ap-northeast-1/dynamodb/aws4_request, SignedH…
body: {"TableName": "users", "Key": {"id": {"S": "u1"}}}
→ {'id': {'S': 'u1'}, 'name': {'S': 'Sato'}, 'age': {'N': '31'}} | status 200
メソッド名(GetItem)はヘッダー X-Amz-Target に、引数は JSON の本文に、認証は Authorization の署名になって送られています。 先ほどの定義データの targetPrefix・protocol・signatureVersion が、そのまま使われていることが分かります。
API の設計の考え方(URL・ステータスコード・エラーの形)は、関連記事「REST APIの設計|URL・ステータスコード・エラー形式の決め方」で扱っています。
SDKとライブラリ・フレームワーク・IDEの違い
この節では、SDK とよく並べられるライブラリ・フレームワーク・IDE との線引きが分かります。
大きさで並べると「ライブラリ ⊂ SDK」、主導権で分けると「ライブラリ・SDK は自分が呼ぶ、フレームワークは自分のコードを呼ぶ」です。 IDE は、これらを使って書くための編集ソフトです。
| 名前 | ひとことで | 主導権 | 例 |
|---|---|---|---|
| API | やり取りの決まり | なし(決まりだけ) | DynamoDB の GetItem・Stripe の POST /v1/customers |
| ライブラリ | 再利用できる部品(コード) | 自分のコードが呼ぶ | requests・NumPy |
| SDK | 特定のサービス・OS 向けの部品+ツール+文書の一式 | 自分のコードが呼ぶ | boto3・Android SDK・.NET SDK |
| フレームワーク | アプリの骨組み。決まった場所に自分のコードを書く | フレームワークが自分のコードを呼ぶ | Django・Spring Boot・Next.js |
| IDE | コードを書く・動かす・デバッグする編集ソフト | (道具) | Android Studio・Xcode・VS Code |
ライブラリと呼ばれやすいもの
どのサービスにも使える汎用の部品(requests・urllib3)
ツールや文書は付かない、付いても最小限
中身は数十ファイル(requests は26)
SDK と呼ばれやすいもの
特定のサービス・OS 専用(boto3 は AWS 専用)
認証・再試行・エラーの型までそのサービスに合わせてある
提供元が公式に配り、版をそろえて更新する
境目はあいまいで、boto3 は「AWS SDK for Python」と呼ばれますが、入れ方も使い方もライブラリと同じです。 呼び名で迷ったときは、「特定の提供元が、自分のサービス・OS のために配っている一式か」で判断すると、たいてい一般的な呼び方と一致します。
同じ処理を「HTTP直接」と「SDK」で書いて比べる(boto3)
この節では、SDK を使うと何を書かずに済むのかが、同じ処理を2通りで書いた実物で分かります。
moto のサーバーを 127.0.0.1:47105 で起動し、DynamoDB の「テーブルを作る→1件入れる→1件読む」を、SDK を使わずに書いた版と boto3 で書いた版で動かしました。
SDK を使わない版(requests と自前の署名・33行)
AWS の API は、すべてのリクエストに「署名バージョン4(SigV4)」の署名が要ります。署名の手順(正規化したリクエストを作り、日付・リージョン・サービスで鍵を4回 HMAC して署名する)を自分で書くと、次のようになります。
# SDK を使わず、HTTP と署名(SigV4)を自分で書いて DynamoDB API を呼ぶ
import datetime, hashlib, hmac, json, os, requests
ENDPOINT = "http://127.0.0.1:47105/"
REGION, SERVICE = "ap-northeast-1", "dynamodb"
AK, SK = os.environ["AWS_ACCESS_KEY_ID"], os.environ["AWS_SECRET_ACCESS_KEY"]
def _hmac(key, msg):
return hmac.new(key, msg.encode(), hashlib.sha256).digest()
def call(target, body):
payload = json.dumps(body)
now = datetime.datetime.now(datetime.timezone.utc)
amz_date, day = now.strftime("%Y%m%dT%H%M%SZ"), now.strftime("%Y%m%d")
host = "127.0.0.1:47105"
headers = {"content-type": "application/x-amz-json-1.0", "host": host,
"x-amz-date": amz_date, "x-amz-target": f"DynamoDB_20120810.{target}"}
signed = ";".join(sorted(headers))
canonical = "\n".join(["POST", "/", "",
"".join(f"{k}:{headers[k]}\n" for k in sorted(headers)), signed,
hashlib.sha256(payload.encode()).hexdigest()])
scope = f"{day}/{REGION}/{SERVICE}/aws4_request"
to_sign = "\n".join(["AWS4-HMAC-SHA256", amz_date, scope,
hashlib.sha256(canonical.encode()).hexdigest()])
key = _hmac(_hmac(_hmac(_hmac(("AWS4" + SK).encode(), day), REGION), SERVICE), "aws4_request")
sig = hmac.new(key, to_sign.encode(), hashlib.sha256).hexdigest()
headers["authorization"] = (f"AWS4-HMAC-SHA256 Credential={AK}/{scope}, "
f"SignedHeaders={signed}, Signature={sig}")
r = requests.post(ENDPOINT, data=payload, headers=headers, timeout=10)
if r.status_code >= 400: # 再試行もエラーの型も自分で決める
raise RuntimeError(f"{r.status_code} {r.text}")
return r.json()
call("CreateTable", {"TableName": "users", "BillingMode": "PAY_PER_REQUEST",
"AttributeDefinitions": [{"AttributeName": "id", "AttributeType": "S"}],
"KeySchema": [{"AttributeName": "id", "KeyType": "HASH"}]})
call("PutItem", {"TableName": "users", "Item": {"id": {"S": "u1"}, "name": {"S": "Sato"}, "age": {"N": "31"}}})
print(call("GetItem", {"TableName": "users", "Key": {"id": {"S": "u1"}}}))
$ python direct.py
{'Item': {'id': {'S': 'u1'}, 'name': {'S': 'Sato'}, 'age': {'N': '31'}}}
SDK(boto3)を使う版(7行)
# 同じことを SDK(boto3)で書く
import boto3
ddb = boto3.resource("dynamodb", endpoint_url="http://127.0.0.1:47105")
table = ddb.create_table(TableName="users2", BillingMode="PAY_PER_REQUEST",
AttributeDefinitions=[{"AttributeName": "id", "AttributeType": "S"}],
KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}])
table.put_item(Item={"id": "u1", "name": "Sato", "age": 31})
print(table.get_item(Key={"id": "u1"})["Item"])
$ python sdk.py
{'id': 'u1', 'name': 'Sato', 'age': Decimal('31')}
| 比べたところ | HTTP 直接(requests) | SDK(boto3) |
|---|---|---|
| 行数(空行・コメントを除く) | 33行 | 7行 |
| 署名(SigV4) | 自分で14行書いた | 書かない(環境変数から認証情報を読んで付けた) |
| 型の変換 | {"N": "31"} のように型を書いて送る |
31 と書けば変換し、読むと Decimal('31') |
| 500 が返ったとき | 1回で例外(再試行なし) | 既定で最大5回(DynamoDB は10回)まで再試行 |
| 引数の誤り | 送ってからサーバーに断られる | 送る前に ParamValidationError |
| エラーの型 | 自分で決める(ここでは RuntimeError) | ResourceNotFoundException などサービスのエラーごとの例外 |
SDK の価値は行数よりも「署名・再試行・検査を、提供元が試したコードで済ませられる」ことにあります。 自前の署名は、ヘッダーの並び順や空白1つの違いで認証エラーになり、原因を探すのに時間がかかります。
ページ分けと待機も SDK が肩代わりする
多くの API は、一覧を一度に全部は返しません。S3 の ListObjectsV2 は1回で最大1,000件です。mock_aws(メモリー上の偽の AWS)に 2,500 個のオブジェクトを置いて確かめました。
one = s3.list_objects_v2(Bucket="demo")
print("1回だけ呼ぶ:", one["KeyCount"], "件 / IsTruncated =", one["IsTruncated"])
pages = s3.get_paginator("list_objects_v2").paginate(Bucket="demo")
counts = [p["KeyCount"] for p in pages]
print("paginator:", len(counts), "ページ", counts, "合計", sum(counts), "件")
ddb.get_waiter("table_exists").wait(TableName="t")
1回だけ呼ぶ: 1000 件 / IsTruncated = True
paginator: 3 ページ [1000, 1000, 500] 合計 2500 件
waiter table_exists: 0.010s ACTIVE
ページ分け(paginator)は、定義データの paginators-1.json にある決まりで動いています。中身は「IsTruncated が真なら、NextContinuationToken を次の ContinuationToken に入れて呼び直す」という1行の設定でした。待機(waiter)の TableExists は「DescribeTable を20秒おきに最大25回呼び、Table.TableStatus が ACTIVE になったら成功」と書かれていて、モックではすぐ ACTIVE になったため 0.010 秒で終わりました。
{"more_results": "IsTruncated", "limit_key": "MaxKeys", "output_token": "NextContinuationToken",
"input_token": "ContinuationToken", "result_key": ["Contents", "CommonPrefixes"]}
client・resource・session の使い分けと、認証情報を探す順番は、関連記事「boto3 client・resource・sessionの違いと認証の優先順位」で扱っています。
SDKの再試行(リトライ)を127.0.0.1のサーバーで実測
この節では、SDK が失敗したリクエストを何回・どの間隔で送り直すのかが、4つの SDK を同じ条件で動かした結果で分かります。
SDK の多くは、一時的なエラー(500・503・接続エラーなど)を既定で自動的に再試行します。 便利な反面、「1回呼んだつもりが3回送られていた」ことに気づかない原因にもなります。そこで、最初の N 回だけ 500 を返し、その後は 200 を返す自作のサーバーを 127.0.0.1 に立て、各 SDK の接続先をそこへ向けました。
# 127.0.0.1 だけで待ち受ける「最初の N 回は失敗する」サーバー(抜粋)
class H(http.server.BaseHTTPRequestHandler):
def _h(self):
n = count["n"] = count["n"] + 1
print(f"{time.time()-T0:6.3f}s #{n} {self.command} {self.path} {送られたヘッダーの一部}")
self.send_response(CODE if n <= FAIL else 200)
...
http.server.ThreadingHTTPServer(("127.0.0.1", PORT), H).serve_forever()
各 SDK は次のように接続先を変えています。どれも公式に用意された設定です。
requests.post("http://127.0.0.1:47101/v1/messages", json={"q": 1}, timeout=10) # SDK なし
anthropic.Anthropic(api_key="dummy-key", base_url="http://127.0.0.1:47102")
stripe.StripeClient("sk_test_dummy", base_addresses={"api": "http://127.0.0.1:47103"},
max_network_retries=2)
boto3.client("dynamodb", endpoint_url="http://127.0.0.1:47104",
config=Config(retries={"mode": "standard"}))
2回失敗して3回目に成功するとき
=== requests(SDK なし)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: http://127.0.0.1:47101/v1/messages
0.662s #1 POST /v1/messages {"User-Agent": "python-requests/2.34.2", "x-api-key": "dummy-key"}
=== anthropic 2.3.0
result {'ok': True} 1.234s
1.624s #1 POST /v1/messages {"x-stainless-retry-count": "0", ...}
2.015s #2 POST /v1/messages {"x-stainless-retry-count": "1", ...}
2.855s #3 POST /v1/messages {"x-stainless-retry-count": "2", ...}
=== stripe 16.1.0
0.703s #1 POST /v1/customers {"Idempotency-Key": "3209e35b-65a7-acb1-5e13-0cc7ca10eb40", ...}
1.206s #2 POST /v1/customers {"Idempotency-Key": "3209e35b-65a7-acb1-5e13-0cc7ca10eb40", ...}
2.193s #3 POST /v1/customers {"Idempotency-Key": "3209e35b-65a7-acb1-5e13-0cc7ca10eb40", ...}
=== boto3 1.43.122(既定:legacy)
retries: {'mode': 'legacy'}
result 200 RetryAttempts 2 0.163s
ずっと失敗し続けるとき(何回で諦めるか)
| 送り手 | 送った回数(合計) | 諦めるまで | 間隔(実測) | 最後の例外 |
|---|---|---|---|---|
| requests(SDK なし) | 1回 | すぐ | ― | HTTPError(raise_for_status) |
| anthropic 2.3.0(既定) | 3回 | 1.4秒 | 約0.4秒→約1.0秒 | InternalServerError |
| stripe 16.1.0(max_network_retries=2) | 3回 | 1.4秒 | 約0.5秒→約0.9秒 | APIError |
| boto3 legacy(Secrets Manager) | 5回 | 4.7秒 | ばらつく(乱数つき) | ClientError(reached max retries: 4) |
| boto3 legacy(DynamoDB) | 10回 | 25.6秒 | 0.05→0.1→0.2…→12.8秒と倍々 | ClientError(reached max retries: 9) |
| boto3 standard | 3回 | 2.1秒 | 乱数つきの指数バックオフ | ClientError(reached max retries: 2) |
| boto3 adaptive | 3回 | 1.5秒 | standard と同じ+送る速さの調整 | ClientError(reached max retries: 2) |
DynamoDB だけ10回になる理由は、botocore の定義データ _retry.json にありました。既定(__default__)は "max_attempts": 5 で間隔の基準が乱数、DynamoDB は "max_attempts": 10 で "base": 0.05, "growth_factor": 2 です。サーバーのログの間隔(0.054・0.103・0.202・0.403・0.803・1.602・3.203・6.391・12.802 秒)は、この設定どおりの倍々でした。
boto3 の公式ドキュメント(Retries)は、「Legacy mode is the default mode used by any Boto3 client you create.」(legacy が既定)とし、legacy の既定の最大回数は5回(最初の1回を含む)、standard は3回と説明しています。Anthropic の公式ドキュメントは「既定で2回再試行(max_retries の既定は2)」「既定のタイムアウトは10分」、Stripe の公式ドキュメントは「SDK は冪等キーを作って自動で再試行できる」としています。手元の結果は、どれも公式の説明と合っていました。
429 と Retry-After の扱いは SDK で違う
サーバーが1回目だけ 429 Too Many Requests と Retry-After: 3 を返すようにしました。
=== anthropic 2.3.0
result {'ok': True} 3.007s
1.682s #1 POST /v1/messages {"x-stainless-retry-count": "0"
4.684s #2 POST /v1/messages {"x-stainless-retry-count": "1" ← 3.0秒待って再送
=== boto3(standard)
ClientError An error occurred (429) when calling the ListTables operation: 0.006s ← 再送しない
=== boto3(legacy)
0.788s #1 POST / … ← 429
1.686s #2 POST / … ← 0.9秒後に再送して成功(Retry-After の3秒は待たない)
boto3 の standard は、本文にスロットリングのエラーコードが無い「ただの429」を再試行しませんでした。公式ドキュメントの standard の再試行の対象は、HTTP ステータスでは 500・502・503・504 で、429 は legacy の一覧にだけあります。AWS の本物のサービスは、混雑時に ThrottlingException などのエラーコードを本文に入れて返すため、そちらで再試行されます。
1SDK を使うと1回が3〜10回になる
サーバー側のログやアクセス数を見るときは、再試行の分を数に入れる。
2既定のまま待ち時間が延びる
DynamoDB の legacy は諦めるまで25.6秒。画面の応答時間の上限より長いことがある。
3Stripe は同じ冪等キーで再送
3回とも同じ Idempotency-Key だった。二重の課金を防ぐ仕組みが SDK に入っている。
Stripe の SDK は、再試行を0回にしても POST に Idempotency-Key を付けていました(呼び出しごとに別の値)。SDK を使わずに決済の API を直接呼ぶ場合は、この冪等キーを自分で作って付けることになります。再試行の間隔の決め方は関連記事「指数バックオフとは?リトライ間隔の決め方とジッターの実装」で、boto3 の再試行の設定と例外の受け方は関連記事「boto3のエラーハンドリング|ClientErrorのコード取得とリトライ設定」で扱っています。
再試行の回数を自分で決める
# boto3:最初の1回を含めて合計3回、standard の決まりで
from botocore.config import Config
c = boto3.client("dynamodb", config=Config(retries={"total_max_attempts": 3, "mode": "standard"}))
# anthropic:再試行しない(呼び出し側で制御したいとき)
client = anthropic.Anthropic(max_retries=0)
# stripe:再試行を2回まで
client = stripe.StripeClient("sk_test_...", max_network_retries=2)
boto3 の max_attempts は、Config で指定すると「再試行の回数(最初の1回を含まない)」、設定ファイルや環境変数 AWS_MAX_ATTEMPTS では「合計の回数」と、数え方が違います。公式ドキュメントは、混乱を避けるため Config では total_max_attempts を使うよう勧めています。
SDKが送るヘッダーとテレメトリー
この節では、SDK がリクエストに何を付けて送っているのか、利用状況の情報(テレメトリー)を送るものがあるのかが分かります。
SDK は、自分のコードに書いていない情報もヘッダーに付けて送ります。 同じ自作サーバーで受け取ったヘッダーです(長い値は「…」で省いています)。
# requests(SDK なし)
User-Agent: python-requests/2.34.2
# boto3 1.43.122
User-Agent: Boto3/1.43.122 md/Botocore#1.43.122 ua/2.1 os/linux#6.18.44-…
Authorization: AWS4-HMAC-SHA256 Credential=testing/…/ap-northeast-1/dynamodb/aws4_request, …
amz-sdk-invocation-id: 960d681d-978c-4d5f-9975-6133bd6e4400
amz-sdk-request: attempt=1 ← 再送では ttl=…; attempt=2; max=10
# stripe 16.1.0
User-Agent: Stripe/v1 PythonBindings/16.1.0
X-Stripe-Client-User-Agent: {"bindings_version": "16.1.0", "lang": "python", "httplib": "requests",
"telemetry_id": "…", "lang_version": "3.12.3", "platform": "Linux-…"}
Idempotency-Key: 3209e35b-65a7-acb1-5e13-0cc7ca10eb40
Stripe-Version: 2026-10-28.endive
# anthropic 2.3.0
User-Agent: Anthropic/Python 2.3.0
X-Stainless-Lang: python
X-Stainless-OS: Linux
X-Stainless-Runtime-Version: 3.12.3
x-stainless-retry-count: 0 ← 再送のたびに 1、2
anthropic-version: 2026-10-21
| 付いていた情報 | 付けた SDK | 何に使われるか |
|---|---|---|
| SDK の名前と版・言語の版・OS | boto3・stripe・anthropic | 提供元が利用環境を把握し、不具合の調査に使う |
| API の版(Stripe-Version・anthropic-version) | stripe・anthropic | SDK の版に合った API の版を固定して送る |
| 何回目の送信か(attempt・retry-count) | boto3・anthropic | サーバー側で再送と区別する |
| 1つの呼び出しの ID(invocation-id) | boto3 | 再送をまとめて追う |
| 前回の所要時間(X-Stripe-Client-Telemetry) | stripe(既定で有効) | SDK の性能の把握(テレメトリー) |
Stripe のテレメトリーを止める
stripe-python の README は「By default, the library sends telemetry to Stripe regarding request latency and feature usage.」(既定でリクエストの所要時間と機能の利用状況を送る)とし、stripe.enable_telemetry = False で止められると書いています。同じクライアントで2回続けて呼び、2回目のヘッダーを比べました。
# enable_telemetry = True(既定)の2回目
X-Stripe-Client-Telemetry: {"last_request_metrics": {"request_id": "req_1, req_1",
"request_duration_ms": 3, "usage": ["stripe_client"]}}
# enable_telemetry = False の2回目
(X-Stripe-Client-Telemetry ヘッダーなし)
送られていたのは、前回のリクエスト ID・所要時間(ミリ秒)・使った機能の名前で、リクエストの中身は含まれていませんでした(request_id が2つ並んでいるのは、自作サーバーが Request-Id ヘッダーを2つ返したためです)。
SDK は環境変数を読む
環境変数を消さずに Stripe の SDK を動かしたときは、User-Agent が Stripe/v1 PythonBindings/16.1.0 AIAgent/claude_code になり、X-Stripe-Client-User-Agent に "ai_agent": "claude_code" が加わりました。AI のコーディングエージェントの中で動いていることを、環境変数から読み取って送っています。boto3 も、AWS_ACCESS_KEY_ID などの環境変数や ~/.aws/config を自動で読みます。SDK は「書いていない設定」も周りから拾うため、テストや検証では環境変数を空にした状態で動かすと、結果がぶれません。
SDKを使ったテスト:motoでAWSにつながずに確かめる
この節では、外部のサービスに接続せずに、SDK を使ったコードをテストする方法が分かります。
SDK の利点の1つは、SDK の「下」を差し替えて、本物に接続しないテストが書けることです。 AWS なら moto が、boto3 の通信を横取りしてメモリー上の偽の AWS に届けます。moto の公式ドキュメントは「With a simple decorator wrapping, all calls to AWS are automatically mocked out.」と説明し、テストではダミーの認証情報(testing)を環境変数に入れておくよう勧めています。
import unittest, boto3
from moto import mock_aws
def save_report(s3, text): # テストしたい自分の関数
s3.put_object(Bucket="reports", Key="daily.txt", Body=text.encode())
return s3.head_object(Bucket="reports", Key="daily.txt")["ContentLength"]
class T(unittest.TestCase):
@mock_aws
def test_save_report(self):
s3 = boto3.client("s3", region_name="us-east-1")
s3.create_bucket(Bucket="reports")
self.assertEqual(save_report(s3, "売上 120件"), len("売上 120件".encode()))
@mock_aws
def test_bucket_missing(self):
s3 = boto3.client("s3", region_name="us-east-1")
with self.assertRaises(s3.exceptions.NoSuchBucket):
save_report(s3, "x")
test_bucket_missing (__main__.T.test_bucket_missing) ... ok
test_save_report (__main__.T.test_save_report) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.521s
OK
ダミーの認証情報を入れる
AWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEY を testing にし、設定ファイルの場所を空のファイルに向ける。本物の鍵が読まれる道を先に断つ。
mock_aws で包む
テスト関数に @mock_aws を付ける。中の boto3 の呼び出しは、すべてメモリー上の偽物に届く。
Python 以外はサーバーで
moto のサーバーを 127.0.0.1 で起動し、SDK の endpoint_url をそこへ向ける。CLI や別の言語の SDK からも使える。サーバーには moto[server] の追加の依存が要る。
失敗のテストも書く
無いバケット・無いテーブルの例外(NoSuchBucket・ResourceNotFoundException)を、SDK の例外クラスで受けて確かめる。
Stripe や AI の SDK のように専用のモックが無い場合は、この記事の再試行の実験と同じように、接続先(base_url・base_addresses)を 127.0.0.1 の自作サーバーに向けると、決まった応答で SDK の動きを確かめられます。
依存の数・容量・読み込み時間(4つのSDKを実測)
この節では、SDK を1つ入れると何が一緒に入り、どれくらい重いのかが分かります。
SDK は便利な分、依存するパッケージと容量が増えます。 空の venv を4つ作り、それぞれ1つだけ入れて数えました。読み込み時間は import にかかった時間を3回測った中央値です。
| 入れたもの | 入ったパッケージ数 | 容量 | import の時間 | 一緒に入った主なもの |
|---|---|---|---|---|
| requests 2.34.2 | 5 | 3MB | 118ms | urllib3・certifi・idna |
| boto3 1.43.122 | 7 | 28MB | 142ms | botocore・s3transfer・jmespath |
| stripe 16.1.0 | 7 | 19MB | 112ms | requests・typing-extensions |
| anthropic 2.3.0 | 16 | 26MB | 1,010ms | pydantic・httpx2・anyio・jiter |
- 容量の多くは、SDK の定義データやモデル(型)の定義です。 boto3 の 28MB のうち、ほとんどが botocore の定義データでした。
- boto3 は import に142ms、さらに client を1つ作るまでで合計209msでした。AWS Lambda のように起動の速さが料金や応答に響く場所では、client を関数の外で1回だけ作ります。
- anthropic は型の検査に pydantic を使うため依存が多く、この環境では import に約1秒かかりました。短いスクリプトを何度も起動する使い方では、この時間が効いてきます。
- SDK の依存の版が、自分のアプリの依存とぶつかることがあります(同じ urllib3 を別の版で求めるなど)。venv を分ける・ロックファイルで版を固定する、で避けます。
Python のパッケージの入れ方と venv の使い方は、関連記事「Claude API Python入門|Anthropic SDKコピペレシピ集」でも、SDK を入れるところから扱っています。
言語・OSのSDK(Android SDK・iOS SDK・.NET SDK・JDK)
この節では、アプリ開発で「SDK」と呼ばれるプラットフォームの SDK が何を含み、どう入れるのかが、公式の情報で分かります。
スマホアプリや .NET・Java のアプリを作るときは、その OS・実行環境の SDK が必須です。 手元では動かせないため、各社の公式ページで確かめた範囲だけをまとめます(2026年10月29日時点)。
| SDK | 主な中身 | 入れ方(公式) | 公式で確かめたこと |
|---|---|---|---|
| Android SDK | プラットフォーム(API レベルごと)・build-tools・platform-tools(adb など)・エミュレーター | Android Studio の SDK Manager、またはコマンド | sdkmanager のページに「sdkmanager は非推奨。Android CLI の android sdk コマンドを使う」と書かれている |
| iOS SDK(Apple の各 OS の SDK) | 各 OS のフレームワーク・シミュレーター | Xcode に同梱 | Xcode 27.2 の SDK 欄は iOS 27.2・macOS 27.2 など。Xcode 27.2 は macOS Tahoe 26.6 以降に入る |
| .NET SDK | .NET CLI・.NET ランタイムとライブラリ・dotnet ドライバー | Microsoft の公式インストーラー・パッケージ | 「一連のライブラリとツールであり、…アプリケーションやライブラリを作成できます」 |
| JDK(Java Development Kit) | javac(コンパイラー)・java・標準ライブラリ | 各配布元の JDK | 名前に「SDK」は無いが、Java の SDK にあたる |
Android SDK のパッケージは、公式の例では次の形で指定します(Android Studio を使う場合は IDE の画面から管理でき、このコマンドは不要です)。
sdkmanager "platform-tools" "platforms;android-36" # 公式ページの例(sdkmanager は非推奨と明記)
android sdk [install|list|update|remove] # 公式ページが案内する後継のコマンド
アプリに Firebase や決済・広告などの機能を足すときに入れる「機能の SDK」は、Android なら Gradle、iOS なら Swift Package Manager などのパッケージ管理で入れます。これらはサービスの SDK と同じ仲間です。
SDKを選ぶときの確認点(版・ライセンス・テレメトリー)
この節では、SDK を入れる前に何を確かめておくと後で困らないかが、チェックリストで分かります。
入れる前に確かめるのは、「誰が出しているか」「どれくらい更新されているか」「既定で何をするか」の3つです。
- 1提供元の公式かサービスの公式ドキュメントからリンクされているパッケージ名か。似た名前の別物を入れない
- 2対応する言語の版Requires-Python は boto3・anthropic・requests が 3.10 以上、stripe は 3.9 以上だった
- 3更新の頻度と版の上げ方botocore は2026年10月だけで16回版が上がった。ロックファイルで固定し、上げるときは変更履歴を読む
- 4ライセンスdist-info の licenses の下を見る。Apache-2.0・MIT が多いが、版で変わることもある
- 5既定の再試行とタイムアウトboto3 は接続・読み取りとも60秒、anthropic は10分、requests は指定しないと無制限(None)だった
- 6送られる情報User-Agent やテレメトリーで何が送られるか。止める設定があるか(Stripe は enable_telemetry)
- 7依存の数と容量pip install のあとに pip list で数える。容量や起動時間が効く場所では特に
- 8テストの道具があるかmoto のようなモック、接続先を変える設定(endpoint_url・base_url)があるか
タイムアウトは、手元で各 SDK の設定を読み出して確かめました。
boto3 timeouts: connect=60 read=60 max_pool_connections=10
anthropic Timeout(connect=5.0, read=600, write=600, pool=600) max_retries: 2
requests Session.request の timeout の既定値: None
stripe max_network_retries(全体の既定): 2
スマホアプリに第三者の SDK を組み込むときは、SDK が集めて送るデータも、アプリを出す側が申告する対象になります。
- Apple の「Third-party SDK requirements」は、第三者の SDK を使うなら、その SDK がアプリに持ち込むコードすべてに責任を持ち、データの収集と利用のしかたを把握しておく必要がある、としています。一覧に載った SDK(Firebase・Alamofire など約140件)を含むアプリを App Store Connect に出すときは、その SDK のプライバシーマニフェストが必須で、バイナリで組み込む場合は SDK の署名も求められます。Xcode は、使っている SDK のプライバシーマニフェストを1つのレポートにまとめます。
- Google Play の「データ セーフティ」の申告では、「アプリで使用されるサードパーティのライブラリまたは SDK を通じて収集、処理されるデータも含まれます」と書かれています。
サーバー側で使う SDK でも、User-Agent やテレメトリーで何が送られるかを把握しておくと、社内の情報管理の確認にそのまま答えられます。
SDKを使うか、APIを直接呼ぶか:判断表
この節では、SDK を使うべき場面と、API を直接呼んだほうがよい場面が分かります。
迷ったら、次の順に当てはめます。
- 1署名が複雑な API(AWS の SigV4 など)→ SDK自前の署名は33行中14行を占め、間違えると原因が分かりにくい
- 2お金が動く・二重実行が困る API → 冪等キーを扱える SDKStripe の SDK は冪等キーを自動で付けて再送した
- 3自分の言語の公式 SDK がある → SDKページ分け・待機・型の変換・例外の型が付いてくる
- 4呼ぶのが1〜2個の単純な API → 直接でもよいBearer トークンを付けて GET するだけなら、requests や fetch で数行
- 5容量・起動時間・依存の少なさが最優先 → 直接組み込み機器・小さな関数・依存を増やせない環境
- 6公式 SDK が無い言語・新しすぎる機能 → 直接(OpenAPI から生成も)SDK の対応が API の公開より遅れることがある
| 場面 | 向いている方 | 理由 |
|---|---|---|
| AWS のサービスを Python から操作する | SDK(boto3) | 署名・再試行・ページ分け・待機がそろっている |
| 決済(課金・返金)を行う | SDK | 冪等キーと再試行が組み込まれている |
| 社内の API を1本だけ呼ぶ | 直接 | 依存を増やさず、挙動をすべて自分で把握できる |
| シェルスクリプト・CI から呼ぶ | CLI(SDK を使ったコマンド)か curl | CLI も中では同じ API を呼んでいる。手で打つ・短い処理は CLI が手軽 |
| Web ブラウザの JavaScript から呼ぶ | 提供元のブラウザ用 SDK か fetch | 秘密の鍵をブラウザに置かない。サーバー経由にする |
| スマホアプリを作る | プラットフォームの SDK(必須)+機能の SDK | OS の機能はプラットフォームの SDK からしか使えない |
| AI の API で、生成を1回だけ確実に行いたい | SDK(再試行の回数を決めて) | 既定の再試行で同じ処理が2〜3回走ることがある |
SDK の使い方で避けたいこと
確かめ方:サーバーのログで、1回の呼び出しに何本のリクエストが来たか数える
よくあるエラーとつまずき(原文つき)
この節では、SDK を使い始めたときによく出るエラーの原文と、原因・直し方が分かります。
手元の boto3・moto・anthropic で実際に出した文言です。
| エラーの原文 | 原因 | 直し方 |
|---|---|---|
ModuleNotFoundError: No module named 'boto3' |
入れていない・別の Python で動かした | venv を有効にしてから pip install boto3。python -m pip で同じ Python に入れる |
NoCredentialsError: Unable to locate credentials |
認証情報が見つからない | 環境変数・~/.aws/credentials・ロールのどれかを用意する |
NoRegionError: You must specify a region. |
リージョンの指定が無い | region_name= か AWS_DEFAULT_REGION を指定する |
UnknownServiceError: Unknown service: 'dynamodbb'. Valid service names are: … |
サービス名の綴り違い | 続く一覧から正しい名前を選ぶ |
AttributeError: 'DynamoDB' object has no attribute 'list_table' |
メソッド名の綴り違い(正しくは list_tables) | API リファレンスで名前を確かめる |
ParamValidationError: Missing required parameter in input: "TableName" |
必須の引数が無い(送る前に SDK が止めた) | 定義データの required にある引数を渡す |
Invalid type for parameter Item.id, value: u1, type: <class 'str'>, valid types: <class 'dict'> |
client は {"S": "u1"} の形を求める |
型つきで書くか、resource(Table)を使う |
ResourceNotFoundException: … Requested resource not found: Table: nothing not found |
無いテーブル(HTTP は400) | 名前・リージョン・アカウントを確かめる |
EndpointConnectionError: Could not connect to the endpoint URL: "http://127.0.0.1:47199/" |
接続先に誰も待ち受けていない | endpoint_url・プロキシ・ネットワークを確かめる |
ModuleNotFoundError: No module named 'flask' |
moto のサーバー機能は追加の依存が要る | pip install "moto[server]" のように extras を付ける |
TypeError: "Could not resolve authentication method. Expected one of api_key, auth_token, or credentials to be set. …" |
anthropic に API キーを渡していない | 環境変数か引数でキーを渡す |
- SDK のエラーは「送る前に SDK が止めたもの」と「サーバーが返したもの」の2種類です。 ParamValidationError・UnknownServiceError・NoCredentialsError は通信する前に出ており、サーバーのログには何も残りません。
- サーバーが返したエラーは、
e.response["Error"]["Code"]でコード(ResourceNotFoundException)を、e.response["ResponseMetadata"]["HTTPStatusCode"]で HTTP の番号(400)を取り出せました。 - moto をサーバーとして起動したとき、
UserWarning: When using MotoServer, ensure that you install moto[server] to have all dependencies!という警告の直後に flask が無いエラーになりました。SDK や関連ツールには、追加機能の依存を[名前]で選んで入れる形のものがあります。
AWS の認証情報のエラーの直し方は、関連記事「AWS CLI Unable to locate credentialsの直し方」で扱っています。
よくある質問
Q. SDKとは、簡単に言うと何ですか? A. あるサービスや OS 向けのソフトを作るための「道具箱」です。API を呼ぶためのライブラリに、ツール・ドキュメント・サンプルが付いた一式を指します。
Q. SDK の読み方は? A. 「エス・ディー・ケー」です。Software Development Kit(ソフトウェア開発キット)の頭文字です。
Q. SDK と API はどちらを先に覚えるべきですか? A. API の考え方(URL・メソッド・ヘッダー・ステータスコード・JSON)を先に押さえると、SDK のエラーが読めるようになります。SDK のエラーの多くは、中で API が返した HTTP のエラーをそのまま包んだものだからです。
Q. SDK とライブラリは何が違いますか? A. ライブラリは再利用できる部品で、SDK は特定のサービス・OS のための部品にツールや文書まで付いた一式です。Python の SDK は見た目はライブラリと同じで、boto3 は「AWS SDK for Python」と呼ばれています。
Q. Python SDK とは何ですか? A. Python から使えるように作られたサービスの SDK のことです。boto3(AWS)・stripe・anthropic のように、pip で入れて import して使います。同じサービスでも、Java 用・JavaScript 用などの SDK は別に配られています。
Q. SDK と IDE の違いは? A. IDE(統合開発環境)はコードを書いて動かす編集ソフトで、SDK はそこで使う部品と道具です。Android Studio・Xcode のように、IDE が SDK を管理・同梱しているものもあります。
Q. スマホアプリの開発に SDK は必須ですか? A. Android なら Android SDK、iOS なら Xcode に含まれる SDK が必須です。OS の機能(カメラ・通知など)は、その SDK を通してしか使えません。
Q. SDK を入れるだけで勝手に通信しますか?
A. 手元で確かめた4つ(requests・boto3・stripe・anthropic)は、strace で見ると import しただけでは connect も sendto も0回で、API を呼んだときに初めて通信しました。ただし Stripe の SDK は、既定で前回の所要時間などをヘッダーに付けて送ります(stripe.enable_telemetry = False で止められます)。
Q. SDK のバージョンはどう固定しますか? A. requirements.txt やロックファイルに版を書きます。boto3 と botocore は同じ番号で一緒に上がるため、片方だけ固定すると組み合わせが合わなくなることがあります。
Q. 公式の SDK が無いサービスはどうしますか? A. HTTP で API を直接呼びます。OpenAPI の定義が公開されていれば、そこからクライアントのコードを生成する方法もあります。認証・再試行・タイムアウトは自分で決めて書きます。
Q. SDK は無料ですか? A. 多くの SDK は Apache-2.0 や MIT のライセンスで無料で配られています。料金がかかるのは、SDK から呼ぶサービスの利用分です。
まとめ
- SDK は、特定のサービス・OS 向けの開発道具一式。API は「決まり」、SDK は「決まりを使う道具」で、SDK の中で API を呼んでいる。
- DynamoDB の読み書きは、HTTP 直書きで33行(うち署名14行)、boto3 で7行だった。boto3 の中身の大半は、API の定義データ(botocore/data、展開して17.9MB)だった。
- 再試行の既定は SDK ごとに違い、手元では requests が1回、anthropic と stripe が3回、boto3 は legacy で5回(DynamoDB は10回・25.6秒)、standard で3回送った。
- SDK は版・OS・再試行の回数などをヘッダーで送り、Stripe は既定でテレメトリーも送る。環境変数も読むため、検証は環境変数を空にして行うと結果がそろう。
- 選ぶ前に、公式か・言語の版・更新頻度・ライセンス・既定のタイムアウトと再試行・送る情報・依存の数を確かめる。テストは moto や 127.0.0.1 のサーバーで、本物に接続せずに行える。
参考・出典
確認日はいずれも 2026年10月29日です。
- AWS「SDK と API にはどのような違いがありますか?」:https://aws.amazon.com/jp/compare/the-difference-between-sdk-and-api/
- AWS「SDK とは何ですか?」:https://aws.amazon.com/jp/what-is/sdk/
- AWS「Retries」(Boto3 Developer Guide):https://docs.aws.amazon.com/boto3/latest/guide/retries.html
- Stripe「Advanced error handling」:https://docs.stripe.com/error-low-level
- Stripe「stripe-python」README(Telemetry・Configuring automatic retries):https://github.com/stripe/stripe-python
- Anthropic「Python SDK」(Retries・Timeouts):https://platform.claude.com/docs/en/api/sdks/python
- moto「Getting Started with Moto」:https://docs.getmoto.org/en/latest/docs/getting_started.html
- Android Developers「sdkmanager」:https://developer.android.com/tools/sdkmanager
- Apple Developer「Xcode - Support」:https://developer.apple.com/support/xcode/
- Microsoft Learn「.NET SDK の概要」:https://learn.microsoft.com/ja-jp/dotnet/core/sdk
- Apple Developer「Third-party SDK requirements」:https://developer.apple.com/support/third-party-SDK-requirements/
- Google Play Console ヘルプ「Google Play のデータ セーフティ セクションに情報を入力する」:https://support.google.com/googleplay/android-developer/answer/10787469?hl=ja
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「SDKとは?API・ライブラリとの違いを再試行と中身の実測で解説」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。