AWS Organizations の新しい組織にメンバーアカウントを加入する処理を自動化してみた
はじめに
こんにちは、筧( @TakaakiKakei )です。
最近は、AWS Organizations 間の AWS アカウント移動の自動化に取り組んでいます。 先日は AWS Organizations の API を利用して、組織招待・組織離脱の処理を自動化しました。
今回は、新しい組織にメンバーアカウントを加入する処理の自動化に取り組んだので、その内容についてご紹介します。
前提
AWS Organizations 間の AWS アカウント移動にはいくつかステップがあります。 下記に主なステップを列挙します。
- 移動に伴うリソースや請求に関する検討事項を確認する
- メンバーアカウントが既存の組織を離れることでリソースが削除されることなどがあります。詳しくは公式ドキュメント参照ください。
- 2 つの AWS Organizations 間でアカウントを移動する
- 既存組織からメンバーアカウントを削除するための条件を満たす。
- 連絡先情報の提供, 支払い方法の提供, サポートプランの選択, 電話番号認証が必要です。詳しくは公式ドキュメント参照ください。
- Removing a member account from your organization - AWS Organizations
- 新しい組織からメンバーアカウントに招待を送信する。
- 既存組織からメンバーアカウントを削除します。
- メンバーアカウントで新しい組織への招待を受け入れます。
上記に加えて、AWS Control Tower の利用有無に応じた処理や、利用 API の制限についても検討が必要でしょう。
AWSアカウントのOU移動はOrganizationsでも可能ですが、Control Towerへの登録が失敗となるためService Catalogから実施する必要があります。
今回は冒頭の記載通り、5の組織加入処理の自動化についてご紹介します。
コードの紹介
実装したコードを汎用的にしたものを紹介します。
from aws_lambda_powertools import Logger from mypy_boto3_organizations import OrganizationsClient logger = Logger(child=True) class OrganizationsService: def __init__(self, client: OrganizationsClient): self._client = client def join_account(self, handshake_id: str) -> None: # refs: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/organizations.html#Organizations.Client.accept_handshake self._client.accept_handshake(HandshakeId=handshake_id) return
- accept_handshake メソッドを利用しています。
- 成功した場合のレポスンスは None です。
- 以下の内容は本筋ではないので無視いただいて結構です。
- aws_lambda_powertools 関連
- mypy_boto3_organizations 関連
import boto3 from src.services.organizations import OrganizationsService # メンバーアカウント上で Client オブジェクト生成 org_client = boto3.client( "organizations", aws_access_key_id="YOUR_ACCESS_KEY", aws_secret_access_key="YOUR_SECRET_KEY", aws_session_token="YOUR_SESSION_TOKEN", ) org_service = OrganizationsService(client=org_client) handshake_id = "h-examplehandshakeid111" org_service.join_account(handshake_id)
上記コードは実行例です。こちらもブログ用にアレンジしています。 Client オブジェクト生成するためのクレデンシャル情報は、SecretManager などから参照しましょう。 handshake_id は組織招待時に返されるIDを指定します。
from unittest.mock import MagicMock from src.services.organizations import OrganizationsService FIXUTRE_HANDSHAKE_ID = "h-examplehandshakeid111" class OrganizationsService: def test_join_account(self): # setup mock_client = MagicMock() mock_client.join_account.return_value = None sut = OrganizationsService(client=mock_client) # exercise resp = sut.join_account(FIXUTRE_HANDSHAKE_ID) # verify assert resp is None mock_client.accept_handshake.assert_called_once_with( HandshakeId=FIXUTRE_HANDSHAKE_ID )
ユニットテストコードも紹介しておきます。 本テストの目的は導線テストになります。
おわりに
最後まで読んでいただきありがとうございます。
今回で組織招待・組織離脱・組織加入の自動化が一通り完了しました。 既存組織からメンバーアカウントを削除するための条件を満たすところで、電話認証やクレジットカード登録があり、そこも含めた自動化は現状難しそうですが、今後できるようになることを期待して待ちたいと思います。
それではまた!