Amazon Web Services ブログ

AWS Organizationsを利用したアカウント作成の自動化

こんにちは、ソリューションアーキテクトの千葉です。

本日はAWS Organizationsを利用したAWSアカウントの作成・管理の自動化方法についてご紹介します。

AWS Organizationsは、組織内のAWSアカウントを統合管理し、セキュリティを高めることができるサービスです。サービスコントロールポリシー (SCP)を利用することで、組織内のAWSアカウントに実行を許可するサービスとアクションを一元的に管理することができます。
AWS Organizationsのもう一つの特徴は、APIを通じて組織配下に新しいAWSアカウントを作成することができることです。これまでは、AWSアカウントを新たに作るにあたって、AWSアカウント作成、連絡先情報入力、お支払情報入力、(必要に応じて)一括請求設定といった手順をマニュアルで実施する必要がありましたが、AWS Organizationsを利用すればこれらの操作はCreateAccountというたった一つのAPIに置換えられます。

AWS Organizationsで作成されたメンバーアカウントには、マスターアカウントのユーザーからアクセス可能なIAMロールが自動作成されます。AWS Security Token Service (STS)を利用してこのIAMロールにアクセスする一時的なセキュリティ認証情報を取得し、AWS Command Line Interface (CLI)AWS SDKsを使って作成したメンバーアカウントに対して共通設定を施したり、定期的な環境チェックを実行したりすることができます。

それでは、アカウント作成およびSTSを利用したアカウント環境設定の手順を説明していきます。

 

メンバーアカウントの作成

まずは組織配下にメンバーアカウントを作成します。操作を実行するIAMユーザーまたはIAMロールには、以下のようにOrganizationsを操作する権限を与えておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                 "organizations:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

CreateAccountのパラメーターには、アカウント名およびEmailアドレスを指定する必要があります。IamUserAccessToBillingパラメーターはメンバーアカウントのIAMユーザーにBilling情報へのアクセスを許可するかどうかの設定で、デフォルトでALLOWになっています。RoleNameパラメーターはメンバーアカウントに作成されるIAMロールの名前で、何も指定しなければOrganizationAccountAccessRoleという名前が割り当てられます。

import boto3
orgs = boto3.client('organizations',region_name='us-east-1')
createAccountRequest = orgs.create_account(
    "AccountName": "string",
    "Email": "string",
    "IamUserAccessToBilling": "string",
    "RoleName": "string"
    )

メンバーアカウントの作成は非同期でおこなわれるため、CreateAccountAPIのレスポンスに含まれるリクエストIDを指定してDescribeCreateAccountStatusを実行し、アカウント作成のステータスをトラッキングします。

createAccountRequestId = createAccountRequest["CreateAccountStatus"]["Id"]
while orgs.describe_create_account_status(CreateAccountRequestId=createAccountRequestId)["CreateAccountStatus"]["State"] != 'SUCCEEDED':
        time.sleep(5)

ステータスが”SUCCEEDEDになればメンバーアカウントの作成は完了です。DescribeCreateAccountStatusのレスポンスは以下のとおりです。AccoutIdは後の手順で利用します。

{
   "CreateAccountStatus": { 
      "AccountId": "string",
      "AccountName": "string",
      "CompletedTimestamp": number,
      "FailureReason": "string",
      "Id": "string",
      "RequestedTimestamp": number,
      "State": "string"
   }
}

 

STSを利用したメンバーアカウントの操作

STSは、AWS リソースへアクセスする一時的な認証情報を提供する機能です。STSの利用方法の詳細はこちらのドキュメントを参照してください。一時認証情報取得にはSTSのAssumeRoleアクションを実行する必要があるので、以下の操作を実行するマスターアカウントのIAMユーザー/IAMロールには以下のIAMポリシーを付与しておいてください。<MemberAccountId>には前手順で取得したメンバーアカウントのAWSアカウントIDを指定します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::<MemberAccountId>:role/OrganizationAccountAccessRole"
  }]
}

STSのAssumeRoleアクションを実行し、一時的な認証情報を取得します。

import boto3
from boto3.session import Session

sts = boto3.client('sts')
assumeRoleResult = sts.assume_role(
        RoleArn = 'arn:aws:iam::<MemberAccountId>:role/OrganizationAccountAccessRole',
        RoleSessionName = 'OrgMasterRoleSession'
        )

accessKeyId = assumeRoleResult["Credentials"]["AccessKeyId"]
secretAccessKey = assumeRoleResult["Credentials"]["SecretAccessKey"]
sessionToken = assumeRoleResult["Credentials"]["SessionToken"]

続いて、取得した一時認証情報でメンバーアカウントを操作するセッションを生成します。regionパラメーターはこの後実行する操作に合わせて指定してください。

session = Session(
        aws_access_key_id=accessKeyId,
        aws_secret_access_key=secretAccessKey,
        aws_session_token=sessionToken,
        region_name='us-east-1'
        )

あとはこのセッションを利用してメンバーアカウントに対して操作をおこなうだけです。OrganizationAccountAccessRoleにはAdministratorAccessポリシーがアタッチされているため、STSをサポートしているアクションであればすべて実行可能です。

試しに作成したメンバーアカウントに対してBillingアラートを設定してみましょう。

sns = session.client('sns')
cloudwatch = session.client('cloudwatch')
    
#create sns topic
snsTopicArn = sns.create_topic(Name='DefaultBillingAlertTopic')["TopicArn"]
sns.subscribe(
    TopicArn=snsTopicArn,
    Protocol='email',
    Endpoint=<YourEmailAddress>
    )

#create billing alert
alertName = 'DefaultBillingAlart'
cloudwatch.put_metric_alarm(
    AlarmName=alertName,
    AlarmDescription=alertName,
    ActionsEnabled=True,
    AlarmActions=[snsTopicArn],
    MetricName='EstimatedCharges',
    Namespace='AWS/Billing',
    Statistic='Maximum',
    Dimensions=[
        {
           'Name': 'Currency',
           'Value': 'USD'
        },
        ],
   Period=21600,
   EvaluationPeriods=1,
   Threshold=100,
   ComparisonOperator='GreaterThanOrEqualToThreshold'
   )

まとめ

リソースをプログラマブルに管理できることは、AWSを利用する大きな利点のひとつです。AWS Organizationsを利用することで、AWSアカウントについてもプラグラマブルに管理することが可能です。今回はBillingアラートを設定する例をご紹介しましたが、AWS CloudTrailAWS Configなどの有効化、AWS CloudFormationを利用した標準構成のデプロイなど、お客様がAWSアカウントを作成時に実行している操作を自動化することができます。ぜひOrganizationsを活用したアカウント管理をお試しください!

 

注1:SCPの権限制御は、アタッチされたアカウントのrootユーザーを含む、すべてのユーザーに影響を与える可能性がある強力な機能です。既存のアカウントに対してOrganizationsを適用する場合、SCPの動作を事前に検証し、実行する操作が既存環境に影響が出ないことを確認した上で有効化してください。

注2:Organizationsで作成したメンバーアカウントは削除することができませんのでご注意ください。