GWが終わりましたね、たいがーです。
みなさんは、GWをどのようにお過ごしでしたか?私は家族で長野に旅行に行ったり、アルバイトをしたりと、何かとバタバタしたGWでした。
長期間明けへの対策を
期間が空くと忘れてしまいがちなものです。前回の出勤から実質2週間空いてしまったので、忘れてはいないだろうか・・・と少し心配していました。
インターンの一日は朝の会議から始まります。朝の会議に私も参加させていただいていて、今日何をするか、困っていることなどを話します。
今日はGW明けで前に触ってからしばらくたってしまったので、思い出すところから始めます、と話すと、金曜日や連休前に、今週は何をしていたか、次は何をしようとしているかを箇条書きにしておくことをおすすめしていただきました。
メモ程度に書いておくだけでもいいかなと思ったので、Slackの自分のところに書こうかな・・・
さて、思い出しながら今日の課題を進めていきます!
コマンド引数で個数を指定しよう
前回、各ハンズオンのアカウントのIAMユーザーのクレデンシャル(アクセスキー、シークレットアクセスキー)を取得し、ローカルにテキストファイルとして格納するという課題を行いました。
今回はそれに加え、コマンド引数を使って、コマンド引数で指定した数だけのアカウント情報だけを取得します。
GW中に少しだけPythonを触っていたので、コマンド引数のやり方はなんとなく覚えていました。
import sys
args = sys.argv
args[i]
iにコマンド引数の何番目を指定するかを入力します。
for文を使って、指定した個数分のクレデンシャルを取得します。今回、アカウントのクレデンシャル情報はaccount_infosにリスト型で格納しています。なので、0番目からコマンド引数で指定した順番までを選択します。
for i in account_infos[0:int(args[1])]:
前回はそれぞれのクレデンシャル情報を各アカウントの番号のフォルダに入れていましたが、今回はさらに、credentialsという名前のフォルダを作成し、先ほど作ったフォルダを入れていきます。すでに同じ名前のフォルダが存在していてもエラーが出ないように設定し、すべてのファイルを格納できるようにします。
前回ではファイルへの権限を与えるコマンドをos.chmodと打っていましたが、os.mkdir()でもモードを指定して書くことができるようなので、前回の分も書き換えていきます。
os.mkdir(new_dir_path, 755)
new_path = shutil.move('accesskey.txt', new_dir_path)
os.makedirs('credentials', 755, exist_ok=True)
move_path = shutil.move(new_dir_path, 'credentials')
これで、指定した数のハンズオンアカウントのクレデンシャル情報をファイルに格納することができました。
今日も今日とて…
インターンシップ期間中、今のところ一日一回以上はGitでエラーを発生させています。今日も、詰まりました。もう少しコメントを足したほうがわかりやすいかと思い、こちらのコードを触り、もう一度commitすると発生…commitする前にもっと確認するくせをつけようと思います。
来週はなくなれば・・・いいなぁ・・・
STSって何ですか!!!
今後なのですが、STS対応をしたいと思っています。
と、最初社員の方に言われた時、AWSのシステムではない、何か別のものだと思い、調べたら、魔法少女系の何かが出てきました・・・
AWS Security Token Service(STS)を使用すると、一時的なクレデンシャル情報を発行でき、よりセキュアにできるそうです。
今まで、それぞれのアカウント情報をコード内に書き込んでいたところも多くあったので、それらを減らしていこう、ということです。
実際にホワイトボードに図を書いていただき、解説していただきました。
ほかのアカウントに認証情報を取る指令を出すためのIAMユーザーを作成。このアカウントのポリシーはAssume Roleのカスタムポリシーのみを付与し、必要最低限のところにだけ接続できるようにする。
IAMロールを使い、ほかのアカウントにポリシーを付与する。
とりあえず、一つのアカウントを動かし、クレデンシャル情報を出力するところまでやってみます。
試しに一つ、出力しようとする
boto3のライブラリのSTSの部分を見てみます。
今後、ほかのアカウントでも利用するためにそれぞれのロールのarnをYAMLファイルに格納します。YAMLファイルはこのように書いていきます。
1: 'arn:aws:iam::XXXXX:role/XXXXX'
2: 'arn:aws:iam::XXXXX:role/XXXXX'
3: 'arn:aws:iam::XXXXX:role/XXXXX'
Pythonのコード内でYAMLファイルの中身をとってくるため、このように書きます。
with open('config.yml', 'r') as yml:
config = yaml.load(yml)
これで、YAMLファイルの中身はconfigに代入されます。IAMはリージョンが関係ないですが、余分なリージョン情報が入っていたため、なかなかエラーがきえず、苦戦しました。まず、一つのアカウントで一時的なクレデンシャル情報を取得することができました。
次にこれらをfor文で回し、以前作成した、すべてのインスタンスを停止するスクリプトに活かしていきたいと思います。
そのために、configデータがどのような形で出力されるか確かめてみると、辞書型でした。
欲しい部分は : 以下、つまり辞書型の値(value)の部分でfor文を回すため、このように書きます。
for i in config.values():
response = client.assume_role(
RoleArn=i,
RoleSessionName='XXXXXXXXX'
)
このようにすることで、うまくいったと思ったのですが、assume roleがaccess deniedされているというエラーが出ていました・・・今日中にこちらは解決できず、終了しました。
まだまだ、べた書き
エラーが消えたら、このコードもリファクタリングを進めていけたらなと考えています。
やはり関数化してかけないと、ほかの方から見にくいだろうなと、休み明け、久しぶりに自分のコードを見て思いました…
最近は意識して、コメントを入れたりするようになったり、ほかの方からの見やすさも意識しつつ、書けるようになってきました。とりあえず、直近の目標は、すらすら関数化ができるようになること、Gitでエラーを出してつまらないことの二つです。がんがん触って、慣れていこうと思います!