وبلاگ Jekyll با Terraform (Opentofu) با استفاده از خطوط لوله GitLab

در این راهنما ، من یک کتابچه راهنمای کوتاه برای استقرار یک وبلاگ استاتیک ارائه می دهم ، در این مورد Jekyll (با تغییرات جزئی ، باید بتوانید آن را برای هر وب سایت استاتیک دیگر کار کنید) ، به آمازون S3 با استفاده از خطوط لوله GITLAB. تمام زیرساخت ها در Terraform (یا Opentofu ، مانند مورد ما) اداره می شوند.
این دفترچه راهنما فرض می کند که شما از مسیر 53 به عنوان ارائه دهنده DNS خود استفاده می کنید و تمام زیرساخت های AWS به منطقه شرق ایالات متحده (N. ویرجینیا) اعزام می شوند. اگر می خواهید از منطقه دیگری استفاده کنید ، تنظیم کنید aws_region
متغیر بر این اساس در blog.tfvars
بشر
مرحله 1: تنظیم اعتبار و ایجاد سطل S3
ابتدا باید اعتبار AWS را تنظیم کنیم و اطمینان حاصل کنیم که AWS CLI و Terraform (یا Opentofu) از قبل نصب شده اند.
من از این دفترچه راهنما برای نصب Opentofu استفاده کردم:
نصب Opentofu در لینوکس مبتنی بر .db
در اینجا کد نصب وجود دارد:
# Download the installer script:
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh
# Alternatively: wget --secure-protocol=TLSv1_2 --https-only https://get.opentofu.org/install-opentofu.sh -O install-opentofu.sh
# Give it execution permissions:
chmod +x install-opentofu.sh
# Please inspect the downloaded script
# Run the installer:
./install-opentofu.sh --install-method deb
# Remove the installer:
rm -f install-opentofu.sh
برای نصب Terraform ، از این راهنما استفاده کنید:
Terraform را نصب کنید
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt-get install terraform
برای نصب AWS CLI ، دستورالعمل ها را در اینجا دنبال کنید:
نصب یا به روزرسانی آخرین نسخه AWS CLI
apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
پس از اتمام نصب ، اعتبار AWS خود را با استفاده از نمایه تنظیم کنید prod
(می توانید هر نام نمایه را انتخاب کنید ، اما prod
برای این دفترچه استفاده می شود):
aws configure --profile prod
پس از تنظیم اعتبار خود ، آنها را با اجرا تأیید کنید cat ~/.aws/credentials
– باید چیزی مانند:
[prod]
aws_access_key_id=AXXXXXXXXX
aws_secret_access_key=xxxxxxxxxxxxxxxxxxx
اعتبارنامه ها را با دستور زیر آزمایش کنید تا اطمینان حاصل شود که آنها کار می کنند:
aws sts get-caller-identity --profile prod
شما باید خروجی مشابه:
{
"UserId": "AXXXXXXXXX",
"Account": "8XXXXXXXXX",
"Arn": "arn:aws:iam::8XXXXXXXXX:user/jurijsxxxxxxx"
}
اکنون ، سطل S3 را که در آن پرونده دولت Terraform ذخیره می شود ، ایجاد کنید. به خاطر داشته باشید که این نام ممکن است قبلاً گرفته شود ، بنابراین از چیزی منحصر به فرد استفاده کنید. اگر از نام دیگری استفاده می کنید ، حتماً به روز کنید main.tf
بر این اساس:
aws s3api create-bucket --bucket "myblog-tf-state" --region "us-east-1" --acl private --profile prod
خروجی باید چیزی شبیه به این باشد:
{
"Location": "/myblog-tf-state"
}
مرحله 2: تنظیم کد Terraform
بیشتر کد Terraform از مخزن زیر گرفته شده است:
Github terraform-aws-static-site
پست وبلاگ نویسنده با جزئیات توضیح می دهد که هر قسمت از کد چه کاری انجام می دهد:
Pirx.io – استقرار خودکار سایت استاتیک در AWS با استفاده از terraform
با این حال ، من با این کد با چند مسئله روبرو شدم. اول ، اجباری را از دست می داد aws_s3_bucket_ownership_controls
منبع راه حل اضافه کردن aws_s3_bucket_ownership_controls
منبع و به روزرسانی aws_s3_bucket_acl
بر این اساس در اینجا قطعه کامل کد برای قسمت مربوطه آورده شده است:
resource "aws_s3_bucket" "static_site" {
bucket = var.domain
}
resource "aws_s3_bucket_ownership_controls" "static_site" {
bucket = aws_s3_bucket.static_site.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
resource "aws_s3_bucket_acl" "static_site" {
depends_on = [aws_s3_bucket_ownership_controls.static_site]
bucket = aws_s3_bucket.static_site.id
acl = "private"
}
علاوه بر این ، ما برای استقرار وبلاگ از طریق خط لوله GitLab باید یک کاربر IAM ایجاد کنیم. من کد مربوطه را از اینجا کپی کردم:
github terraform-aws-s3-site-site
resource "aws_iam_user" "deploy" {
name = "${var.domain}-deploy"
path = "https://dev.to/"
}
resource "aws_iam_access_key" "deploy" {
user = aws_iam_user.deploy.name
}
resource "aws_iam_user_policy" "deploy" {
name = "deploy"
user = aws_iam_user.deploy.name
policy = data.aws_iam_policy_document.deploy.json
}
این قطعه کد را به آن اضافه کنید outputs.tf
برای خروجی اعتبار مورد نیاز برای خط لوله:
output "AWS_ACCESS_KEY_ID" {
sensitive = true
description = "The AWS Access Key ID for the IAM deployment user."
value = aws_iam_access_key.deploy.id
}
output "AWS_SECRET_ACCESS_KEY" {
sensitive = true
description = "The AWS Secret Key for the IAM deployment user."
value = aws_iam_access_key.deploy.secret
}
برای آسانتر کردن کارها ، من تمام کد را در یک مخزن واحد تلفیق کردم:
github jekyll-terraform-aws-s3
من تصمیم گرفتم به جای ماژول ها برای سادگی از یک رویکرد یکپارچه استفاده کنم. شما فقط باید حداقل تنظیم کنید domain
وت route53_zone_id
متغیرها در blog.tfvars
و شما آماده است تا زیرساخت ها را در AWS مستقر کنید:
tofu init
tofu plan -var-file="blog.tfvars"
tofu apply -var-file="blog.tfvars"
یا با استفاده از terraform:
terraform init
terraform plan -var-file="blog.tfvars"
terraform apply -var-file="blog.tfvars"
پس از استفاده ، خروجی متغیرهایی را برای استفاده بعداً در خط لوله نمایش می دهد:
AWS_ACCESS_KEY_ID =
AWS_SECRET_ACCESS_KEY =
CLOUDFRONT_DISTRIBUTION_ID = "EXXXXXX"
S3_BUCKET = "my-site.com"
برای بازیابی متغیرهای حساس ، اجرا کنید:
tofu output --json
یا با استفاده از terraform:
terraform output --json
مرحله 3: تنظیم خط لوله Gitlab
خط لوله ای که من استفاده می کنم مستقیماً از اینجا کپی می شود:
وبلاگ Schenktech – میزبان یک سایت Jekyll در S3 Part 2
از آنجا که نویسنده مخزن GIT را برای کد ارائه نداد ، من خودم یکی را ایجاد کردم:
Gitlab Deploy-Jekyll-to-S3
هنگامی که آن مخزن را چنگال می زنید یا پرونده ها را کپی می کنید ، باید متغیرهای زیر را در تنظیمات Gitlab CI/CD تنظیم کنید. اطمینان حاصل کنید که آنها برای محافظت از اطلاعات حساس ماسک و محافظت می شوند:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
CLOUDFRONT_DISTRIBUTION_ID
S3_BUCKET
بعد ، کد Jekyll واقعی خود را به مخزن اضافه کنید ، متعهد شوید و آن را فشار دهید:
cd ~
git clone https://github.com/daattali/beautiful-jekyll.git
rm -Rf ./beautiful-jekyll/.git* ./beautiful-jekyll/README.md
cp -a ./beautiful-jekyll/* ./deploy-jekyll-to-s3/ # Assuming your code with the pipeline is in ~/deploy-jekyll-to-s3 directory
cd ~/deploy-jekyll-to-s3
git add .
git commit -m "added jekyll"
git push
و شما تمام شد! پس از اتمام ساخت ، وب سایت شما مستقر خواهد شد و باید الگوی زیبای جکیل را به صورت زنده ببینید.
در ابتدا در وبلاگ Cyberpunk Tools منتشر شده است.