1.

AWS / PA-API「Your credentials do not allow access」403 の原因と対処

編集
この記事の要点
  • 403 Forbidden を返すパターン。AWS PA-API(旧 Product Advertising API)/ S3 / API Gateway / Amplify などで頻発
  • 主因: AccessKey / SecretKey の取り違え・タイポIAM ポリシー権限不足署名計算ミスリージョン不一致
  • PA-API 特有: Associate Tag が未登録 / 過去 30 日売上ゼロでアクセス権が剥奪
  • 対処: ① aws sts get-caller-identity で本当に自分の認証情報か確認、② IAM ポリシーを iam:SimulatePrincipalPolicy で検証、③ 署名 v4 はリージョン・サービス名・タイムスタンプを再確認
  • SDK 利用なら原則自前で署名を書かない。aws-sdk-java / boto3 等に任せる
  • API Gateway は カスタム認証 (Lambda Authorizer)API Key 不一致でも同じ 403 を返す

このエラーの典型

HTTP/1.1 403 Forbidden
Content-Type: application/xml



    
        InvalidClientTokenId
        The AWS Access Key Id you provided does not exist in our records.
    


# 別パターン
SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided.

# API Gateway
{"message":"Your credentials do not allow access to this resource."}

原因の切り分け

エラーコード意味対処
InvalidClientTokenIdAccessKey が存在しないキーの値・コピー漏れ確認
SignatureDoesNotMatchSecretKey 違い or 署名計算ミスSecretKey 再生成 / SDK 利用
AccessDeniedIAM ポリシー不足必要な Action / Resource 追加
TokenRefreshRequiredSTS 一時クレデンシャル期限切れ再取得
OptInRequiredサービスのオプトイン未済マネジメントコンソールで有効化
API Gateway 403API Key / IAM Auth / Lambda Authorizerx-api-key ヘッダ確認

対処 1: 認証情報が本当に有効か確認

# AWS CLI で確認
aws sts get-caller-identity

# 正常なら以下のような JSON
# {
#     "UserId": "AIDAEXAMPLE",
#     "Account": "123456789012",
#     "Arn": "arn:aws:iam::123456789012:user/myuser"
# }

# ❌ NG 例
# An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation
# → AccessKey が無効。再発行 or 別プロファイル指定

# プロファイル指定
aws sts get-caller-identity --profile prod
aws sts get-caller-identity --region ap-northeast-1

対処 2: IAM ポリシーを確認

# 自分のユーザにアタッチされたポリシー
aws iam list-attached-user-policies --user-name myuser
aws iam list-user-policies --user-name myuser

# ポリシーの中身
aws iam get-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
aws iam get-policy-version --policy-arn ... --version-id v1

# 「この操作が許可されるか」シミュレーション
aws iam simulate-principal-policy \
    --policy-source-arn arn:aws:iam::123456789012:user/myuser \
    --action-names s3:GetObject \
    --resource-arns arn:aws:s3:::my-bucket/key

対処 3: S3 で必要な最小ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}

注意点:

  • オブジェクト操作の Resource は arn:aws:s3:::bucket/*(末尾 /*
  • ListBucket の Resource はバケット自体 arn:aws:s3:::bucket* 無し)
  • バケットポリシー側で deny されているとユーザ側で許可しても 403

対処 4: PA-API (Amazon Product Advertising)

Amazon アソシエイト向け API は通常の AWS IAM とは別系統:

  • アソシエイト・セントラル → ツール → 商品リンク作成 → PA-API 5.0 で AccessKey / SecretKey 発行
  • 過去 30 日でアフィリエイト売上ゼロだとアクセス権剥奪 → 1 件発生で復活
  • Associate Tag (xxx-22 等) をリクエストに含める必要あり
  • レート制限: 1 TPS / 8640 TPD (アフィリエイト売上に応じて緩和)
// PA-API 5.0 公式 SDK 利用例
ApiClient client = Configuration.getDefaultApiClient();
client.setAccessKey("AKIA...");
client.setSecretKey("...");
client.setHost("webservices.amazon.co.jp");
client.setRegion("us-west-2");  // PA-API は us-west-2 固定

DefaultApi api = new DefaultApi(client);

SearchItemsRequest req = new SearchItemsRequest()
    .partnerTag("yourtag-22")     // ← Associate Tag 必須
    .partnerType(PartnerType.ASSOCIATES)
    .keywords("Java入門")
    .searchIndex("Books")
    .resources(Arrays.asList(
        SearchItemsResource.ITEMINFO_TITLE,
        SearchItemsResource.IMAGES_PRIMARY_LARGE));

SearchItemsResponse res = api.searchItems(req);

対処 5: 署名 v4 の典型ミス

自前で署名計算する場合の落とし穴:

ミス対処
リージョン名違い (us-east-1 と us-west-2)エンドポイント URL とリージョンを一致
タイムスタンプが UTC でないUTC で ISO8601 (20260517T120000Z)
クライアント時刻ずれ > 15 分NTP 同期
クエリ文字列のソート漏れキー名 ASC でソートしてから連結
x-amz-content-sha256 ヘッダ忘れS3 では必須

対処 6: API Gateway の場合

# API Key 必須エンドポイント
curl -H "x-api-key: YOUR_API_KEY" https://abc.execute-api.ap-northeast-1.amazonaws.com/prod/items

# IAM Auth 必須エンドポイント (SigV4)
aws apigateway get-rest-apis --region ap-northeast-1
# → SDK 経由で叩く

# Lambda Authorizer
# Authorization: Bearer xxx ヘッダの仕様を確認、Lambda 関数のログを CloudWatch で

セキュリティ注意

  • AccessKey を GitHub に push しない。事故ったら即無効化 + 連絡
  • ~/.aws/credentials ではなく IAM Role (EC2/ECS) / SSO を使う
  • 長期 AccessKey よりも STS 一時クレデンシャルを推奨
  • 本番では 最小権限の原則。広い * を避ける

FAQ

Q: コンソールから操作するとできるが、SDK だと 403
A: 別ユーザのキーを使っている可能性。aws sts get-caller-identity でユーザを確認。

Q: ローカルでは動くが Lambda で 403
A: Lambda 実行ロールに必要な権限が無い。AWSLambdaBasicExecutionRole に加え、対象サービスのポリシーを追加。

Q: PA-API で「TooManyRequests」が連続
A: 売上に応じてレート上限が変動。SDK のリトライ機能 + 指数バックオフで対応。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Your credentials do not allow access to this resource.
  2. Bad Authentication data.