AWS CLIをAmazon Cognito(UnAuth)で認証して使用する
こんにちは、せーのです。今日はありそうで無かった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を作成します。
IDを任意で入力し、UnAuthのチェックを入れます。
AuthとUnAuthのロールの設定画面が出てくるので、ここでは両方新規で作成してみます。
これでIdentity Pool IDの作成は完了です。出てきてるサンプルコードからIdentity Pool IDをメモっておきましょう。
次に先程新規作成したUnAuthのロールにAWSリソースの操作権限をつけます。マネージメントコンソールよりIAMを開き、ロールタブより先程作成したUnAuthロールを選択します。
ポリシーを加えます。今回はプリセットとして用意されているマネージメントポリシーからS3のフルアクセス権限をつけてみます。
S3のFullAccessを選択し
これで準備はOKです。
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を使ってみることをおすすめします。