API Gateway で作成した API の認証方法として API キーを使用する場合に、簡単に API キーを生成できるようなシェルスクリプトを作ってみました。

目次

概要

既に API Gateway で API が作成されていることを前提とします。そして、シェルスクリプトで実現するのは、下記の内容です。

  • 使用量プランの作成
  • API キーの生成と使用量プランへの関連付け

使用量プランの作成 については CloudFormation テンプレートを使用して作成します。

API キーの生成と使用量プランへの関連付け はシェルスクリプトを使って実現します。

今回紹介するシェルスクリプト内では、 AWS CLI のコマンドを実行しているので、 AWS CLI のインストールおよびクレデンシャルの設定は済んでいることを前提としています。動作確認した AWS CLI のバージョンは、 1.17.7 および 2.0.0 です。

また、今回紹介するシェルスクリプト内では jq コマンドを使用しているので、それもインストールされていることを前提とします。

詳細

では、それぞれのシェルスクリプト、および CloudFormation テンプレートをみていきます。

使用料プランの作成

使用量プランの作成には、下記のような CloudFormation テンプレートを使用します。ファイル名は api-usage-plan.yml としておきます。

AWSTemplateFormatVersion: "2010-09-09"
Description: "API Gateway - usage plan template."

Parameters:
  TargetApiId:
    Type: String

Resources:
  UsagePlan:
    Type: "AWS::ApiGateway::UsagePlan"
    Properties:
      ApiStages:
        - ApiId: !Ref TargetApiId
          Stage: api
      Description: Usage plan for API
      UsagePlanName: ApiUsagePlan

Outputs:
  UsagePlanID:
    Description: ID of created usage plan
    Value: !Ref UsagePlan

このテンプレートのデプロイには、下記のようなスクリプトを使用します。ファイル名は 01-api-usage-plan.sh として、上記のテンプレートと同じディレクトリに配置します。

#!/bin/bash

CHANGESET_OPTION="--no-execute-changeset"

if [ $# = 1 ] && [ $1 = "deploy" ]; then
  echo "deploy mode"
  CHANGESET_OPTION=""
fi

CFN_TEMPLATE="$(dirname $0)/api-usage-plan.yml"
CFN_STACK_NAME=ApiUsagePlan

aws cloudformation deploy --stack-name ${CFN_STACK_NAME} --template-file ${CFN_TEMPLATE} --parameter-overrides ChaliceDeployedApi=${TARGET_API_ID} ${CHANGESET_OPTION}

if [ $# = 1 ] && [ $1 = "deploy" ]; then
  echo "\n----------------------------------------------\n"
  echo "Following string is ID of created usage plan. Use it for creating api key belongs to an usage plan.\n"
  aws cloudformation describe-stacks --stack-name ${CFN_STACK_NAME} | jq ".Stacks[0].Outputs[0].OutputValue" | sed -E "s/\"//g"
fi

TARGET_API_ID には事前に対象の API ID を環境変数として設定しておきます。

$ export TARGET_API_ID=<your-target-api-id>

そして、下記のコマンドでテンプレートをデプロイします。

$ sh ./01-api-usage-plan.sh deploy
deploy mode

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - ApiUsagePlan

----------------------------------------------

Following string is ID of created usage plan. Use it for creating api key belongs to an usage plan.

abc123

デプロイに成功すると、作成された使用量プランの ID (abc123) が出力されます。

ちなみに、テンプレートをデプロイするためのこのシェルスクリプトは、以前に下記のセッションで紹介されており、良さそうだなと思ったので今回使ってみました。

コマンドの引数に deploy の文字列を渡していますが、これを渡さなかった場合は CloudFormation の change set のみが作成され、実際にリソースは作成されません。

API キーの生成と使用量プランへの関連付け

API キーの生成と使用量プランへの関連付けは、次のような流れになります。

  1. API キーを生成する
  2. 生成した API キーを使用量プランに関連づける

ステップが 2 段階あるので、手作業だと面倒です。これを下記の 1 つのスクリプトでやってしまいます。ファイル名は generate_api_key.sh とします。

#!/bin/bash

if [ $# != 2 ] || [ $1 = "" ] || [ $2 = "" ]; then
  echo "Two parameters are required"
  echo ""
  echo "1st : string for API Key name (ex. user1)"
  echo "2nd : string for Usage Plan ID (ex. abc123)"
  echo ""
  echo "example command"
  echo "\t$ sh ./generate_api_key.sh user1 abc123"
  exit
fi

API_KEY_NAME=$1
USAGE_PLAN_ID=$2

# create api key
CREATE_RES=$(aws apigateway create-api-key --name $API_KEY_NAME --enabled)
CREATED_API_KEY_ID=$(echo $CREATE_RES | jq ".id" | sed -E "s/\"//g")
CREATED_API_KEY_VALUE=$(echo $CREATE_RES | jq ".value" | sed -E "s/\"//g")

# add api key to usage plan
ADD_RES=$(aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN_ID --key-id $CREATED_API_KEY_ID --key-type API_KEY)
ADDED_KEY_ID=$(echo $ADD_RES | jq ".id" | sed -E "s/\"//g")

if [ $ADDED_KEY_ID != $CREATED_API_KEY_ID ]; then
  echo "Failed to generate a API Key"
  exit
fi

echo "API Key generated successfully."
echo $CREATE_RES | jq "."

スクリプト内にも説明を書いていますが、次のように使用します。

$ sh ./generate_api_key.sh api-user-1 abc123
API Key generated successfully.
{
  "id": "aa11bb2222",
  "value": "5pdADt75RU24blTbviyZq8o1XjmR9rwB9NlRggnx",
  "name": "api-user-1",
  "enabled": true,
  "createdDate": "2020-02-17T20:45:03+09:00",
  "lastUpdatedDate": "2020-02-17T20:45:03+09:00",
  "stageKeys": []
}

成功すると、生成された API キーの情報が出力されます。

まとめ

API Gateway で作成した API の認証方法として API キーを使用する場合に、簡単に API キーを生成できるようなシェルスクリプトを作ってみた話でした。

シェルスクリプト内では AWS CLI のコマンドを実行しているだけですが、ひとつのスクリプトにしておくことで手作業の手間が省けるのは大きいですね。また、諸々の操作をコマンド化しておくことで、もしその操作を CI/CD に組み込むことになった際にも、比較的簡単に導入ができそうです。

CloudFormation 楽しいおじさんになりつつあるとともに、 AWS CLI 楽しいおじさんにもなりつつあります。


以上、よっしー (michimani) でした。

Share to ...

このエントリーをはてなブックマークに追加

Follow on Feedly


comments powered by Disqus