AWS CLIでMFA認証を行ってコマンドを実行できるようにする

2022/06/12に公開

AWS CLIコマンドでリソースを操作しようとしたらエラー

該当のサービスに対してポリシーをアタッチして権限を付与しAWS CLIでコマンドを実行すると、以下のようなエラーが発生しました。

An error occurred (AccessDenied) when calling the xxxx operation: User: arn:aws:iam::1111:user/xxxx is not authorized to perform: xxxx:xxxx on resource: arn:aws:xxxx:::xxxx/xxxx with an explicit deny in an identity-based policy

権限は付与しているのになんでだろうと調べていて時間を溶かしつつあったので、チームの人に相談しました。
すると、MFA(多要素認証、二段階認証)をしていないんじゃない?と指摘をもらって原因に気づけました。

MFAの設定をしていると、AWS CLIでもMFA認証をしないといけません。

認証方法

認証するには、MFAのトークンを取得するコマンド叩きます。arnはIAMユーザーページの「MFAデバイスの割り当て」の値を入れます。

$ aws sts get-session-token --serial-number [arn] --token-code 123456

{
    "Credentials": {
        "AccessKeyId": "ASIAWLAVRUB24SJWQDVA",
        "SecretAccessKey": "DamTJRajFVQj0S87eW8ReUL03p4Ay0POorao5JcT",
        "SessionToken": "IQoJb3JpZ2luX2VjEDgaDmFwLW5vcnRoZWFzdC0xIkYwRAIga/t6wYLaijV5PN7dN42tA1GejtAJst02NDFVFb6pr44CIF5po14ZMktnMcvdVmP2v5oWXQmJUZbyxtffkORD4ClQKu8BCBEQAhoMNDM1OTg0Mzc1OTI1IgyzAQneWrulkRhSIGUqzAHYYI2IuaLLcuo+65kGAdqIyJbq5g3sjnVhiVcG5tA0KvsgZ/DCkh5Nt0C/49uLseqAkEvAX0pPJ1Ql5xuU5dF6hpr7up+oYMY/QtdwZu+N1lRVN3LmizrGDozHSd2HWUvH4qJLL54/AiMMUZv7S+sPOKLdSTy0bbDKYHaYRJqFVXA0ijvmZXLi0HBAKgzaO62mRDnbSOVK55BFPP1eXSTUF9UZhBTm/0gFRyjqWHOMy0/uieffF70vM4enAIN6l7nyMjqJ7J1t4cYXISMwz77okwY6mQHRaxD5IaDkorZorGaKrycenZq3t0YPtH5XiU/oP/c+qOByRSjjno1j03/WWRCLqUztiSkfPURCl/tm5yKEaFToRXqVqbG0vtQxUbGlzoX0OJQgH+vv8BXqd86DHJ0r+7zzVczO4T/0nb8A7CKXJ6gCUuNpwaA31zD55UaKTn5X+VxnNv8SvVfS94cdoYnSnMsyJMUMh2+PIYU=",
        "Expiration": "2022-05-10T20:16:15+00:00"
    }
}

そうするとCredentialsの情報が帰ってくるので、exportするとAWS CLIでサービスの操作ができます。

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx
$ export AWS_SESSION_TOKEN=xxxxxxxxxxxxxxx

頻繁にコマンド実行してexportするようなら、シェルスクリプトでトークンコード入れたらexportまでする処理を書いて面倒さの軽減もできそうですね。

参考

AWS CLI 経由で MFA を使用してアクセスを認証する

Discussion