この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、筧( @TakaakiKakei )です。
AWS Organizations 間の AWS アカウント移動に取り組んでおり、新しい組織から別組織のメンバーアカウントに招待を送る処理の自動化にまず取り組みました。 今回はその内容についてご紹介します。
前提
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から実施する必要があります。
今回は冒頭の記載通り、3の招待処理の自動化についてご紹介します。
コード紹介
実装したコードを汎用的にしたものを紹介します。
src/handlers/organizations.py
from aws_lambda_powertools import Logger
from mypy_boto3_organizations import OrganizationsClient
from mypy_boto3_organizations.type_defs import (
InviteAccountToOrganizationResponseTypeDef,
)
logger = Logger(child=True)
class OrganizationsService:
def __init__(self, client: OrganizationsClient):
self._client = client
def invite_account(self, target_accountid: str) -> str:
# refs: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/organizations.html#Organizations.Client.invite_account_to_organization
resp: InviteAccountToOrganizationResponseTypeDef = (
self._client.invite_account_to_organization(
Target={"Id": target_accountid, "Type": "ACCOUNT"}
)
)
handshake_id: str = resp["Handshake"]["Id"]
return handshake_id
- invite_account_to_organization メソッドを利用しています。
- handshake_id は新しい組織に移動する際に利用するので値として返しています。
- 以下の内容は本筋ではないので無視いただいて結構です。
- 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)
target_accountid = "123456789012" # 招待対象の AWS アカウント
handshake_id = org_service.invite_account(target_accountid)
上記コードは実行例です。こちらもブログ用にアレンジしています。 Client オブジェクト生成するためのクレデンシャル情報は、SecretManager などから参照しましょう。 target_accountid は、event から渡すのが良さそうですね。
おわりに
最後まで読んでいただきありがとうございます。
他ステップの処理についても、今後実装でき次第、ご紹介できればと思います。
それではまた!