AWS CLIをAmazon Cognito(UnAuth)で認証して使用する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はありそうで無かったTipsを備忘録を含めてご紹介します。

Amazon Cognitoの使い方

Amazon Cognitoを使うとAWSリソースをAPI KEYなしに使用できるので漏洩の心配もなくセキュリティ的に非常に安心できます。 また使い方も簡単で、例えばAWS SDK for JavaScriptでAmazon Cognitoの認証をする場合は

AWS.config.region = "us-east-1";
  AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      AccountId: "123456789012",
      RoleArn: "arn:aws:iam::123456789012:role/Cognito_Unauth_Role",
      IdentityPoolId: 'us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
  });

とこれだけです(UnAuthの場合)。非常に便利。 ただ、AWS CLIでこれを使う場合には何ターンかやりとりが発生します。やり方さえ覚えてしまえばそんなに難しくはありません。

やってみる

Cognito: Identity Pool Idの作成

それではやっていきましょう。まずはマネージメントコンソールよりCognitoを開き、新規にIdentity Pool IDを作成します。

awsli_cognito1

IDを任意で入力し、UnAuthのチェックを入れます。

awsli_cognito2

AuthとUnAuthのロールの設定画面が出てくるので、ここでは両方新規で作成してみます。

awsli_cognito3

これでIdentity Pool IDの作成は完了です。出てきてるサンプルコードからIdentity Pool IDをメモっておきましょう。

awsli_cognito4

次に先程新規作成したUnAuthのロールにAWSリソースの操作権限をつけます。マネージメントコンソールよりIAMを開き、ロールタブより先程作成したUnAuthロールを選択します。

awsli_cognito5

ポリシーを加えます。今回はプリセットとして用意されているマネージメントポリシーからS3のフルアクセス権限をつけてみます。

awsli_cognito6

S3のFullAccessを選択し

awsli_cognito7

これで準備はOKです。

awsli_cognito8

AWS CLIを叩いてみる

それではAWS CLIを叩いてみましょう。順番としては

  • アカウントID、Identity Pool IDからIdentity IDを取得する
  • Identity IDからCredentialsを取得する
  • Credentialsをそれぞれ環境変数にセットする
  • S3を操作する

となります。尚JSONの加工にjqを使いますので持ってない人はインストールしておいて下さい。使い方がよくわからない人はここらへんの記事を参考にしてみてください。

ではまずIdentity IDを取得します。

$ aws cognito-identity get-id --identity-pool-id us-east-1:cf499f61-b5a4-4c65-b93c-58e2be74be1b --account-id 123456789012 --region us-east-1 --output text
us-east-1:74d2172d-8118-4182-baf2-6373bbfd5a96

返ってきたIdentity IDを使ってCredentialsを取得します。

$ aws cognito-identity get-credentials-for-identity --identity-id us-east-1:74d2172d-8118-4182-baf2-6373bbfd5a96 --region us-east-1 --output json
{
    "Credentials": {
        "SecretKey": "q3j8xBDYFXUGcbpTfoqjD+pasak6VCSEYLdOqJu6",
        "SessionToken": "AQoDYXdzECUaoAVq89rO4DefT/btMpMDoWU98+bohf25ya6Urxc5+QA7lpEgkU6mz03fu36DGVS/taux81ZVZ8iqvd92wpywOLfvY49xTTF/GNtiqZP6Muwgx+Emm4DC09Mw2Tl+JiqxMwvndwQnLgxB/pFwtNZdhHDhIl9k+kHtuOvKpi64E7LIYN0wpgFLg8GubNXVcQd8TBKyVVS53I0BH2gmsq2Uirww5xBdHJnx63OvkrfeJuM9Umlwy9Ak9V8/+PV5GARWvh9P4a84WDyhYLFat0jq1cUogN+ZTSVye1k7BMH4OvVAAD+l1juq/1dsODqjeSt+9A8q3KIO1CxbryYTh6DGRiWFryyfxgoASRcHx7fJ2sl51deGqzrPRVNdRyhFCj460XAGUgZpvn56DgEZLftSFAtu9q5Fipb9oViag6omwN5MTPMTsnpzN80GhQTifXhqv6f9Oy7SNhHuUF6CDWphDP9KU171UA7LmeBSjeJvJtU3A6j4YytR6XgoeQEKOZ8PHMYGNdhnnaPU2g3Q6l7mgmU2MFABMrQ//cmwcA/zj3okb6ZeRFwGuTMYDVIDfeUnse5WnL/gpfHkNSUnc0SOS0xdIvTCIFlRgHqRhrlt81gNlpsZANKgg7oQwvDyRD0j10gdcWP6KKx3FvCLLbvs520VzYWQe2WQV5s7hmjC0SKDP/AaNXQLln+48crG0GSjVTxlSLsVAiA+91OKs6uulvMOQKZoo72DWXNnRaM0U0iYXIsItfuA8A6YXGezjUbYoQHbywPwcU42TUzkhtkdng3ydby0nL8C6oHz0OONrXz8EqfpypIXItcLZF4yCT1Y9ufqUlqm/Hsiz4L8gMeamgWQKqrT3TKpNIoK5EgYAMoBAXQCAcrvWY+ckYivGcn+kswg3KrerwU=",
        "Expiration": 1442292588.0,
        "AccessKeyId": "ASIAIECBSX2WVYCWJRQA"
    },
    "IdentityId": "us-east-1:74d2172d-8118-4182-baf2-6373bbfd5a96"
}

[AccessKeyID][SecretKey][SessionToken]をそれぞれ環境変数にセットします。

$ export AWS_ACCESS_KEY_ID=ASIAIECBSX2WVYCWJRQA
$ export AWS_SECRET_ACCESS_KEY=q3j8xBDYFXUGcbpTfoqjD+pasak6VCSEYLdOqJu6
$ export AWS_SECURITY_TOKEN=AQoDYXdzECUaoAVq89rO4DefT/btMpMDoWU98+bohf25ya6Urxc5+QA7lpEgkU6mz03fu36DGVS/taux81ZVZ8iqvd92wpywOLfvY49xTTF/GNtiqZP6Muwgx+Emm4DC09Mw2Tl+JiqxMwvndwQnLgxB/pFwtNZdhHDhIl9k+kHtuOvKpi64E7LIYN0wpgFLg8GubNXVcQd8TBKyVVS53I0BH2gmsq2Uirww5xBdHJnx63OvkrfeJuM9Umlwy9Ak9V8/+PV5GARWvh9P4a84WDyhYLFat0jq1cUogN+ZTSVye1k7BMH4OvVAAD+l1juq/1dsODqjeSt+9A8q3KIO1CxbryYTh6DGRiWFryyfxgoASRcHx7fJ2sl51deGqzrPRVNdRyhFCj460XAGUgZpvn56DgEZLftSFAtu9q5Fipb9oViag6omwN5MTPMTsnpzN80GhQTifXhqv6f9Oy7SNhHuUF6CDWphDP9KU171UA7LmeBSjeJvJtU3A6j4YytR6XgoeQEKOZ8PHMYGNdhnnaPU2g3Q6l7mgmU2MFABMrQ//cmwcA/zj3okb6ZeRFwGuTMYDVIDfeUnse5WnL/gpfHkNSUnc0SOS0xdIvTCIFlRgHqRhrlt81gNlpsZANKgg7oQwvDyRD0j10gdcWP6KKx3FvCLLbvs520VzYWQe2WQV5s7hmjC0SKDP/AaNXQLln+48crG0GSjVTxlSLsVAiA+91OKs6uulvMOQKZoo72DWXNnRaM0U0iYXIsItfuA8A6YXGezjUbYoQHbywPwcU42TUzkhtkdng3ydby0nL8C6oHz0OONrXz8EqfpypIXItcLZF4yCT1Y9ufqUlqm/Hsiz4L8gMeamgWQKqrT3TKpNIoK5EgYAMoBAXQCAcrvWY+ckYivGcn+kswg3KrerwU=

これでOKです。S3を叩いてみます。

$ aws s3 ls
2015-09-15 12:52:49 testchao2suke

バケット名が返ってきました。成功です。

これらをシェルでまとめるとこんな感じになります。

#!/bin/bash

echo `date --rfc-3339 ns` "get temporary credentials"

identityid=`aws cognito-identity get-id --identity-pool-id us-east-1:cf499f61-b5a4-4c65-b93c-58e2be74be1b --account-id 123456789012 --region us-east-1 --output text`
bx1credentials=`aws cognito-identity get-credentials-for-identity --identity-id $identityid --region us-east-1 --output json`

api_key=`echo $bx1credentials | jq -r '.Credentials.AccessKeyId'`
api_secret=`echo $bx1credentials | jq -r '.Credentials.SecretKey'`
security_token=`echo $bx1credentials | jq -r '.Credentials.SessionToken'`

echo $api_key
echo $api_secret

export AWS_ACCESS_KEY_ID=$api_key
export AWS_SECRET_ACCESS_KEY=$api_secret
export AWS_SECURITY_TOKEN=$security_token

まとめ

いかがでしたでしょうか。AWSの操作をバッチで書く時にAPI KEYを埋め込みたくない、という場合があるかと思います。 その際にはこんな感じでカジュアルにCognitoを使ってみることをおすすめします。