ロゴテキスト ロゴ

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

    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キー」という項目から確認可能です

    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}
    プロフィールの背景画像 プロフィール画像
    Yuki Takara
    都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。