Serverless Frameworkを使ってAPI Gatewayにx-api-keyを設定します。
x-api-keyとは
AWSがサポートする認証方法の1つ。
所定のキー(文字列)を所定HTTPヘッダ(x-api-keyヘッダ)に含めたリクエストであればアクセス許可、無ければアクセス拒否とする機能です。
serverless.ymlに追記
追加するのは大きく2つ。
provider.apiKeys
と functions内のメソッドのprivate
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形式で値を設定し
X_API_KEY: ENV1234567890
それをserverless.ymlで読み込みばOKです!
provider:
name: aws
region: ap-northeast-1
runtime: nodejs12.x
apiKeys:
- name: myFirstKey
value: ${file(./conf.yml):X_API_KEY}