معمارية السحابة ومناطق الهبوط

مشروع: تصميم منطقة هبوط مؤسسية

18 دقيقة الدرس 10 من 28

مشروع: تصميم منطقة هبوط مؤسسية

كل ما تناوله هذا الدرس التعليمي — مبادئ Well-Architected، واستراتيجية متعددة الحسابات، وضوابط Control Tower، وتفويض الهويات، ومعمارية الشبكات على نطاق المؤسسة، والاتصال الهجين، وأنماط المرونة، والحوكمة — يتلاقى هنا. أنت مهندس منصات في شركة Acme Corp، شركة SaaS تضم 1200 موظف تدخل سوقًا منظَّمة. مهمتك: تصميم منطقة هبوط AWS إنتاجية من الصفر، وتبرير كل قرار، وإنتاج إعدادات Terraform وAWS CLI للنشر. هذا ما يقدمه المهندس الأول في شركات من مستوى FAANG.

السياق التجاري

تمتلك Acme Corp ثلاث وحدات أعمال: المدفوعات (نطاق PCI-DSS)، والتحليلات (BI داخلي، بلا بيانات منظَّمة)، والمنصة (خدمات مشتركة — DNS، والأسرار، والرصد). يعمل لديها 40 فريق تطوير. يشترط الأمان عزل نطاق الأثر الجانبي. تريد المالية رؤية التكاليف لكل فريق. تشترط القانونية إقامة البيانات في us-east-1 مع نسخة استرداد كوارث في us-west-2. يتوقع التدقيق دليلًا على ضوابط تُطبَّق دون تدخل بشري.

تصميم بنية الحسابات

المعيار السائد في الشركات الكبرى: حساب AWS واحد لكل بيئة لكل فريق عمل، تحكمه هرمية AWS Organizations. حساب الجذر لا يُستخدم أبدًا لأعباء العمل. الهيكل أدناه يرتبط مباشرةً بنشر Control Tower.

Acme Corp AWS Organizations account hierarchy Root (Management Acct) Security OU Infrastructure OU Workloads OU Sandbox OU Suspended OU Audit Log Archive Networking Shared Svc Payments OU Dev Prod Analytics OU Dev/Prod Team sandboxes جرد الحسابات Management — فوترة + SCPs فقط Audit — AWS Config + Security Hub Log Archive — CloudTrail + VPC Flow غير قابل للتعديل Networking — Transit Gateway + Route 53 Resolver Shared Svc — Secrets Manager, ECR, DNS
هرمية AWS Organizations في Acme Corp: 5 وحدات تنظيمية، حسابات لأغراض محددة، وحدات تنظيمية فرعية لكل وحدة أعمال.
يؤدي حساب الإدارة شيئًا واحدًا فقط: يحمل AWS Organizations، وتوحيد الفوترة، وسياسات SCPs المطبَّقة على الجذر وكل وحدة تنظيمية. لا تعمل أي موارد أعباء عمل بداخله. حساب إدارة مخترَق يمكنه حذف كل حساب في مؤسستك — احمه باستخدام مفاتيح MFA المادية، وبدون مفاتيح برمجية، وإجراء طوارئ منفصل موثَّق في دليل التشغيل.

معمارية الشبكة

حساب الشبكة يمتلك Transit Gateway (TGW) ويعمل كمحور مركزي. كل حساب عمل يُرفق VPC الخاص به كتفرعة. الرسم أدناه يوضح الطوبولوجيا الكاملة: الخدمات المشتركة يمكن الوصول إليها من جميع التفرعات، المدفوعات معزولة عن التحليلات على مستوى جدول مسار TGW، والاتصال بالبنية التحتية الداخلية يدخل عبر مرفق VPN/Direct Connect واحد.

Acme Corp hub-and-spoke network topology Networking Account Transit Gateway (TGW) Payments VPC Private /22 Isolated /24 Analytics VPC Private /21 Public /24 Shared Svc VPC Endpoints ECR, R53 On-Premises DC VPN/DX 10.0.0.0/8 TGW Route Tables Payments معزول | Shared-svc متاح للكل | On-prem عبر الانتشار 10.10.0.0/16 10.20.0.0/16 10.30.0.0/16 نطاقات RFC 1918 غير متداخلة — خطِّط للـ /8 الكامل قبل اليوم الأول
طوبولوجيا Transit Gateway المحورية. VPC المدفوعات معزول عن التحليلات على مستوى جدول مسار TGW. VPC الخدمات المشتركة يمكن الوصول إليه من جميع التفرعات.
تخطيط نطاقات CIDR قرار لا رجعة فيه. لا يمكن تغيير نطاقات VPC بعد الإنشاء، ولا يمكن لجداول مسار TGW توجيه نطاقات متداخلة. في Acme Corp نخصص /8 كاملًا (10.0.0.0/8) من اليوم الأول، ونقسمه حسب الوحدة التنظيمية (10.10/8 = المدفوعات، 10.20/8 = التحليلات، 10.30/8 = الخدمات المشتركة)، ونوثق التخصيص في CMDB. الفرق التي تتخطى هذه الخطوة تقضي ستة أشهر في إعادة تعيين عناوين IP للـ VPCs في الإنتاج — تجربة مؤلمة ومحفوفة بالمخاطر.

الضوابط: SCPs وقواعد AWS Config

الضوابط هي طبقة الحوكمة التي تجعل منطقة الهبوط موثوقة. في Acme Corp ننفذ مستويين: ضوابط وقائية عبر سياسات التحكم في الخدمة (SCPs) التي تجعل الانتهاكات مستحيلة، وضوابط كاشفة عبر قواعد AWS Config تُنبِّه عند الانجراف. تحصل وحدة المدفوعات على SCPs إضافية خاصة بـ PCI لا ترثها الوحدات الأخرى.

# ── Terraform: SCP على مستوى الجذر — حظر مغادرة المؤسسة + حظر تعطيل CloudTrail ── resource "aws_organizations_policy" "root_baseline" { name = "root-baseline-scp" description = "Non-negotiable controls applied to every account" type = "SERVICE_CONTROL_POLICY" content = jsonencode({ Version = "2012-10-17" Statement = [ { Sid = "DenyLeaveOrganization" Effect = "Deny" Action = ["organizations:LeaveOrganization"] Resource = "*" }, { Sid = "DenyDisableCloudTrail" Effect = "Deny" Action = [ "cloudtrail:DeleteTrail", "cloudtrail:StopLogging", "cloudtrail:UpdateTrail" ] Resource = "*" }, { Sid = "DenyIMDSv1" Effect = "Deny" Action = ["ec2:RunInstances"] Resource = "arn:aws:ec2:*:*:instance/*" Condition = { StringEquals = { "ec2:MetadataHttpTokens" = "optional" } } }, { Sid = "RequireTagOnEC2" Effect = "Deny" Action = ["ec2:RunInstances"] Resource = "arn:aws:ec2:*:*:instance/*" Condition = { "Null" = { "aws:RequestTag/CostCenter" = "true" } } } ] }) } resource "aws_organizations_policy_attachment" "root" { policy_id = aws_organizations_policy.root_baseline.id target_id = data.aws_organizations_organization.this.roots[0].id } # ── SCP إضافي لوحدة المدفوعات: إقامة البيانات في us-east-1 فقط ────────────── resource "aws_organizations_policy" "payments_residency" { name = "payments-data-residency" type = "SERVICE_CONTROL_POLICY" content = jsonencode({ Version = "2012-10-17" Statement = [{ Sid = "DenyNonUSEast1" Effect = "Deny" NotAction = [ "iam:*", "sts:*", "route53:*", "cloudfront:*", "waf:*", "support:*" ] Resource = "*" Condition = { StringNotEquals = { "aws:RequestedRegion" = "us-east-1" } } }] }) } resource "aws_organizations_policy_attachment" "payments_ou" { policy_id = aws_organizations_policy.payments_residency.id target_id = aws_organizations_organizational_unit.payments.id }
لا تمنح SCPs صلاحيات — بل تقيدها. SCP يسمح بكل شيء إلا بعض الإجراءات لا يزال يشترط أن تسمح سياسات IAM الخاصة بالحساب بما تريد السماح به. خطأ شائع في الإنتاج: إرفاق SCP مقيِّد جدًا بوحدة تنظيمية ثم التساؤل لماذا تتعطل الخطوط الآلية — اختبر تغييرات SCP دائمًا في وحدة تنظيمية اختبارية بنشر كاشف قبل إرفاقه بوحدات الإنتاج. استخدم IAM Policy Simulator وaws iam simulate-principal-policy للتحقق قبل الإرفاق.

تفويض الهوية: ربط Okta بـ AWS SSO

تستخدم Acme Corp Okta كمزود هوية مؤسسي. يتحالف IAM Identity Center (المعروف سابقًا بـ AWS SSO) مع Okta عبر SCIM (يوفّر المستخدمين/المجموعات تلقائيًا) وSAML 2.0 (يوثق الجلسات). النتيجة: يسجّل المهندسون الدخول مرة واحدة ببيانات اعتماد مؤسسية ويحصلون على بيانات اعتماد دور قصيرة الأمد مقيَّدة بمجموعة الصلاحيات الخاصة بهم — لا مفاتيح IAM دائمة في أي مكان.

# ── CLI: سرد جميع الحسابات المتاحة عبر SSO وتوليد بيانات الاعتماد ────────────── # (نفِّذ بعد `aws configure sso`) aws sso list-accounts --access-token $(cat ~/.aws/sso/cache/*.json | python3 -c \ "import json,sys; d=json.load(sys.stdin); print(d['accessToken'])") \ --query 'accountList[*].[accountId,accountName]' \ --output table # ── Terraform: منح مجموعة Okta "platform-eng" صلاحية AdministratorAccess # لحساب الشبكة عبر Identity Center ────────────────────────────────────────── data "aws_ssoadmin_instances" "this" {} resource "aws_identitystore_group" "platform_eng" { identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0] display_name = "platform-eng" } resource "aws_ssoadmin_permission_set" "network_admin" { name = "NetworkAdmin" instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0] session_duration = "PT4H" tags = { ManagedBy = "terraform" } } resource "aws_ssoadmin_managed_policy_attachment" "network_admin" { instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0] permission_set_arn = aws_ssoadmin_permission_set.network_admin.arn managed_policy_arn = "arn:aws:iam::aws:policy/job-function/NetworkAdministrator" } resource "aws_ssoadmin_account_assignment" "platform_eng_networking" { instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0] permission_set_arn = aws_ssoadmin_permission_set.network_admin.arn principal_id = aws_identitystore_group.platform_eng.group_id principal_type = "GROUP" target_id = var.networking_account_id target_type = "AWS_ACCOUNT" }

المرونة: ماذا يحدث عند تعطل منطقة؟

يشترط المتطلب القانوني لـ Acme Corp وجود نسخة استرداد كوارث في us-west-2. تستخدم خدمة المدفوعات نمط استرداد الضوء التجريبي: قاعدة البيانات (Amazon Aurora Global Database) تُنسَّخ باستمرار، لكن الحوسبة في us-west-2 ضئيلة (مهمة ECS واحدة متوقفة). عند الفشل، تكتشف فحوصات صحة Route 53 أن النقطة النهائية الأساسية أصبحت غير صحية وتحوّل DNS تلقائيًا إلى ALB الثانوي. هدف RTO: 15 دقيقة. هدف RPO: أقل من دقيقة (تأخر نسخ Aurora Global عادةً أقل من ثانية).

يستثني SCP على وحدة المدفوعات صراحةً us-west-2 من عبارة حظر إقامة البيانات باستخدام استثناء NotAction لنسخ Aurora العالمي — تفصيل تصميمي يجب أن يكون في SCP الأولي وإلا ستفشل نسخ الاسترداد في الإنشاء.

الجمع معًا: توزيع حسابات Control Tower

يُؤتمت Account Factory في AWS Control Tower (أو Account Factory for Terraform — AFT) إنشاء الحسابات. عندما يحتاج فريق تطوير في Acme Corp إلى بيئة جديدة، يفتحون طلب سحب لمستودع aft-account-requests بملف Terraform واحد يحدد الوحدة التنظيمية والعلامات ومجموعات الصلاحيات. ينشئ AFT الحساب، ويطبق SCPs الأساسية، وينشئ مرفق TGW، ويسجّل الحساب مع Security Hub وConfig، ويُرسل إشعار ترحيب على Slack — كل ذلك دون أن يلمس إنسان وحدة تحكم AWS.

# ── ملف طلب حساب AFT (الفرق تفتح طلبات سحب لحسابات جديدة) ────────────────── # الملف: aft-account-requests/payments-team-dev.tf module "payments_dev_account" { source = "./modules/aft-account-request" control_tower_parameters = { AccountEmail = "aws-payments-dev@acme-corp.com" AccountName = "acme-payments-dev" ManagedOrganizationalUnit = "Workloads/Payments" SSOUserEmail = "payments-lead@acme-corp.com" SSOUserFirstName = "Payments" SSOUserLastName = "Team" } account_tags = { Environment = "dev" BU = "payments" CostCenter = "CC-4421" Owner = "payments-lead@acme-corp.com" } change_management_parameters = { change_requested_by = "platform-eng" change_reason = "New dev environment for payments-v2 project" } account_customizations_name = "payments-baseline" }
منطقة الهبوط لا تكتمل أبدًا. إنها منصة حية. كل فريق جديد يُضاف، وكل متطلب امتثال جديد، وكل إعلان عن خدمة AWS جديدة هو تغيير محتمل. تدير فرق المنصات في الشركات الكبرى منطقة الهبوط كمنتج: لها مالك، وسجل تغييرات، ومجموعة اختبارات (مع حزم توافق AWS Config وSCPkit لاختبار وحدات SCP)، ومراجعة WAF ربعية. عاملها بالمستوى المناسب.

أوضاع الفشل الإنتاجية التي يجب توقعها

بناءً على تصميم مئات من مناطق الهبوط، هذه هي أوضاع الفشل التي تعض الفرق في سنتها الأولى:

  • SCP يحجب دور خط CI/CD: SCP جديد يشترط علامة على كل إطلاق EC2 يُوقف صامتًا قالب إطلاق الخط الآلي. اختبر SCPs دائمًا في وحدة تنظيمية اختبارية قبل التطبيق على مستوى المؤسسة، وراقب أحداث Deny في CloudTrail في الساعات التالية لأي تغيير SCP.
  • انتشار جدول مسار TGW غير مُفعَّل: مرفق TGW موجود، لكن جدول المسار لا ينشر نطاق CIDR الخاص بـ VPC — تُسقَط حركة المرور بصمت. تحقق باستخدام aws ec2 describe-transit-gateway-route-tables ومحلل إمكانية الوصول لـ VPC بعد كل مرفق.
  • سياسة دلو Log Archive مفرطة في المرونة: الهدف كله من حساب أرشيف السجلات المخصص هو مقاومة التلاعب. إذا سمح دلو S3 بـ s3:DeleteObject لدور تسليم السجلات، يمكن لحساب عمل مخترَق تدمير أدلة التدقيق. يجب أن تحظر سياسة الدلو صراحةً جميع الإجراءات المدمِّرة إلا من مدير حساب الإدارة.
  • انتهاء صلاحية رمز SCIM يُوقف توفير SSO: رموز Okta SCIM لـ IAM Identity Center تنتهي صلاحيتها بشكل افتراضي. عندما يحدث ذلك، لا يُوفَّر الموظفون الجدد ويحتفظ المستخدمون المحذوفون من Okta بصلاحيات AWS. قم بتدوير رموز SCIM قبل انتهاء صلاحيتها وأنشئ تنبيهات على أخطاء التوفير.