【無料で】クラロワAPIをlambdaから叩いてLINEに送る

以前、[クラロワAPIをlambdaから叩いてLINEに送る](https://qiita.com/meihei/items/98a21ac0b41fe7193e40) という記事を書きました

システム自体はこちらで完成なのですが、結構お金がかかるという問題がありました

この問題の原因はクラロワAPI（[Clash Royale API](https://developer.clashroyale.com/#)）がアクセス可能なIPを制限しているため生じていました
今回、RoyaleAPIが提供している公開Proxyを使うことで、**無料でクラロワAPIをlambdaから叩いてLINEに送る**ことが出来たので記事にしていきます

## 概要
### 完成したもの

以前の記事と全く同じで、`プレイヤー名`と`放置している期間`がLINEに届きます

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280373/4b15322a-6fb8-75ae-bced-bf6e5a91c59c.png)

### 構成

![aws-and-cr-using-proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280373/c1b96ddb-f0e9-eb9e-7314-e628e2c8ae55.png)

クラロワAPIはIPアドレスを指定する必要がありますが、RoyaleAPIのProxyを使うことでAWS側でIPアドレスを固定する必要がなくなりました

## RoyaleAPIのProxy
### RoyaleAPIについて
- [https://royaleapi.com/](https://royaleapi.com/)

一言でいうと、**公式に一番近い非公式な存在**です
アップデート情報をいち早く伝えたり、プレイデータの統計をとって公開したりなど、クラロワユーザーなら一度は耳にしたことがあるかと思います

また現在では停止していますが、クラロワの公式APIが提供される前から非公式APIを提供していました



### 使い方
[ドキュメント](https://docs.royaleapi.com/#/proxy)に書いてある通りです

1. クラロワAPIのKeyの作成時に`128.128.128.128`のアドレスを許可する
2. リクエストを送るURLの`api.clashroyale.com`を`proxy.royaleapi.dev`へ書き換える

### セキュリティ
「公開Proxyは危険」という意見は多々見受けられます

- [[個人情報抜き取り事件] 公開プロキシサーバは絶対に、絶対に使っちゃダメ](https://plaza.rakuten.co.jp/shophunter/diary/201504170000/)
- [悪質な「公開プロキシー」に注意、パスワードなどを盗まれる恐れあり](https://xtech.nikkei.com/it/article/NEWS/20080227/294879/)

ここで述べられる危険性は仰る通りであり、頭の中に入れておいて下さい

RoyaleAPIのProxyを経由する情報は、`ヘッダーにあるクラロワ公式のAPIキー`と`APIから取得したデータ`になります
APIキーは無料で制限もないですし、取得するデータも秘密にしたいわけではないので、そこまで問題ないかと思います（個人的な意見です）

便利さを取るか、セキュリティと取るか、は個人の判断におまかせします

## クラロワAPIのKeyの作成
[developer.clashroyale.com](https://developer.clashroyale.com/#)の右上の名前のところから`My Account`を選択し、`Create New Key`から新しい鍵を作成します

`ALLOWED IP ADDRESS`に`128.128.128.128`を指定します

![スクリーンショット 2021-01-03 15.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280373/7a782098-f035-dac0-5834-38e2e80b768a.png)

`Create Key`で鍵を生成して、出来たtokenを保存します

![スクリーンショット 2021-01-03 15.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280373/edcce8ba-e055-4204-69ad-3bd1ce437d3b.png)

## 実装（以前からの変更）
[以前のコード](https://github.com/meihei3/cr-lambda-services/tree/main) と [変更後のコード](https://github.com/meihei3/cr-lambda-services/tree/royale-api-proxy) の変更箇所について説明します

変更点以外の説明は[以前の記事](https://qiita.com/meihei/items/98a21ac0b41fe7193e40#lambda関数の作成デプロイserverless-framework)を参照して下さい

### APIのBASE_URLを変更
```python
# 変更前
CR_BASE_URL = 'https://api.clashroyale.com/v1'
# 変更後
CR_BASE_URL = 'https://proxy.royaleapi.dev/v1'
```

### `serverless.yml`の不要な箇所を削除
```yaml
  # VPCのロールに関する記述を削除
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "ec2:CreateNetworkInterface"
        - "ec2:DescribeNetworkInterfaces"
        - "ec2:DeleteNetworkInterface"
      Resource:
        - "*"

  # VPCのセキュリティグループに関する記述を削除
  vpc:
    securityGroupIds:
      ${env:VPC_SECURITY_GROUP_IDS}
    subnetIds:
      ${env:VPC_SUBNET_IDS}
```

### APIキーを変更
`.env`ファイルにAPIキーを追加

```
CR_ACCESS_KEY_EIP=[以前のAPIキー]
CR_ACCESS_KEY_PROXY=[今回作成したAPIキー]
```

`serverless.yml`で設定しているAPIキーの環境変数を変更

```
# you can define service wide environment variables here
  environment:
    # 変更前
    CR_ACCESS_KEY: ${env:CR_ACCESS_KEY_EIP}
    # 変更後
    CR_ACCESS_KEY: ${env:CR_ACCESS_KEY_PROXY}
```

最後に`serverless deploy`を実行すれば完了です

## 終わりに
RoyaleAPIさんのおかげて、何でも楽にやってくれるLambdaさんに戻ってくれました

RoyaleAPIは有志が運営しているサイトです。[Donateページ](https://royaleapi.com/donate)から支援することが出来ます
また、クリエーターコード`RoyaleAPI`でも支援することが出来ます

今回の構成はRoyaleAPIのおかげで無料で出来ています。是非クリエーターコード等で支援してあげましょう！