こんにちは。
AWSマルチアカウント環境を管理している者です。
AWSマスタアカウントからメンバーアカウントに対してAWS GuardDutyとAWS Security Hubを開始させる際にInvitationの問題がよく発生してましたので記録します。
エラー内容
ResourceLogicalId:Master, ResourceType:AWS::GuardDuty::Master, ResourceStatusReason:The request is rejected because the current account does not have an invitation from the requested master account. (Service: null; Status Code: 0; Error Code: null; Request ID: null; Proxy: null).
→ マスタアカウントを管理者にするGuardDutyをメンバーアカウントで開始するには、マスタアカウントよりInvitationを事前にもらう必要がありますが、そのInvitationをもらってないからこのようなエラーが発生したようです。
解決
Invitationを送って再度開始を試したら解決されました。
Invitationを送る方法はいくつかあると思いますが、コンソール画面より手動で送る方法とLambdaで自動的に送る方法を紹介します。
① コンソール画面より手動でInvitationを送る
GuardDutyを開いて「設定」>「アカウント」に入ると「招待によるアカウントの追加」ボタンがあります。これをクリックして招待したいアカウントIDとルートメールアドレスを入力したらInvitationが送られるのでメンバーアカウントがAcceptしたら招待完了です。
こちらの方法はInvitationを送るのも、メンバーアカウントがInvitationをAcceptするのも手動で手間がかかるデメリットがあります。
ちなみに左にある「自動有効化」ですが、私は組織の一部のアカウントに対してGuardDutyを開始したくこちらをOFFにしていますが、組織内の全てのアカウントに対してGuardDutyをONにしたい場合は、こちらの自動有効化をONにすると解決されると思います。
② Lambdaで自動的にInvitationを送る(create_members)
コードはpythonで書いています。
Lambdaは、指定したOUに新規アカウントが作成されたタイミングでEventBridgeをトリガーにして実行されるように設計しています。
import json
import boto3
def lambda_handler(event, context):
guardDuty = boto3.client('guardduty')
organizations = boto3.client('organizations')
requestParameters = event["detail"]["requestParameters"]
if requestParameters["destinationParentId"] == "指定したOU":
accountId = requestParameters["accountId"]
email = organizations.describe_account(
AccountId=accountId
)['Account']['Email']
response = guardDuty.create_members(
DetectorId='マスタアカウントのGuardDuty Detector ID',
AccountDetails=[
{
'AccountId': accountId,
'Email': email,
},
]
)
このように、マスタアカウントのメンバーとして新規アカウントのGuardDutyを開始したらメンバーアカウントは特にAcceptをしなくても自動的にメンバーとしてGuardDutyが起動されます。
メンバーアカウント(新規アカウント)のGuardDutyに切り替えて確認したら以下のように表示されていましたので大丈夫そうですね。