daiphone’s blog

AWS / JavaScript / Docker / PHP / Python を中心とした技術ネタと、趣味少々

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でやってみようかなと思います。