Cognito Identity Pool 未認証ユーザーで、一時クレデンシャルを AWS CLI を使って取得してみる

# はじめに

Amazon Cognito では、Identity Pool と呼ばれる AWS に対する認可を管理するサービスがあります。Google や Facebook, Open ID Connect などを IdP (Identity Provider) として認証されたユーザーを、AWS に対する認可のための機能が提供されています。

Identity Pool では、認証済みのユーザーはもちろんですが、未認証のユーザーに対する一時的なクレデンシャルの発行を行うことが出来ます。今回は、この未認証のユーザーとして一時的なクレデンシャルを取得する方法を検証してみます。



# Cognito Identity Pool の作成

まず、Cognito Identity Pool を作成します。Cognito の画面を開き、Federated Identities を選択します。

![image-20211219014811872.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3419bf56-447a-28ef-ee80-0b35814fbfc7.png)



Create を押します

![image-20211219014929767.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dd7053f7-61b8-9fd7-687e-90014d74c75c.png)



次のパラメータを入れて、Create Pool を押します。

- Identity Pool の名前を入れる
- 未認証のユーザーを有効にする

![image-20211219015020282.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/534aafac-41f5-cc96-289a-7d0e54e1e5cc.png)



このまま Allow を押します

![image-20211219015130475.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0143cdb7-4017-4aab-c045-432e6609e3c6.png)



作成されたので、右上の Edit identity pool を押して、ID や IAM Role 名を確認します。

![image-20211219015341596.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/65b111ad-4bfe-2fa9-7ca1-f7c4d8f5e329.png)



2つの情報を確認できます

- Identity Pool の ID (現在は削除済みです) 
- Unauth 用の IAM Role 名

![image-20211219015508226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0c27fbac-93c5-4733-5ade-d236cb7736be.png)



# IAM Role の権限確認

自動作成された IAM Role を見ると、IAM Policy が確認できます。ユースケースに合わせて最小限の権限を付与してあげるといいでしょう。

![image-20211219032813480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c45cab58-9969-480b-14a9-c6b4bae4f78f.png)



# AWS CLI で一時クレデンシャルを取得

AWS CLI を使って未認証のユーザーとして一時クレデンシャルを取得します。まず、get-id コマンドを呼びだして、Identity Pool から Identity ID を取得します。

```
aws cognito-identity get-id \
--identity-pool-id "ap-northeast-1:fc81b5de-4fa4-4087-adb5-4598fd25982a"
```



実行結果です。`ap-northeast-1:5f1564f8-cfb7-459f-baa7-881631728f6b` が Identity Pool から払い出された Identity ID です。認証していないので、未認証ユーザーとして払い出されています。

```
> aws cognito-identity get-id \
  --identity-pool-id "ap-northeast-1:fc81b5de-4fa4-4087-adb5-4598fd25982a"
{
    "IdentityId": "ap-northeast-1:5f1564f8-cfb7-459f-baa7-881631728f6b"
}
```



払い出された Identity ID を使って、再度 Identity Pool に一時クレデンシャルをリクエストします

```
aws cognito-identity get-credentials-for-identity \
--identity-id "ap-northeast-1:5f1564f8-cfb7-459f-baa7-881631728f6b"
```



実行結果です。AccessKeyId, SecretKey, SessionToken, Expiration が返ってきています。Expiration が1時間になっているので、発行してから1時間のみ利用できる状態です。それ以降は利用できません。

```
> aws cognito-identity get-credentials-for-identity \
  --identity-id "ap-northeast-1:5f1564f8-cfb7-459f-baa7-881631728f6b"
{
    "IdentityId": "ap-northeast-1:5f1564f8-cfb7-459f-baa7-881631728f6b",
    "Credentials": {
        "AccessKeyId": "xxxxxxxxxxxxxx",
        "SecretKey": "yyyyyyyyyyyy",
        "SessionToken": "zzzzzzzzzzz",
        "Expiration": "2021-12-19T04:37:18+09:00"
    }
}
```



# 一時クレデンシャルを使って、認証情報を確認

環境変数に取得してきた3つの値を設定します。

```
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyy
export AWS_SECURITY_TOKEN=zzzzzzzzzzz
```



`aws sts get-caller-identity` コマンドで、利用している IAM Role などの情報を確認できます。

```
aws sts get-caller-identity
```



実行結果です。Identity Pool を作成した時に自動生成された Unauth Role として認識されていることがわかります。1時間のみ利用可能なクレデンシャルを使っているので、有効期限が切れた後には使えなくなります。

```
> aws sts get-caller-identity
{
    "UserId": "AROAVNVNXMHCORZTLZO7Q:CognitoIdentityCredentials",
    "Account": "xxxxxxxxxxxx",
    "Arn": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/Cognito_TestIdentityPoolforUnauthUnauth_Role/CognitoIdentityCredentials"
}
```



今回の記事では、Unauth Role に権限付与はしていませんが、例えば S3 関連の権限を付与することで、一時的にデータをアップロードするようなことも可能です。



# まとめ

Cognito Identity Pool を使って、未認証のユーザーでも1時間だけ有効なクレデンシャル情報を取得できることがわかりました。これにより、IAM User を作った永続的なクレデンシャルが不要になり、セキュリティのレベルを向上できます。今回は、AWS CLI での動作確認でしたが、AWS SDK でも同様なことが可能なので、プログラムの中で利用することも可能です。