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

DoiT Flexsave accounts

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

DoiT Flexsave は、お客様に提供されるプランの組み合わせを調整することでコスト削減を最適化します。リソース使用状況の変化に応じて割引メカニズムの構成を継続的に再調整し、コスト削減を最大化します。dedicated resold アカウントをご利用の場合、プランが調整されるたびに、AWS Organization に Flexsave アカウントが参加または離脱する様子が表示されます。

Identify Flexsave accounts

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

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

Flexsave accounts activities

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", "shield:GetSubscriptionState"],
"Resource": "*",
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": "arn:aws:iam::*:role/doitintl-mgmt-role"
}
}
}
]
}

Move Flexsave accounts to an OU

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

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

Lambda function

以下は 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")

Policy for the Lambda

次のポリシーを、Lambda 関数の実行ロールにアタッチしてください(Lambda 関数名が flexsave-move、Lambda 関数ハンドラーが 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 trigger

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

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