AWS Organizationsでアカウントを50作って指定したOUに移動するスクリプト
AWS Organizationsでアカウントを50個作る必要がありましたので、Pythonスクリプトで実行しました。
OUに移動するまでを自動化しました。
目次
CLIで実行した場合の課題
1 2 3 4 5 |
aws organizations create-account \ --email lab1@example.com \ --account-name lab5 \ --role-name OrganizationAccountAccessRole |
アカウント作成の同時実行数が5ですので、作成完了を待たずに6以上になるとリクエスト拒否になります。
OUへの移動もしたいので、作成完了を待つ必要がありましたので、Python SDKのboto3で作成して実行しました。
GitHubにも置いてます。
Pythonのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import json import boto3 from botocore.exceptions import WaiterError from botocore.waiter import WaiterModel from botocore.waiter import create_waiter_with_client mail_prefix='workshop' mail_domain='example.com' source_parent_id='r-xxxxx' destination_parent_id='ou-xxxxxxx' start=1 stop=50 delay = 2 max_attempts = 30 waiter_name = 'AccountCreated' waiter_config = { 'version': 2, 'waiters': { 'AccountCreated': { 'operation': 'DescribeCreateAccountStatus', 'delay': delay, 'maxAttempts': max_attempts, 'acceptors':[ { "matcher": "path", "expected": "IN_PROGRESS", "argument": "CreateAccountStatus.State", "state": "retry" }, { "matcher": "path", "expected": "SUCCEEDED", "argument": "CreateAccountStatus.State", "state": "success" }, { "matcher": "path", "expected": "FAILED", "argument": "CreateAccountStatus.State", "state": "failure" } ], }, }, } waiter_model = WaiterModel(waiter_config) org = boto3.client('organizations') custom_waiter = create_waiter_with_client( waiter_name=waiter_name, waiter_model=waiter_model, client=org ) for i in range(start, stop+1): str_i = str(i) response = org.create_account( Email='{mail_prefix}{i}@{mail_domain}'.format( mail_prefix=mail_prefix, i=str_i, mail_domain=mail_domain ), AccountName='{mail_prefix}{i}'.format( mail_prefix=mail_prefix, i=str_i ), RoleName='OrganizationAccountAccessRole' ) print(response) create_account_request_id = response.get('CreateAccountStatus').get('Id') custom_waiter.wait( CreateAccountRequestId=create_account_request_id ) response = org.describe_create_account_status( CreateAccountRequestId=create_account_request_id ) account_id = response.get('CreateAccountStatus').get('AccountId') print(account_id) response = org.move_account( AccountId=account_id, SourceParentId=source_parent_id, DestinationParentId=destination_parent_id ) print(response) |
create_accountの後に、move_account してOUに移動したいのですが、create_account直後はまだアカウントIDもないし、作成も完了してないのでmove_accountできません。
そこでOrganizationsのWaiterを探します。
Organizationsには、Clientにget_waiterはありますが、そこで指定するWaiterのクラスはありません。
Waiterが用意されている場合は次のコードでも確認できるのですが、結果の配列は空でした。
1 2 3 4 |
import boto3 org = boto3.client('organizations') org.waiter_names |
検索してたら、create-account.pyに辿り着きまして、カスタムでWaiterを作成されてたので、そのまま使わせていただきました。
こうやってWaiterを作るのですね。
waiter_configでポーリング間隔や確認回数を指定して、CreateAccountStatus.StateがSUCCEEDEDになったらsuccessで、IN_PROGRESSの場合はretry、FAILEDはfailureとしてます。
waiter_configでモデルを定義して、create_waiter_with_clientでOrganizations Clientに関連付けてます。
create_accountレスポンスのCreateAccountStatusのリクエストIDに対してWaiterがポーリングして、successになるまで2秒ごとの再試行を20回繰り返して待ってくれました。
次にアカウントIDの取得ですが、ステータスが更新されたCreateAccountStatusをdescribe_create_account_statusにより現時点の情報を参照して取得しました。
これで無事OUにmove_accountできました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー」を執筆いたしました
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー」という本の第 …
-
-
AWS Systems Manager AutomationでEC2の自動停止
Systems Manager Automationがない時代に、Lambdaを …
-
-
webフォームからの問い合わせをRedmineに自動登録して対応状況を管理する(API Gateway + Lambda)
先日、検証目的で作成したRedmineの冗長化の一機能として、webフォームから …
-
-
Amazon Kinesis Data StreamsにTwitter検索データを送信する
Kinesis Data Streamsの作成 ストリーム名とシャード数を決定す …
-
-
Rocket.ChatにAPIで投稿するテスト(Postman)
トレーニング期間中で一時利用するチャットが欲しいなあと思い、Rocket.Cha …
-
-
CloudWatch Internet Monitor(プレビュー)を試しました
Amazon CloudWatch Internet Monitor プレビュー …
-
-
Pandocサーバーのコンテナイメージを作成する
マークダウンからEPUBへの変換をAWS Batchで行いたく、ECRにアップロ …
-
-
Route 53で不要なドメインを削除
勢いで作ったけど結局使うのをやめたドメインがあります。 要らないので削除しました …
-
-
CloudFrontのカスタムヘッダーがなければALBのルーティングで403レスポンスを返す
大阪リージョンにはWAFがまだないです(2021年4月現在) 今のこのブログの構 …
-
-
AWS WAFの個別ルールを設定する
Web ACLを選択して、[Add my own rules and rule …