結論

SDK(Software Development Kit)は、あるサービスや OS 向けのソフトを作るための「開発道具一式」です。API が「呼び出し方の決まり」なのに対し、SDK はその決まりどおりに呼ぶためのライブラリ・ツール・ドキュメント・サンプルをまとめたもので、認証の署名・再試行・型の変換まで肩代わりします。

この記事でわかること

  • SDK・API・ライブラリ・フレームワーク・IDE の違い(表と図)
  • 同じ処理を HTTP 直書き33行と boto3 の7行で比べた結果
  • 4つの SDK の再試行回数・送るヘッダー・依存の数の実測

2026年10月29日更新|boto3 1.43・moto 5.2・stripe 16.1・anthropic 2.3 で実行確認

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注文を代わりに書いて出してくれる係。書式の間違いを先に止め、混んでいれば少し待って頼み直す

見分ける問い:「決まりそのものか、決まりを使う道具か」

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
1

ダミーの認証情報を入れる

AWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEY を testing にし、設定ファイルの場所を空のファイルに向ける。本物の鍵が読まれる道を先に断つ。

環境変数

2

mock_aws で包む

テスト関数に @mock_aws を付ける。中の boto3 の呼び出しは、すべてメモリー上の偽物に届く。

Python の中だけ

3

Python 以外はサーバーで

moto のサーバーを 127.0.0.1 で起動し、SDK の endpoint_url をそこへ向ける。CLI や別の言語の SDK からも使える。サーバーには moto[server] の追加の依存が要る。

127.0.0.1:47105

4

失敗のテストも書く

無いバケット・無いテーブルの例外(NoSuchBucket・ResourceNotFoundException)を、SDK の例外クラスで受けて確かめる。

s3.exceptions.NoSuchBucket

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. 1署名が複雑な API(AWS の SigV4 など)→ SDK自前の署名は33行中14行を占め、間違えると原因が分かりにくい
  2. 2お金が動く・二重実行が困る API → 冪等キーを扱える SDKStripe の SDK は冪等キーを自動で付けて再送した
  3. 3自分の言語の公式 SDK がある → SDKページ分け・待機・型の変換・例外の型が付いてくる
  4. 4呼ぶのが1〜2個の単純な API → 直接でもよいBearer トークンを付けて GET するだけなら、requests や fetch で数行
  5. 5容量・起動時間・依存の少なさが最優先 → 直接組み込み機器・小さな関数・依存を増やせない環境
  6. 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 の使い方で避けたいこと

やってはいけない既定の再試行に任せたまま、さらに自分のコードでも3回再試行する(最悪 3×10=30回送られる)
→
代わりに再試行はどちらか一方で行う。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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー