1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloud Run + API Gateway でAPIキー認証のリクエストを行う

Posted at

背景

  • 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でリクエストすると認証なしのリクエストなので以下のような表示になるはずです

スクリーンショット 2023-10-24 13.51.12.png

認証設定を行う

クエリパラメーターに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"
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?