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
関連記事
-
-
API Gateway Lambdaプロキシ統合で渡されるリクエストを確認しました
API Gatewayの統合リクエストでLambdaを指定するときにプロキシ統合 …
-
-
「Getting started with AWS Glue DataBrew」をやってみました
AWS Glue DataBrewを体験してみたくて、開発者ガイドのチュートリア …
-
-
Amazon S3オブジェクトロック
S3のオブジェクトロックを確認しました。 オブジェクトロックの有効化 現在、既存 …
-
-
AWS Certificate Manager証明書とAmazon Route 53でAmazon API GatewayのAPIのカスタムドメイン名前解決する
AWS Certificate ManagerとAmazon Route 53と …
-
-
CloudFrontからのバーチャルホストなサイトのテストってどうしてます?
このブログの構成です。 AWSで構築しています。 4つのサイトを1つのEC2で配 …
-
-
AtomエディタでEC2のファイルを直接編集する
Webページを編集していてEC2のファイルをvimエディタでさわったりしています …
-
-
CloudTrailのログファイルの整合性検証をAWS CLIで実行しました
CloudTrailのログファイルの検証を「有効」にしました。 上記のようなCl …
-
-
S3オブジェクトへのリクエストをCloudTrail, Athenaで識別する(パーティショニング)
Amazon S3オブエジェクトへのリクエストをCloudTrail, Athe …
-
-
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー」を執筆いたしました
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー」という本の第 …
-
-
AWSアカウント内のCloudWatchアラームを削除する
やりたいこと 特定アカウント特定リージョン内のCloudWatdchアラームを全 …