[解決済み] AWS(およびStackOverflow)の新機能。 AWSでラムダサービスを作成しようとしていますが、認証や制限なしでAPIゲートウェイ経由で外部からアクセスします。
物事を簡単にするために、今はゲートウェイをモックに設定します。
APIのGetメソッドでは、認可はNone
に設定され、APIキーはnot required
です。
これを試すと、{"message":"Forbidden"}
(実際のラムダサービスに接続すると同じメッセージが表示されます)が表示されます。
アクセス可能にする方法に関するアドバイスはありますか?ありがとう
「APIキーが必要」オプションをtrueに設定した場合は、以下を確認してください。
API Gatewayダッシュボードで[リソース]を選択し、[アクション]をクリックして[APIのデプロイ]を選択します。最初の展開の前に返される応答は{"message":"Forbidden"}
のみです。
カスタムドメイン名を使用し、宛先ステージングの選択を忘れると、Forbidden
メッセージが表示されます。
Custom Domain Names
に移動して、ドメインの下のEdit
をクリックし、Base Path Mappings
の下のステージを選択します。
同様の問題が発生しましたが、次の問題がありました。
また、物事を簡単にするための承認も制限も設定しませんでした。
各ステージ(dev、staging、prod)にBase Path Mappingsを追加することで問題を修正できました。
「API」キーをtrueに設定する場合、APIキーをヘッダーとして渡す必要があります。
APIキーはヘッダーフィールド「x-api-key」として渡されます。このフィールドをヘッダーに追加した後でも、この問題が発生する場合があります。その場合、以下の点を検証してください
メソッドのAuthorization
とAPI KEY Required
の両方がtrueに設定されている場合、リクエストの送信中に次のヘッダーがあることを確認してください。
APIテストにはPOSTMAN
を使用しますが、これは非常に信頼性が高いので、簡単です。
注:API KEY REQUIRED
をFALSEに設定した場合は、x-apiキーヘッダーを追加しないでください。 AUTHORIZATION
をFALSEに設定している場合は、Authorizationヘッダーを追加しないでください。
これは明らかではないかもしれませんが、AWS API Gatewayを使用するときに「禁止」エラーが表示される別の理由は、デプロイされたAPIメソッドに対応しない不正なURLを呼び出している可能性があります。実際に間違ったURLにアクセスしている場合(たとえば、https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users
(dev
の前にusers
ステージを呼び出す)ではなく、https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users
(ステージなし)を呼び出した場合に発生する可能性があります。 403を取得します。
ところで:https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users
を呼び出してhttps://9999xx9x99.execute-api.us-east-1.amazonaws.com/user
にデプロイすると(単数形に注意してください)、403も取得されますが、「Missing Authentication Token」メッセージが表示されます。
この問題の解決策を見つけたかもしれません。 MacOSでも同じ問題が発生しました。 DNSのフラッシュを試みましたが、その後はうまくいきました!
ターミナルでこれを試してください:
Mac OS X Yosemite以降
Sudo killall -HUP mDNSResponder
Mac OS X Yosemite v10.10〜v10.10.3
Sudo discoveryutil mdnsflushcache
Mac OS X Mavericks、Mountain Lion、Lion
Sudo killall -HUP mDNSResponder
Mac OS X Snow Leopard
Sudo dscacheutil -flushcache
遅すぎるかもしれませんが、API Gatewayが「禁止」メッセージを出す理由の1つは、GET操作でリクエスト本文にデータを渡すときです。この問題を解決するには、リソースをPOSTにするか、リクエスト本文にデータを渡さないようにします。
API GatewayのプライベートAPIにアクセスしようとするnginx fargateサービスからこのエラーが発生しました。このような私のAPIのリソースポリシーの下にポリシーを追加する必要がありました
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:<AccountID>:<RestApiID>/*",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "<VPC Endpoint ID for execute-api>"
}
}
}
]
}
ローカルファイアウォール/ウイルス対策またはNGIPS(Cisco Bluecoat)。後者は私の場合で、APIからCloudWatchでログを取得することさえしませんでした。私のトップレベルドメインでホストされたウェブサイトを許可していましたが、ブラウザのネットワーク開発ツールタブにボディのないapi
サブドメインをブロックしていました。
API Gatewayで{message:forbidden}を受け取った場合、いくつかのことを行う必要があります。
CORS有効?
APIキーが有効ですか?
それでも問題が解決しない場合は、私またはクラウドの第一人者である@levarneがお手伝いできるようにお知らせください。
KongをAPIゲートウェイとして使用したときに、本番環境でこの問題に直面していました。 Postmanから開始された場合、リクエストはthroを通過しましたが、Codeを介して開始された場合、403で失敗しました。 Kongのボットプラグインが有効になり、ユーザーエージェントヘッダー値に基づいてブラウザーまたはモバイルアプリから開始された要求のみが許可されました。Httpクライアントを介して開始された要求は失敗しました。ボットプラグインを無効にすると、エラーは発生しませんでした。ユーザーエージェントがApache-HttpClient/4.5.2(Java/1.8.0_91)の場合、リクエストが許可されるようになりました。
EndpointConfigurationをPRIVATEに設定したAPIで{"message":"Forbidden"}
を取得し、VpcのプライベートサブネットでVpcEndpointを作成しました(これはサービス間APIです)
{"message":"Forbidden"}
を取得した理由は、VpcEndpointのURLの1つを使用する必要があるという印象を受けていたためです。使用するURLは、まだステージに関連付けられているものです(ApiGatewayコンソール内)。それは:
https://${RestApiId}.execute-api.${Region}.amazonaws.com/${StageName}