Serverless Frameworkでx-api-keyを設定する

2020.11.08
Serverless Frameworkでx-api-keyを設定する

Serverless Frameworkを使ってAPI Gatewayにx-api-keyを設定します。

x-api-keyとは

AWSがサポートする認証方法の1つ。

所定のキー(文字列)を所定HTTPヘッダ(x-api-keyヘッダ)に含めたリクエストであればアクセス許可、無ければアクセス拒否とする機能です。

Amazon API GatewayでAPIキー認証を設定する | Developers.IO より参考

serverless.ymlに追記

追加するのは大きく2つ。
provider.apiKeysfunctions内のメソッドのprivate

serverless.yml
provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs12.x
  apiKeys:
    - myFirstKey #名前はAPIGatewayでの名前

functions:
  hello:
    handler: src/handler.hello
    events:
      - http:
          path: hello
          method: get
          private: true #privateがある場合はAPIキーが必須に

この2つを追記するだけで x-api-key を必要に出来ます。

確認

AWSにデプロイします。
途中 api keys が出力されます、問い合わせ時に必要になるためメモ。

$ npx sls deploy -v
・・・
Service Information
service: xxxxxxxxxxxxxxxx
stage: dev
region: ap-northeast-1
stack: xxxxxxxxxxxxxxxx
resources: 38
api keys:
  myFirstKey: KDKiEahxsRadXML1j7VRB3oJnW5gCvRG3rN1hUEk
endpoints:
  GET - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hello
・・・

あとは表示された値を使って問い合わせればOK!

$ curl --request GET \
  --url https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hello \
  --header 'x-api-key: KDKiEahxsRadXML1j7VRB3oJnW5gCvRG3rN1hUEk'
{
  "message": "Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!"
  ・・・
}



API Gatewayでは「APIキー」という項目から確認可能です

拡張

この設定方法だと毎回x-api-keyが変わります。


1回目

$ npx sls deploy -v
・・・
api keys:
  myFirstKey: KDKiEahxsRadXML1j7VRB3oJnW5gCvRG3rN1hUEk
・・・

2回目

$ npx sls deploy -v
・・・
api keys:
  myFirstKey: 1LMAA5R0Gi8JU5BnoMiSanpwK8L2WY3Cm3zFWX10
・・・

x-api-keyを固定する

x-api-keyの値を固定するには apiKeys.value に値を設定します

provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs12.x
  apiKeys:
    - name: myFirstKey
      value: abcd1234567890

外部ファイルを使う

直接値を serverless.yml に書きたくないので、別ファイルに値を書きます。

別ファイルからの読み込みにServerless Frameworkでは「yml」と「json」をサポートしています。

It is important that the file you are referencing has the correct suffix, or file extension, for its file type (.yml for YAML or .json for JSON) in order for it to be interpreted correctly

Serverless Variables より引用

ここではプロジェクト直下に conf.yml を用意して読み込んでみます

$ tree -L 1
.
├── conf.yml
├── serverless.yml
・・・



conf.ymlにkey:value形式で値を設定し

conf.yml
X_API_KEY: ENV1234567890

それをserverless.ymlで読み込みばOKです!

serverless.yml
provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs12.x
  apiKeys:
    - name: myFirstKey
      value: ${file(./conf.yml):X_API_KEY}

おすすめ