メインコンテンツまでスキップ

DoiT Flexsave アカウント

DoiT Flexsave アカウントは DoiT が作成および所有します。これらのアカウントにはワークロードは含まれず、Savings Plans と Reserved Instances のみが含まれます。

DoiT Flexsave は、利用可能なプランの組み合わせを調整してコスト削減を最適化します。リソースの利用状況に応じて割引メカニズムの構成を継続的に再調整し、削減効果を最大化します。dedicated resold アカウントをご利用の場合、プランが調整されるたびに AWS Organization に Flexsave アカウントが参加または退出するのが確認できます。

Flexsave アカウントの識別

DoiT Flexsave アカウントは AWS Console 上で fsXXXXX というアカウント名です。doit-intl.comflexsave.marketflexsave.workflexsave.app といったドメイン名で表示される場合があります。アカウント名でフィルターした後、アカウント ID でさらにグループ化できます。

DoiT Cloud Analytics(クラウド分析)のレポートでは、AWS Organization に追加されたすべての Flexsave アカウントは、Project/Account nameFlexsave 配下の単一項目に集約されます。例は Flexsave projects/accounts を参照してください。

Flexsave アカウントのアクティビティ

DoiT Flexsave アカウントは、DoiT の管理ロールによる操作を通じて AWS Organization に参加または退出します。

DoiT Flexsave アカウントが Organization を退出する際には、最適なセキュリティ体制を確保するため、アカウントをクリーンアップし、関連リソース(デフォルト VPC、ロール、ポリシー、セキュリティツールなどを含む)をすべて削除します。クリーンアップ処理により、例えば AWS CloudTrail のログ削除、AWS GuardDuty の detector 削除、または DeleteServiceLinkedRole リクエスト送信といったセキュリティ警告が発生する場合があります。これらが DoiT Flexsave アカウントによるものである限り、怪しいアクティビティではありません。

AWS Service Control Policies

Flexsave は AWS Service Control Policies(SCP)と互換性があります。

dedicated resold アカウントをご利用で、organizations:LeaveOrganization または organizations:DescribeOrganization アクションを拒否するポリシーがある場合は、DoiT の管理ロールを例外とするために Condition を追加する必要があります(または、すべての Flexsave アカウントを OU に移動し、その OU から SCP を除外することもできます)。

例えば次のとおりです。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": ["organizations:LeaveOrganization", "organizations:DescribeOrganization"],
"Resource": "*",
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": "arn:aws:iam::*:role/doitintl-mgmt-role"
}
}
}
]
}

Flexsave アカウントを OU に移動する

アカウント管理を簡素化するため、organizational unit(OU) を使用してすべての Flexsave アカウントをまとめてグループ化することを推奨します。例えば、OU に SCP をアタッチできます。

環境内に Lambda 関数をデプロイして、条件に一致する Flexsave アカウントを任意の OU に移動できます。Lambda 関数はお客様が所有するため、DoiT に追加の権限を付与する必要はありません。

Lambda 関数

以下は Lambda 関数の例です。環境で使用する前に、ORG_ROOTDESTINATION_OU を入力するか、os.environ['ORG_ROOT'] および os.environ['DESTINATION_OU'] を使用して環境変数として設定してください。OU に移動する際にアカウントへタグ付けするなど、追加のタスク向けに Lambda 関数を変更することもできます。

import boto3

ORG_ROOT = "XXX"
DESTINATION_OU = "XXX"


def handle_flexsave(event, context):
details = event["detail"]

if details["eventName"] == "AcceptHandshake":
if "responseElements" in details and "handshake" in details["responseElements"]:
handshake = details["responseElements"]["handshake"]
if handshake["action"] == "INVITE" and handshake["state"] == "ACCEPTED":
account_id = next(
(
resource["value"]
for resource in handshake["resources"]
if resource["type"] == "ACCOUNT"
),
None,
)
if account_id:
handle_account(account_id)
return
print(f"can't find account in payload")
return
print("Not a relevant event")


def handle_account(account_id):
print(f"Processing event for account {account_id}")
org_client = boto3.client("organizations")

response = org_client.describe_account(AccountId=account_id)
account_name = response["Account"]["Name"]

if account_name.startswith("fs"):
org_client.move_account(
AccountId=account_id,
SourceParentId=ORG_ROOT,
DestinationParentId=DESTINATION_OU,
)
else:
print(f"Account {account_name} not associated with Flexsave")

Lambda 用ポリシー

Lambda 関数の 実行ロール に次のポリシーをアタッチしてください(Lambda 関数名が flexsave-move、ハンドラーが flexsave_move.handle_flexsave であると想定)。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LogOperations",
"Effect": "Allow",
"Action": ["logs:PutLogEvents", "logs:CreateLogStream", "logs:CreateLogGroup"],
"Resource": [
"arn:aws:logs:us-east-1:XXX:log-group:/aws/lambda/flexsave-move:*:*",
"arn:aws:logs:us-east-1:XXX:log-group:/aws/lambda/flexsave-move:*"
]
},
{
"Sid": "FlexsaveManagement",
"Effect": "Allow",
"Action": ["organizations:DescribeAccount", "organizations:MoveAccount"],
"Resource": "*"
}
]
}

EventBridge トリガー

management events 用の trail を構成している場合は、次のように EventBridge トリガーを追加し、Lambda を指定できます。

{
"source": ["aws.organizations"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["organizations.amazonaws.com"],
"eventName": ["AcceptHandshake"]
}
}