286 Views
July 17, 24
スライド概要
2024.07.17 AWS 10分 LT大会 発表資料
https://aws-likers.connpass.com/event/322723/
検証用のSandboxアカウントの予算管理ってみなさんどうしているのか聞いてみました。
name: - いけだしんのすけ work: - インフラ・情シス like: - バイク - 読書 - 映画 - アニメ - ゲーム
SCPを復習してみる(仮) SandBoxアカウントの管理みんなどうしてるの?
本LTの趣旨 • • マルチアカウント運用で検証用アカウント複数保有している場合の コスト制約について悩んでます。 皆様からの〇〇したほうが良いよ。〇〇のようにしているよ。みた いなコメントがありましたらぜひ頂けますと幸いです!
自己紹介 name: しんのすけ X: @orc_jj like: - バイク - 読書 - 映画 - アニメ work: - インフラ certification: - AWS Solutions Architect Professional - Azure Solutions Architect Expert - Azure Developer Associate - Azure AI Engineer Associate etc.. 好きなAWSサービス: - Lambda - AWS CDK
発端は... 開発メンバー各々が自由に使えるサンドボックス環境を作りたい! これまで検証用のアカウントとして、 1つのアカウントを共有して使ってたけど。 色々気を使ってしまうらしく、あまり使われてない。
というわけで Organizations Root SandBox OUを作って、配 下にアカウントを作成してい くぞー Organizational unit Sandbox ou アカウントA アカウントB アカウントC
SCP (セキュリティコントロールポリシー) OU全体で拒否したい内容 を割り当てる (拒否リスト形式での運用) Organizations Root { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "iam:CreateUser", "iam:DeleteUser" ], "Resource": "*", "Condition": { "ArnNotLike": { "aws:PrincipalARN": [ … ] } } } ] } ※例 IAMユーザーを作らせないポリシー Organizational unit Sandbox ou アカウントA アカウントB アカウントC
Full AWS Access SCP Deny SCP Sandbox ou Full AWS Access SCP アカウントA おっと、この操作は社内ルー ルで禁止されてた Admin Access user ユーザーには自由度の高い権限を与えつつも、SCPを当てる事で絶対に守ってほしいルールからは逸脱しない!
SCPで基本的なガードレールは敷いた。 コスト上限のアラートがメールやSlackに飛ぶようにも設定した。 しかし... コスト上限を上回った場合は課金を止めたい!! 通知は来るけど、色々な理由で見逃してしまう& 放置してしまうことだっ てあるかもしれない... 万が一、コストが予算を大幅に超えてしまっている場合はそのままにせ ず、自動的に課金をストップできるようにしたい...
どうやる? https://github.com/rebuy-de/aws-nuke ■ aws-nuke 対象のAWSアカウントのほぼ全てのリソースを削除するOSS AWS Budgets → SNS → Lambda みたいな感じでnukuを実行 させてそのアカウント内の対象リソースを削除する? ● ● ● ミスってサンドボックス以外のリソース削除とか怖い 実行エラーが発生したらどうする? 実装~検証~運用 大変そう...? ← 未検証
どうやる その2?
■ メンバーアカウントを閉鎖する
AWS Budgets → SNS → Lambda で予算オーバーなアカウントを閉鎖する。
リソースを削除して課金止めようではなく、アカウントそのものを閉鎖してしまう。
アカウント閉鎖!
import { OrganizationsClient, CloseAccountCommand } from"@aws-sdk/client-organizations";
const client = new OrganizationsClient(config);
const input = {
AccountId: "000000000000",
};
const command = new CloseAccountCommand(input);
const response = await client.send(command);
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/organizations/command/CloseAccountCommand/
設定方法 Budget Nameは管理対象のアカウントNoで作成してお く。※後述 フィルターで範囲を管理対象のアカウントに絞 る。
SNSから受け取ったMessage or Subjectに設定したBudget Nameが入ってるの で、これを正規表現で取得し、CloseAccountCommand を実行する。 Dear AWS Customer, … export const handler = async (event) => { console.log(event.Records[0].Sns.Message) console.log(event.Records[0].Sns.Subject) … Budget Name: 000000000019 Budget Type: Cost Budgeted Amount: $0.00 Alert Type: ACTUAL … AWS Budgets: 000000000019 has exceeded your alert threshold
閉鎖できることを確認。 ● 万が一再開しないとならない場合はサポートリクエストで再開したい旨を送信する必要アリ。 ● 90 日が経過すると、閉鎖したアカウントに関連付けられているメールアドレスによるアカウントの再開 や、新しいアカウントの開設ができなくなる。※ このとき、閉鎖されたアカウントに残っているコンテンツ はすべて削除される。
課題 ● 事故らない? Lambdaの実行ロールで閉鎖できるアカウントを制限しているので事 故は無いハズ... ● そもそも閉鎖はやりすぎ...? 課金対象のリソースをストップできればいいのですが、もっと良いやり 方あれば教えてほしい...
ご清聴有難うございました。