AWSのCLIによるMFA認証を対話形式のshellで半自動化してみる
はじめに
前回の投稿に引き続き、AWS CLI関連です。 bonjourdaiphone.hatenablog.com
毎回「token取得」→「環境変数にセット」とするのが面倒だったので、 shell scriptで実装してみました。 今回は対話形式にしてみました。
Code
#!/bin/bash # sh ./InteractiveAwsMfaAuthorization # start program echo "Please input your accountId" read accountId echo "Please input your userName" read userName echo "Please input token code for authentication" read tokenCode json=`aws2 sts get-session-token --serial-number arn:aws:iam::$accountId:mfa/$userName --token-code $tokenCode` echo "set to variables" AWS_ACCESS_KEY_ID=`echo $json |jq -r '.Credentials.AccessKeyId'` AWS_SECRET_ACCESS_KEY=`echo $json |jq -r '.Credentials.SecretAccessKey'` AWS_SESSION_TOKEN=`echo $json |jq -r '.Credentials.SessionToken'` echo "\n------ Please confirm your environment vriable ------" echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY echo $AWS_SESSION_TOKEN echo "\n------ Please input these commands below if you are using bash. ------" echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" echo "export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" echo "\n------ Please input these commands below if you are using fish. ------" echo "set -x AWS_ACCESS_KEY_ID $AWS_ACCESS_KEY_ID" echo "set -x AWS_SECRET_ACCESS_KEY $AWS_SECRET_ACCESS_KEY" echo "set -x AWS_SESSION_TOKEN $AWS_SESSION_TOKEN"
実行方法
こちらのshell scriptを任意の場所に置き、実行します。
$ sh ./InteractiveAwsMfaAuthorization.sh Please input your accountId -> 012345678901 #AWSのアカウントID Please input your userName -> hogehogeuser #ログイン用ユーザーID Please input token code for authentication -> 123456 #MFA Code set to variables ------ Please confirm your environment vriable ------ AWS_ACCESS_KEY_ID= FTGYHUIJRFTGYHU AWS_SECRET_ACCESS_KEY= seyufuaiefjadufhufeufaef67 AWS_SESSION_TOKEN= feyufasjiHFUiFJIFjoejfesjfhfdfhuseufsfybfujsfa//////////fweufuah4wkfhu4efeuafhk4ggalifja;f'ag9ejgautfybunckmscaffds ------ Please input these commands below if you are using bash. ------ export AWS_ACCESS_KEY_ID=FTGYHUIJRFTGYHU export AWS_SECRET_ACCESS_KEY=seyufuaiefjadufhufeufaef67 export AWS_SESSION_TOKEN=feyufasjiHFUiFJIFjoejfesjfhfdfhuseufsfybfujsfa//////////fweufuah4wkfhu4efeuafhk4ggalifja;f'ag9ejgautfybunckmscaffds ------ Please input these commands below if you are using fish. ------ set -x AWS_ACCESS_KEY_ID FTGYHUIJRFTGYHU set -x AWS_SECRET_ACCESS_KEY seyufuaiefjadufhufeufaef67 set -x AWS_SESSION_TOKEN feyufasjiHFUiFJIFjoejfesjfhfdfhuseufsfybfujsfa//////////fweufuah4wkfhu4efeuafhk4ggalifja;f'ag9ejgautfybunckmscaffds
出力されたコマンドをお使いのshellに合わせた形で実行し、環境変数をセットする。
確認
$ set -x AWS_ACCESS_KEY_ID FTGYHUIJRFTGYHU $ set -x AWS_SECRET_ACCESS_KEY seyufuaiefjadufhufeufaef67 $ set -x AWS_SESSION_TOKEN feyufasjiHFUiFJIFjoejfesjfhfdfhuseufsfybfujsfa//////////fweufuah4wkfhu4efeuafhk4ggalifja;f'ag9ejgautfybunckmscaffds $ aws2 ec2 describe-vpcs { "Vpcs": [ { "CidrBlock": "xxx.xx.x.x/16", "DhcpOptionsId": "dopt-xxxxxxx", "State": "available", "VpcId": "vpc-xxxxxxx", "OwnerId": "123456789012", "InstanceTenancy": "default", "CidrBlockAssociationSet": [ { "AssociationId": "vpc-cidr-assoc-xxxxxxxx", "CidrBlock": "xxx.xx.x.x/16", "CidrBlockState": { "State": "associated" } } ], "IsDefault": true } ] }
無事取得できてますね。
補足
なぜ対話形式か?
最初はshell scriptに引数として、accoutId等をつけて実行していましたが、そうすると、historyに残ってしまうため、安全面を考慮して対話形式にしました。
あとは、みんなに配布する際に理解しやすいかなと思って。笑
個人でやるなら、変数に格納するコマンドをどこかにコピペしといて、毎回tokenCodeだけ変更する形でもいいと思います。
まあ結論、好みですね笑
環境変数にセットする部分もshell scriptファイル内でできるのでは?
ご存知の方もいると思いますが、shell script内で環境変数にセットすると
スコープがそのファイル内になってしまうため、ファイルの処理がすべて終了すると、
セットした環境変数は消えます。
直接shellの設定ファイル(.bash_profile等)を書き換えるのもありですが、その部分は人によってまちまちだと思ったので
今回は含んでおりません。
まとめ
最近インフラを触るようになってきて、コマンドを叩いてアレコレする機会が増えました。
shell scriptで自動化することを試したい気持ちもあったのですが、他のブログを見てみると、Pythonでshellを叩いて自動化したりしてるみたいですね。
今回はshell scriptで実装しましたが、今後はPythonでやってみようかなと思います。