SORACOM FunkのIAMロール認証情報対応を試す

SORACOMで好きなサービスはSORACOM Funkな人です。

----

2021/5/21に、SORACOM　Funkに以下のアップデートがありました。
[SORACOM FunkがIAMロール認証情報に対応、AWSのベストプラクティスに沿ったAWS Lambdaの実行が可能となりました](https://blog.soracom.com/ja-jp/2021/05/12/support-iam-role-with-soracom-funk-credential/)

今までは、認証情報ストアに、IAMユーザーのアクセスキーとシークレットキーを登録して呼び出していたのですが、
IAMのAssume Roleを使った認証方法に変わったということで、早速変更してみました。

## IAMロール認証機能って？
AWSの公式ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-user.html)
これによってできるのが、AssumeRoleによる権限委譲ですね。

## Assume Roleって？
Amazon STSの機能の1つで、IAMロールを他のアカウントなど、第三者に委任させる機能です。
なお、IdPプロバイダーを使ったSAML連携もありまして、
`Assume Role With SAML` と呼ばれています。

複数アカウント持っている場合などで、

## 設定してみる
では設定してみましょう。
※ここで出てくる画面は2021年5月現在のものになります。

### AWS側
AWSコンソールのIAMの画面でロールを選択し、右ペイン上部の[ロールの作成]をクリックします。
![スクリーンショット 2021-05-12 21.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/8548d37b-65e0-6abc-3b20-9c43a3f65169.png)

最初の画面、「信頼されたエンティティの種類を選択」にて、「別のAWSアカウント」を選択します。
![スクリーンショット 2021-05-12 21.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/21f573ad-3dd9-2d78-a3ec-e591edde6b8c.png)
![スクリーンショット 2021-05-12 21.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/65a12e3d-9303-2275-b147-b2224c748ddc.png)

アカウントIDの部分には、公式ページに記載の通り、ソラコムさんのアカウントIDを入力します。
ガバレッジごとに違うので、注意です。

 ```
アカウントIDを入力します。SIMグループのカバレッジに応じて以下のとおり入力します。
日本カバレッジ: 762707677580
グローバルカバレッジ: 950858143650
```
利用するSIMは日本カバレッジのSIMグループに属するSIMなので、 `762707677580` を入力します。

![スクリーンショット 2021-05-25 12.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/34e55019-bea4-9ee6-d53e-0afb964e5290.png)

外部ID(External ID)を設定します。
前述したassumeRole時に、パラメータとして、外部ID（--external-id）を指定することで、より強固に権限委任ができます。
外部に漏れないようにご注意ください。
ああ、きっとFunkの中で、AWSのSDKのassumeRoleを実行していると思うんですが、その際パラメータにexternalId指定してるんでしょうねぇ・・・って思った人です。

![スクリーンショット 2021-05-25 11.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/865ad915-5a01-3826-e84c-bbb683308f3d.png)

次の画面では、ポリシーをアタッチします。すでに用意されているのであれば、既存のポリシーを検索して、それをアタッチします。
ない場合は、[ポリシーの作成]をクリックして、ポリシーの作成を行います
（別ダブで開くので、ロールの画面はそのままで！）
![スクリーンショット 2021-05-12 21.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/407268cc-8427-4201-0577-66bb1be6269a.png)

画面で作成もできますが、JSON貼り付けの方が楽かなと思います。
![スクリーンショット 2021-05-12 21.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/efe563b5-b98c-ab43-48c2-411268cbbccf.png)

JSONタブを選ぶと、入力フィールドが出てくるので、以下のJSONを貼り付けます。
![スクリーンショット 2021-05-25 12.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/13bee510-f364-2ecc-1200-3f86f0101e99.png)

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "soracomFunkRole",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```
このロールではLambdaが実行できる権限さえあればいいので、`lambda:InvokeFunction`が`Allow(許可)`されていればOKです。（今までもそうだったはず）
`Resource`が `"*"`なっていますが、ベストプラクティス的には、個別のLambdaを指定した方がいいでしょうね。

![スクリーンショット 2021-05-12 21.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/7efa9d50-b5bd-f1a2-2a3b-766b33a5f1d2.png)

あとは、確認画面で、名前と説明(いれなくてもいいです)をいれて、完了です。

![スクリーンショット 2021-05-12 21.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/453b9ea5-8a56-8452-4eb3-c8694e540233.png)
![スクリーンショット 2021-05-12 21.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/be6a68a0-f387-a6a9-0edf-75ffedb65dfb.png)

ロールの作成画面に戻って、作ったポリシーを検索して、アタッチします。出てこないようなら、[リロードボタン]を押してみましょう。
![スクリーンショット 2021-05-12 21.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/6007e0f3-5f69-6c68-40c4-6a6c70968c08.png)
![スクリーンショット 2021-05-12 21.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/5d90c5ef-6948-c676-6e1a-d05ea29d5f38.png)

こちらも確認画面で、名前と説明(いれなくてもいいです)をいれて、完了です。
![スクリーンショット 2021-05-12 21.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/3b867882-28a1-84a9-8307-017ce17b1ba8.png)

完成したら、できたロールのARNをコピーしておきましょう。
![スクリーンショット 2021-05-12 21.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/ade9221f-823a-8a88-f15d-470973fc48ad.png)

次はSORACOM側です。

### SORACOM側
認証情報の登録は、
- SIMグループ設定のSORACOM Funkの画面で登録
- セキュリティ設定画面の認証情報ストア
で設定可能です。

種別で「AWS IAMロール認証情報」を選ぶと、ロールのARNと外部IDを入力するフィールドが出てきます。
![スクリーンショット 2021-05-12 21.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/ec7fccec-d3aa-3966-b0e9-08122bc9c69b.png)

認証情報ID、コピーしたロールの`ARN`とロール作成時に設定した`外部ID`を入力します。
![スクリーンショット 2021-05-12 21.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/4aa1714e-c7d0-c99e-b76a-428f712463e3.png)

作成が終わったら、
Funkの設定画面で、`認証情報`として作成した`AWS IAMロール認証情報`を指定して保存すればOKです。
![スクリーンショット 2021-05-12 22.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/683fad68-cf74-100f-2ed1-6b7e82cc06de.png)

あとは、設定したSIMグループにいるデバイスから、Funk経由でAWS Lambdaが呼び出せればOKです！

簡単ですね！

## まとめ
もともと、FunkからLambdaを呼び出す際は、Lambdaの実行権限(invokeFunction)があればいいはずなので、
設定してあるアクセスキー、シークレットキーが何らかの要因で漏洩したとしても大きな影響はないと思いますが、
今回のIAMロール認証機能により、よりセキュアにFunkからLambdaを実行できるようになりました。
設定自体も簡単ですので、積極的にIAMロール認証機能に使っていきたいと思います。
まだ全部設定変更かけてないので、早急に設定変更する予定です。

## 終わり
ソラコムさん、来月には[大規模イベント](https://www.discovery.soracom.jp/)も控えていますが、どんな新サービスが発表されるのか期待しかないですねー。