背景
- CloudRunで簡単な認証付きAPIを作りたい
- 認証はAPIキーを渡す方式にしたい
- できれば、ヘッダーでAPIキーを渡したい
- API Gatewayで構築していきます
- 似たサービスとしてCloudEndpointがありますが、ESPの扱いが面倒なのでAPI Gatewayにしました
- この辺りのお話は↓が参考になりました
流れ
- CloudRunアプリ作る
- 認証なしのAPI Gateway -> CloudRun の環境を用意する
- 認証設定を行う
- クエリパラメーターにAPIキーを渡す場合
- ヘッダーにAPIキーを渡す場合
CloudRunアプリ作る
まずはCloudRunアプリを作ります.
以下のクイックスタートを参考にするといいかも.
CloudRun作成時に以下の設定にします
- Ingressの制御は"すべて"
- 認証は"認証が必要"
認証なしのAPI Gateway -> CloudRun の環境を用意する
次にAPI Gatewayのチュートリアルを参考に API Gateway -> CloudRunの 認証なしのAPI構成を作ります。
endpointが"/"のみのシンプルなPathのアプリの場合、Configのyamlは以下のようになります
swagger: '2.0'
info:
title: sample this_is_test
description: Sample API on API Gateway with a Cloud Run backend
version: 1.0.0
schemes:
- https
produces:
- application/json
x-google-backend:
address: https://sample-xxxx-an.a.run.app
paths:
/:
get:
summary: Cloud Run hello world
operationId: hello
responses:
'200':
description: A successful response
schema:
type: string
生成されたGatewayURLでリクエストすると認証なしのリクエストなので以下のような表示になるはずです
認証設定を行う
クエリパラメーターにAPIキーを渡す場合
http://example.com?key=xxxxx
のようにクエリパラメータにAPIキーを渡す場合の設定をしていきます
API Keyの生成
まずはAPI Keyの生成をします
API Keyはメモしておきます
Gateway Configを認証付きで作り直す
Gateway Configに認証設定を追加したものを用意します.
- securityの項目を追加してます
- serucityDefinitionsの項目を追加してます
swagger: '2.0'
info:
title: sample by_query_params
description: Sample API on API Gateway with a Cloud Run backend
version: 1.0.0
schemes:
- https
produces:
- application/json
x-google-backend:
address: https://sample-xxx.a.run.app
paths:
/:
get:
summary: Cloud Run hello world
operationId: hello
security:
- api_key: []
responses:
'200':
description: A successful response
schema:
type: string
securityDefinitions:
api_key:
type: "apiKey"
name: "key"
in: "query"
こちらの動画が参考になりました.
こちらの設定でGatewayConfigを作り直して、API Gatewayに紐付けます.
テスト
先ほどメモしたAPIキーをつけてリクエストするとアクセスできるはずです
https://sample-gateway-xxxx.an.gateway.dev/?key=YOUR_API_KEY
ヘッダーにAPIキーを渡す場合
次にヘッダーにAPIキーを渡す場合の設定をしていきます
Gateway Configの認証設定をheader用に変更して作り直す
Gateway Configにヘッダー用の認証設定を追加したものを用意します.
- parameters の設定にheader項目を追加します. nameは任意ですが、
x-api-key
とします. -
securityDefinitions.api_key.in
の値は header にします
swagger: '2.0'
info:
title: sample by_header
description: Sample API on API Gateway with a Cloud Run backend
version: 1.0.0
schemes:
- https
produces:
- application/json
x-google-backend:
address: https://sample-xxx.a.run.app
paths:
/:
get:
summary: Cloud Run hello world
parameters:
- in: "header"
name: "x-api-key"
required: true
type: string
operationId: hello
security:
- api_key: []
responses:
'200':
description: A successful response
schema:
type: string
securityDefinitions:
api_key:
type: "apiKey"
name: "key"
in: "header"
以下の記事が参考になりました
こちらの設定でGatewayConfigを作り直して、API Gatewayに紐付けます.
テスト
先ほどメモしたAPIキーをつけたcurlを実行すると確認できます
curl -X GET -H "x-api-key: API_KEY" "https://xxxx.an.gateway.dev"