AWS CLIからOrganizationsのサービス連携や管理者の委任を操作してみた

更新操作はOrganizationsの管理アカウントだけが実行可能です
2023.01.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS OrganizationsはOrganizationsのアカウントに対して各種AWSサービスをシームレスに連携できます。 また、サービスの管理をOrganizationsの管理アカウントからメンバーアカウントに委任できます。

具体的には、Organizations配下のアカウント全体でSecurityHubを有効化し、セキュリティ専用アカウントに管理を委任するといったことができます。

この操作をAWS CLIから行う方法について紹介します。

まとめ

  • サービス連携で使うAPI
    • 参照 : organizations::ListDelegatedServicesForAccount
    • 有効 : organizations::EnableAWSServiceAccess
    • 無効 : organizations::DisableAWSServiceAccess
  • 管理の委任で使うAPI
    • 参照 :
      • アカウント : organizations::ListDelegatedAdministrators
      • サービス : organizations::ListDelegatedServicesForAccount
    • 委任 : organizations::RegisterDelegatedAdministrator
    • 委任解除 : organizations::DeregisterDelegatedAdministrator
  • コンソールと同じく、更新系操作はOrganizationsの管理アカウントだけが実行可能

AWSサービスをOrganizations 連携

まずはサービスのOrganizations連携をAWS CLIから行います。

連携状況を確認

AWS Organizationsとサービスの連携状況は、コンソールでは「AWS Organizations > Services」から確認できます。

”Trusted access”において、連携が有効な場合、"Access enabled"、無効な場合 "Access disabled"となっています。

AWS CLIからは organizations::ListDelegatedServicesForAccount APIを呼び出すと、連携しているサービスとその有効日を確認できます。

$ aws organizations list-aws-service-access-for-organization
{
    "EnabledServicePrincipals": [
        {
            "ServicePrincipal": "access-analyzer.amazonaws.com",
            "DateEnabled": "2021-02-16T11:38:57.669000+00:00"
        },
        {
            "ServicePrincipal": "cloudtrail.amazonaws.com",
            "DateEnabled": "2021-02-16T11:41:02.499000+00:00"
        },
        {
            "ServicePrincipal": "sso.amazonaws.com",
            "DateEnabled": "2023-01-09T09:18:41.593000+00:00"
        }
    ]
}

サービス連携を有効化

サービス連携を有効化するには、有効化したいサービスを引数にorganizations::EnableAWSServiceAccess API を呼び出します。

試しに、AWS Healthを有効化します。

$ aws organizations enable-aws-service-access \
  --service-principal health.amazonaws.com
$
$ aws organizations list-aws-service-access-for-organization                                                                                                             
{
    "EnabledServicePrincipals": [
        {
            "ServicePrincipal": "access-analyzer.amazonaws.com",
            "DateEnabled": "2021-02-16T11:38:57.669000+00:00"
        },
        {
            "ServicePrincipal": "cloudtrail.amazonaws.com",
            "DateEnabled": "2021-02-16T11:41:02.499000+00:00"
        },
        {
            "ServicePrincipal": "health.amazonaws.com",
            "DateEnabled": "2023-01-18T09:43:54.894000+00:00"
        },
        {
            "ServicePrincipal": "sso.amazonaws.com",
            "DateEnabled": "2023-01-09T09:18:41.593000+00:00"
        }
    ]
}

コンソールでは、次の画面に相当します。

サービス連携を無効化

サービス連携を無効化するには、無効化したいサービスを引数にorganizations::DisableAWSServiceAccess API を呼び出します。

$ aws organizations disable-aws-service-access \
  --service-principal health.amazonaws.com
$

管理の委任

次に管理の委任をAWS CLIから行います。

委任状況を確認

委任しているAWSアカウントを確認するには、organizations::ListDelegatedAdministrators API を呼び出します。

委任先アカウントがなければ、空のリストが返ります。

$ aws organizations list-delegated-administrators 
{
    "DelegatedAdministrators": []
}

委任しているアカウントが存在すれば、そのアカウント情報が表示されます。

$ aws organizations list-delegated-administrators
{
    "DelegatedAdministrators": [
        {
            "Id": "123456789012",
            "Arn": "arn:aws:organizations::111:account/o-xxx/123456789012",
            "Email": "foo@example.com",
            "Name": "Foo",
            "Status": "ACTIVE",
            "JoinedMethod": "CREATED",
            "JoinedTimestamp": "2023-01-09T09:34:49.771000+00:00",
            "DelegationEnabledDate": "2023-01-17T09:47:31.711000+00:00"
        },
        {
            "Id": "9876543210982",
            "Arn": "arn:aws:organizations::111:account/o-xxx/9876543210982",
            "Email": "bar@example.com",
            "Name": "Bar",
            "Status": "ACTIVE",
            "JoinedMethod": "CREATED",
            "JoinedTimestamp": "2023-01-09T10:34:49.771000+00:00",
            "DelegationEnabledDate": "2023-01-18T09:47:31.711000+00:00"
        }
    ]
}

サービスから委任しているアカウントを絞り込むこともできます。

# 委任していない
$ aws organizations list-delegated-administrators \
  --service-principal=access-analyzer.amazonaws.com
{
    "DelegatedAdministrators": []
}

# 委任している
$ aws organizations list-delegated-administrators \
  --service-principal=access-analyzer.amazonaws.com 
{
    "DelegatedAdministrators": [
        {
            "Id": "123456789012",
            "Arn": "arn:aws:organizations::111:account/o-xxx/123456789012",
            "Email": "foo@example.com",
            "Name": "Foo",
            "Status": "ACTIVE",
            "JoinedMethod": "CREATED",
            "JoinedTimestamp": "2023-01-09T09:34:49.771000+00:00",
            "DelegationEnabledDate": "2023-01-17T09:47:31.711000+00:00"
        }
    ]
}

あるアカウントがどのサービスを委任されているか確認するには、organizations::ListDelegatedServicesForAccount API を呼び出します。

$ aws organizations list-delegated-services-for-account \
  --account-id 123456789012
{
    "DelegatedServices": [
        {
            "ServicePrincipal": "access-analyzer.amazonaws.com",
            "DelegationEnabledDate": "2023-01-18T09:47:31.718000+00:00"
        }
    ]
}

委任する

管理を委任するには、委任先アカウントと委任したいサービスを引数にorganizations::RegisterDelegatedAdministrator API を呼び出します。

試しに、AWS Access Analyzerを委任します。

$ aws organizations register-delegated-administrator \
  --account-id 123456789012 \
  --service-principal access-analyzer.amazonaws.com
$

コンソールでは、次の画面に相当します。

委任を解除する

委任を解除するには、委任先アカウントと解除するサービスを引数にorganizations::DeregisterDelegatedAdministrator API を呼び出します。

$ aws organizations deregister-delegated-administrator \
  --account-id 123456789012 \
  --service-principal access-analyzer.amazonaws.com
$

更新系操作はOrganizationsの管理アカウントからのみ呼び出し可能

管理コンソールと同じく、更新系操作はOrganizationsの管理アカウントだけから実行可能です。

メンバーアカウントから更新操作を行うと

  • An error occurred (AccessDeniedException) when calling the EnableAWSServiceAccess operation: You don't have permissions to access this resource.
  • An error occurred (AccessDeniedException) when calling the RegisterDelegatedAdministrator operation: You don't have permissions to access this resource.

といったエラーが発生します。

ご注意ください。