Mục tiêu của bài viết này là hướng dẫn bạn cách thiết lập một môi trường Jenkins hoàn toàn không máy chủ trên AWS Fargate bằng cách sử dụng AWS Cloud Development Kit (AWS CDK).
Jenkins là một máy chủ tự động hóa mã nguồn mở phổ biến cung cấp hàng trăm plugin để hỗ trợ xây dựng, kiểm tra, triển khai và tự động hóa. Jenkins sử dụng kiến trúc điều khiển-chi nhánh trong đó máy chủ điều khiển chịu trách nhiệm phục vụ giao diện web, lưu trữ cấu hình và dữ liệu liên quan trên đĩa, và giao các công việc cho các tác nhân công việc chạy các công việc này như trách nhiệm chính của họ.
Amazon Elastic Container Service (Amazon ECS) sử dụng Fargate là dịch vụ quản lý toàn diện về quản lý container giúp bạn dễ dàng triển khai, quản lý và mở rộng ứng dụng đóng gói container. Nó tích hợp sâu với phần còn lại của nền tảng AWS để cung cấp một giải pháp an toàn và dễ sử dụng cho việc chạy các khối công việc container trong đám mây và bây giờ cả trên hạ tầng của bạn. Fargate là một máy chủ không máy chủ, tính theo hình thức trả tiền khi bạn sử dụng, cho phép bạn tập trung vào việc xây dựng ứng dụng mà không cần quản lý máy chủ. Fargate tương thích cả với cả Amazon ECS và Amazon Elastic Kubernetes Service (Amazon EKS).
Tổng quan về giải pháp
Sơ đồ dưới đây minh họa kiến trúc của giải pháp. Các đường nét đứt chỉ ra việc triển khai AWS CDK.
Hình 1: Sơ đồ này cho thấy AWS CDK và cách nó triển khai bằng cách sử dụng AWS CloudFormation để tạo Elastic Load Balancer, AWS Fargate và Amazon EFS.
Trong ví dụ này, bạn sẽ sử dụng:
- URL điều khiển Jenkins được hỗ trợ bởi Application Load Balancer (ALB).
- Bạn sẽ sử dụng Amazon Virtual Private Cloud (Amazon VPC) mặc định cho ví dụ này.
- Bộ điều khiển Jenkins chạy như một dịch vụ trong Amazon ECS bằng cách sử dụng Fargate làm loại khởi chạy. Bạn sẽ sử dụng Amazon Elastic File System (Amazon EFS) làm nơi lưu trữ cố định cho tác vụ bộ điều khiển Jenkins. Bộ điều khiển Jenkins và Amazon EFS được triển khai trong các mạng con riêng tư.
Yêu cầu tiên quyết
Trong bài viết này, bạn sẽ sử dụng AWS CDK bằng TypeScript.
Hãy làm theo hướng dẫn về Bắt đầu sử dụng AWS CDK để:
1. Cài đặt môi trường cục bộ của bạn.
2. Khởi động tài khoản phát triển của bạn.
Code
Hãy xem xét mã đã sử dụng để định nghĩa môi trường Jenkins trên AWS bằng cách sử dụng AWS CDK.
Thiết lập các lệnh nhập
import { Duration, IResource, RemovalPolicy, Stack, Tags } from ‘aws-cdk-lib’;
import { Construct } from ‘constructs’;
import * as cdk from ‘aws-cdk-lib’;
import * as ecs from ‘aws-cdk-lib/aws-ecs’;
import * as efs from ‘aws-cdk-lib/aws-efs’;
import { Port } from ‘aws-cdk-lib/aws-ec2’;
import * as elbv2 from ‘aws-cdk-lib/aws-elasticloadbalancingv2’;
Thiết lập Amazon ECS của bạn, đó là một nhóm hợp lý của các tác vụ hoặc dịch vụ và đặt vpc
export class AppStack extends Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const jenkinsHomeDir: string = ‘jenkins-home’;
const appName: string = ‘jenkins-cdk’;
const cluster = new ecs.Cluster(this, `${appName}-cluster`, {
clusterName: appName,
});
const vpc = cluster.vpc;
Thiết lập Amazon EFS để lưu trữ dữ liệu
const fileSystem = new efs.FileSystem(this, `${appName}-efs`, {
vpc: vpc,
fileSystemName: appName,
removalPolicy: RemovalPolicy.DESTROY,
});
Thiết lập Điểm Truy Cập, đó là các điểm truy cập cụ thể cho ứng dụng vào hệ thống tệp Amazon EFS, giúp quản lý truy cập của ứng dụng vào tập dữ liệu chia sẻ dễ dàng hơn
const accessPoint = fileSystem.addAccessPoint(`${appName}-ap`, {
path: `/${jenkinsHomeDir}`,
posixUser: {
uid: ‘1000’,
gid: ‘1000’,
},
createAcl: {
ownerGid: ‘1000’,
ownerUid: ‘1000’,
permissions: ‘755’,
},
});
Thiết lập Định Nghĩa Tác Vụ để chạy các bản Docker container trong Amazon ECS
const taskDefinition = new ecs.FargateTaskDefinition(
this,
`${appName}-task`,
{
family: appName,
cpu: 1024,
memoryLimitMiB: 2048,
}
);
Thiết lập một Khối lưu trữ ánh xạ Amazon EFS ở trên vào Định Nghĩa Tác Vụ
taskDefinition.addVolume({
name: jenkinsHomeDir,
efsVolumeConfiguration: {
fileSystemId: fileSystem.fileSystemId,
transitEncryption: ‘ENABLED’,
authorizationConfig: {
accessPointId: accessPoint.accessPointId,
iam: ‘ENABLED’,
},
},
});
Thiết lập Container bằng cách sử dụng Định Nghĩa Tác Vụ và hình ảnh Jenkins từ bảng đăng ký
“`typescript
const containerDefinition = taskDefinition.addContainer(appName, {
image: ecs.ContainerImage.fromRegistry(‘jenkins/jenkins:lts’),
logging: ecs.LogDrivers.awsLogs({ streamPrefix: ‘jenkins’ }),
portMappings: [{ containerPort: 8080 }],
});
“`
Thiết lập Điểm Kết Nối để liên kết lưu trữ tạm thời với container
“`typescript
containerDefinition.addMountPoints({
containerPath: ‘/var/jenkins_home’,
sourceVolume: jenkinsHomeDir,
readOnly: false,
});
“`
Thiết lập Dịch Vụ Fargate để chạy container không máy chủ
“`typescript
const fargateService = new ecs.FargateService(this, `${appName}-service`, {
serviceName: appName,
cluster: cluster,
taskDefinition: taskDefinition,
desiredCount: 1,
maxHealthyPercent: 100,
minHealthyPercent: 0,
healthCheckGracePeriod: Duration.minutes(5),
});
fargateService.connections.allowTo(fileSystem, Port.tcp(2049));
“`
Thiết lập ALB và thêm bộ lắng nghe để kiểm tra các yêu cầu kết nối, sử dụng giao thức và cổng bạn đã cấu hình.
const loadBalancer = new elbv2.ApplicationLoadBalancer(
this,
`${appName}-elb`,
{
loadBalancerName: appName,
vpc: vpc,
internetFacing: true,
}
);
const lbListener = loadBalancer.addListener(`${appName}-listener`, {
port: 80,
});
Thiết lập Mục Tiêu để định tuyến yêu cầu đến Jenkins chạy trên Amazon ECS bằng cách sử dụng Fargate
const loadBalancerTarget = lbListener.addTargets(`${appName}-target`, {
port: 8080,
targets: [fargateService],
deregistrationDelay: Duration.seconds(10),
healthCheck: { path: ‘/login’ },
});
}
}
Triển khai Jenkins
Bây giờ bạn đã có toàn bộ mã nguồn, hãy triển khai định nghĩa AWS CDK:
- Đảm bảo bạn đã hoàn thành các bước tiên quyết từ trước đó.
- Cài đặt các gói bằng cách chạy lệnh sau trong dòng lệnh IDE của bạn:
npm i
- Bây giờ bạn sẽ triển khai định nghĩa AWS CDK của bạn vào tài khoản dev của bạn:
cdk deploy
Bây giờ chúng ta sẽ đăng nhập vào Jenkins
- Trong trình duyệt của bạn, sử dụng Tên DNS từ Máy cân bằng tải được triển khai
- Trong Amazon CloudWatch, sẽ có một nhóm nhật ký được tạo ra và liên quan đến Dịch vụ Cụm.
- Truy cập vào nhật ký đó và bạn sẽ thấy nó đầu ra Mật khẩu để đăng nhập vào Jenkins
- Trong Jenkins, theo hướng dẫn để tiếp tục cài đặt
Dọn dẹp
Để tránh gây ra các khoản phí trong tương lai, hãy xóa tài nguyên.
Hãy phá hủy giải pháp triển khai của chúng ta
- Trong dòng lệnh IDE của bạn:
cdk destroy
Kết luận
Với bản tổng quan này, chúng ta đã có thể bao gồm các điểm sau:
- Xây dựng Máy cân bằng tải Linh hoạt
- Sử dụng AWS Fargate với một Jenkins AMI
- Tất cả các tài nguyên hoạt động theo cách không cần máy chủ
- Tất cả được xây dựng bằng AWS CDK