زیرساخت سلف سرویس AWS با استفاده از Spacelift
مقدمه
در این مقاله از سری Self-Service AWS Infrastructure for Your Devs، ما قصد داریم VPC خود و Client VPC همتا را با استفاده از Spacelift و چندین ویژگی آن مستقر کنیم. این ساده ترین روش خواهد بود زیرا حالت به طور کامل مدیریت می شود، تمام احراز هویت با Github مدیریت می شود، احراز هویت به AWS ساده است، و ویژگی Blueprints یک رابط سلف سرویس عالی را با تلاش بسیار کمی برای توسعه دهندگان شما فراهم می کند. ما کل تنظیمات را با استفاده از چند کلیک در رابط کاربری گرافیکی اجرا می کنیم و سپس بقیه موارد را در Terraform می نویسیم. بیا شروع کنیم!
فضاپیما به عنوان کد
ابتدا، ما کد مورد نیاز برای استقرار همه دارایی ها را ایجاد می کنیم. وقتی این کار را انجام دادیم، پشته مدیریت اولیه Spacelift را ایجاد می کنیم و همه چیز را مستقر می کنیم. همه اینها بهعنوان یک monorepo در Github ایجاد میشود، اما اگر نیازهای سازمانی دیگری دارید، میتوانید آن را هر طور که مناسب میدانید ساختار دهید.
کد مخزن پشته مدیریت
این کد Terraform پشته زیرساخت و طرح سفارشی را ایجاد می کند که توسعه دهندگان می توانند از آن برای استقرار VPC های مشتری استفاده کنند. اگر نام مخزن خود را ذکر نکنید aws-self-service
و از همه نامهای دایرکتوری یکسان استفاده کنید، مطمئن شوید که همه مراجع را در کد تغییر میدهید.
# ./administrative/providers.tf
terraform {
required_providers {
spacelift = {
source = "spacelift-io/spacelift"
}
}
}
provider "spacelift" {}
# ./administrative/stacks.tf
# this data source will retrieve the stack_id of the admin stack
# we will create next.
data "spacelift_stack" "admin" {
stack_id = "admin"
}
# Check the attributes below for your VCS settings
# Learn more about stacks here:
# https://docs.spacelift.io/concepts/stack/
resource "spacelift_stack" "shared_infra" {
autodeploy = false
branch = "main"
project_root = "shared_infra"
description = "Core Infra Stack"
name = "shared-infra"
space_id = "root"
repository = "aws-self-service"
terraform_version = "1.2.9"
labels = ["managed"]
}
# You will create the `dev-context` further in the post.
# More about contexts here:
# https://docs.spacelift.io/concepts/configuration/context
resource "spacelift_context_attachment" "attachment" {
context_id = "dev-context"
stack_id = "spacelift_stack.shared_infra.id"
priority = 0
}
# ./administrative/blueprints.tf
# More about Blueprints here:
# https://docs.spacelift.io/concepts/blueprint/
locals {
bprint = file("${path.root}/blueprints/client_vpc.tftpl")
}
resource "spacelift_blueprint" "client_vpc" {
name = "Client VPC"
description = "Stack to create a new child VPC"
space = "root"
template = local.bprint
state = "PUBLISHED"
labels = ["client"]
}
# for troubleshooting purpose
output "bprint" {
value = local.bprint
}
# ./administrative/blueprints/client_vpc.tftpl
# inputs are used to create input fields
inputs:
- id: client_name
name: Client name
- id: vpc_cidr
name: CIDR of the VPC
type: select
# You could use a data source here to iterate over a list of
# available subnets that don't overlap with the main.
default: 10.1.0.0/16
options:
- 10.2.0.0/16
- 10.3.0.0/16
- 10.4.0.0/16
- id: region
name: Choose AWS region
type: select
# ensure you set these appropriately
options:
- us-east-1
- us-east-2
- id: trigger_run
name: Trigger a run upon stack creation
type: boolean
default: false
stack:
name: ${{ inputs.client_name }}-stack
# More info about Spaces here:
# https://docs.spacelift.io/concepts/spaces/
space: root
description: >
Stack created from a blueprint by ${{ context.user.name }} logged in as ${{ context.user.login }}
labels:
- "blueprints/${{ context.blueprint.name }}"
# Uncomment the vcs section below and add your information.
vcs:
branch: main
repository: aws-self-service
project_root: client_vpc
provider: GITHUB
vendor:
terraform:
manage_state: true
# Use your preferred version of Terraform here
version: "1.4.0"
attachments:
contexts:
- id: dev-context
priority: 1
environment:
variables:
- name: TF_VAR_client_name
value: ${{ inputs.client_name }}
- name: TF_VAR_vpc_cidr
value: ${{ inputs.vpc_cidr }}
- name: TF_VAR_region
value: ${{ inputs.region }}
options:
trigger_run: ${{ inputs.trigger_run }}
هنگامی که همه کد را ایجاد کردید، آن را به مخزن Git خود که حاوی کد قسمت اول این سری است، متعهد کنید. اگر نمیخواهید تنظیمات VCS را در کد تغییر دهید، مطمئن شوید که مخزن خود را نامگذاری کردهاید aws-self-service
و دایرکتوری های شما همان چیزی است که در قطعه کد بالا می بینید. این یک مقاله نسبتاً متوسط است، بنابراین من در مورد چگونگی انجام این کار به عمق نمی پردازم. اگر سوالی دارید، در تماس باشید.
ایجاد پشته مدیریت Spacelift
راه اندازی Spacelift آسان است. اگر هنوز حسابی ندارید، میتوانید مستندات «شروع به کار» را در اینجا ببینید تا سریعاً به سرعت برسید: https://docs.spacelift.io/getting-started.
پس از تنظیم حساب خود، مراحل زیر را دنبال کنید.
1. در کنسول، روی Add stack کلیک کنید
2. تنظیمات مخزن خود را پیکربندی کنید
3. هر تنظیماتی را که نیاز دارید سفارشی کنید و روی ادامه کلیک کنید
4. Administrative را تغییر دهید و ذخیره کنید
زمینه اعتبارنامه AWS را ایجاد کنید
راه های متعددی برای ارائه اعتبارنامه AWS به پشته های ما وجود دارد. در Spacelift، میتوانید یک «ادغام ابری» ایجاد کنید که نقش موقتی را بر عهده میگیرد و از آن برای ایجاد منابع استفاده میکند. این مسیر ترجیحی است، اما برای سادگی و تمرکز، میخواهم مدارک را به صورت دستی پاس کنم. با این روش، اطمینان حاصل کنید که کلیدهای خود را به طور مکرر بچرخانید و در صورت عدم استفاده آنها را غیرفعال کنید. اسپیس لیفت محصولی بسیار امن است، اما بهتر است همیشه محتاط باشید.
کاری که ما می خواهیم انجام دهیم این است که از یک “Spacelift Context” برای ذخیره کلیدها به عنوان متغیرهای محیطی استفاده کنیم که توسط هر پشته ای که Context به آن متصل است قابل دسترسی باشد. برای ایجاد Context جدید، به پنل Contexts در سمت چپ بروید، اطلاعات لازم را پر کنید، متغیرها را ایجاد کنید، مقادیر آنها را اضافه کنید و آنها را به عنوان “مخفی” تعیین کنید، همانطور که در تصویر زیر نشان داده شده است. مگر اینکه بخواهید کد بالا را تغییر دهید، مطمئن شوید که از “dev-context” به عنوان نام استفاده می کنید:
بیایید مستقر شویم!
هنگامی که کد شما در مخزن شما قرار می گیرد، پشته Admin به آن کد متصل می شود، و Context ایجاد می شود، در نهایت زمان آن فرا رسیده است که گسترش یابد! این قرار است مستقر شود:
- این
shared-infra
پشته ای که VPC مشترک را مستقر می کند. - طرح Spacelift که به شما امکان می دهد اطلاعات مورد نیاز برای ایجاد پشته ای را وارد کنید که VPC دیگری را مستقر می کند که به طور خودکار به VPC سرویس های اشتراکی همتا می شود.
هنگامی که پیکربندی به پایان رسید، ادامه دهید و پشته Admin را فعال کنید و بیایید آن را بررسی کنیم! باید پشته Admin و پشته اشتراک گذاری شده جدید خود را ببینید:
و طرح جدید شما:
هنگامی که آن منابع مستقر شدند، زمان استقرار VPC منابع مشترک است. برای انجام این کار، پشته shared_infra را فعال کنید و تأیید کنید که منابع پس از آن ایجاد شده اند:
پس از تکمیل، استقرار سلف سرویس شما کامل می شود! به تب Blueprints بروید، اطلاعات لازم را پر کنید و پشته ایجاد کنید:
هنگامی که پشته ایجاد شد، می توانید آن را فعال کنید و VPC خود سرویس خود را خواهید داشت!