[Boto3 Adv-Cal DAY6]IAMを利用して、作成したユーザのAccessKeyIdとSecretAccessKeyを取得してみる

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。6日目はIAMにてユーザの作成、及びAccessKeyIdとSecretAccessKeyの取得へ挑戦しました。
2018.12.06

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

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。

boto3のドキュメントを通して、サービス別にどういった事が出来るのかを理解したり、管理コンソールを通さずにTerminalだけで完結できるように検証していくことが目的になります。

6日目はIAMを使ってユーザの作成及びAccessKeyId等の情報生成をしてみました。

目次

boto3を通してIAMで出来ること

ドキュメントは下記リンク先です。

ざっくりと以下のことができます。

  • ユーザの操作(作成・削除)
  • アクセスキーの操作(作成・削除)
  • ロールの操作(作成・削除・付与)

他にも多数の操作が出来ますが、一覧化がし難いため興味のある方は上記リンクから辿ってみてください。

今回の操作

指定した名前でユーザを作成し、 AccessKeyIdとSecretAccessKeyを合わせて取得してみます。

  1. ユーザの作成
  2. AccessKeyIdとSecretAccessKeyの取得
% python main.py --user_name test
Input Profile name [default]>> advent_calendar
test:
  AccessKey:XXXXXXXXXXXXXXXXXXXX
  SecretAccessKey:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

main.py

import boto3
import os
import re
import argparse

class IAMAccessStatusWizard:
    _client_name = 'iam'
    _session = None

    def __init__(self, profile_name):
        elf._session = boto3.Session(profile_name=profile_name)

    @property
    def session(self):
        return self._session

    def get_client(self, client_name=None):
        if not client_name:
            client_name = self._client_name
        return self.session.client(client_name)

    @property
    def client_name(self):
        return self._client_name

    def create_user(self, user_name):
        params = {
            'UserName': user_name,
        }
        return self.get_client().create_user(**params)

    def create_access_status(self, user_name):
        params = { 
            'UserName': user_name
        }
        return self.get_client().create_access_key(**params)

    @classmethod 
    def prompt_user_name(cls):
        user_name = None
        while True:
            user_name = input('\nInput user name >>')
            if user_name and len(user_name) != 0:
                break
        return user_name

    @staticmethod
    def prompt(user_name):
        default_profile_name = 'default'
        profile_name = input('Input Profile name [{}]>> '.format(default_profile_name))
        if len(profile_name) == 0:
            profile_name = default_profile_name
        wizard = IAMAccessStatusWizard(profile_name)

        if (not user_name) or len(user_name) == 0:
            user_name = wizard.prompt_user_name()
        user = wizard.create_user(user_name)
        access_status = wizard.create_access_status(user['User']['UserName'])
        print_template = '{UserName}:\n  AccessKey:{AccessKeyId}\n  SecretAccessKey:{SecretAccessKey}'
        print_params = access_status['AccessKey']
        print(print_template.format(**print_params))

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--user_name')
    args = parser.parse_args()
    IAMAccessStatusWizard.prompt(args.user_name)

UserNameとAccessKeyId

各種発行及び更新操作で必要になることが多いパラメータでした。

MFA

二段階認証に関して、以下の操作を行うための呼び出し手段があります。

  • MFAデバイスの有効化
  • MFAデバイスの同期

いずれもTeminalでの実行で完結させる場合は、1Password CLI等が別途必要になります。

まとめ

開発用のユーザ及びAccessKeyIDをまとめて発行する場合には有効な手段になると思われます。

IAMの操作で出力される情報には秘匿性を高く求められるものもあるため、取扱には十分注意しましょう。