CI / CD dengan AWS dan Bambu

Tim kami terdiri dari satu pengembang dan satu insinyur DevOps. Saya bertanggung jawab untuk menyebarkan aplikasi ke kluster ECS Amazon. Sebagai server CI / CD, saya menggunakan Bamboo. Pada artikel ini, saya akan menjelaskan secara rinci bagaimana saya menggunakan aplikasi di lingkungan pengembang.





Bangun gambar Docker


Di sini saya ikuti langkah-langkah ini:

  • Langkah 1: Instal dan konfigurasikan Docker;
  • Langkah 2: Konfigurasikan artefak dalam Bambu;
  • Langkah 3: Mengkonfigurasi repositori Amazon ECR;
  • Langkah 4: Bangun gambar Docker di Bambu.

Langkah 1: Instal dan Konfigurasi Docker


Pertama, saya memutakhirkan server tempat Bamboo diinstal, menginstal paket yang diperlukan, dan mengatur repositori Docker. Perlu dicatat bahwa saya menginstal Bamboo pada sistem operasi CentOS 7. Informasi tentang menginstal buruh pelabuhan pada sistem operasi lain dapat ditemukan di www.docker.com .

$ sudo yum update $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

Kemudian saya menginstal aplikasi Docker dan memulai layanan:

 $ sudo yum install docker-ce docker-ce-cli containerd.io $ sudo systemctl enable docker $ sudo systemctl start docker 

Lalu saya menambahkan pengguna bambu ke grup Docker:

 $ sudo usermod -aG docker bamboo $ sudo su - bamboo $ docker run hello-world 

Jika, setelah menjalankan perintah ini, buruh pelabuhan merespons dengan pesan "Halo dari Docker!", Maka ini berarti instalasi saya berfungsi dengan benar.

Langkah 2. Konfigurasikan artefak dalam Bambu


Pengembangan aplikasi sedang berlangsung di Grails . Saat mengompilasi aplikasi, file dengan perang ekstensi dibuat. File ini, dalam terminologi Bambu, adalah artefak. Konfigurasikan Bamboo untuk menggunakan file ini dalam tugas selanjutnya. Untuk melakukan ini, saya pergi ke tab Tugas :



Dan saya mengatur tugas Grails, seperti yang ditunjukkan di bawah ini:



Kita melihat bahwa Grails pertama membersihkan folder build, kemudian menjalankan tes, dan akhirnya membuat file perang untuk lingkungan dev.

Setelah itu, saya klik pada tab Artefak dan tombol Buat artefak :



Saya mendefinisikan artefak seperti yang ditunjukkan di bawah ini:



Grails menempatkan file perang di direktori build / libs . Saya akan memeriksa parameter Bersama , karena saya akan memerlukan artefak ini nanti.

Sekarang saya membuat proyek penyebaran dan menetapkan artefak untuk digunakan dalam rencana pembangunan saya:





Saya juga mengatur tugas unduhan Artifact dalam proyek penerapan:



Dengan demikian, Bamboo sekarang dikonfigurasi untuk menggunakan file perang.

Langkah 3. Konfigurasikan repositori Amazon ECR


Amazon ECR adalah layanan penyimpanan dan manajemen Docker untuk gambar. Untuk mengonfigurasi, buka konsol AWS dan pilih ECR:



Setelah membuat repositori, saya mendapatkan alamat berikut:

 aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard 

Setelah menyelesaikan konfigurasi, di sini Anda juga dapat menemukan instruksi tentang cara masuk, cara mengunduh gambar dari repositori dan mengunggah gambar ke repositori.

Langkah 4: Bangun Gambar Docker di Bambu


Sekarang saya perlu mengkonfigurasi pemicu untuk mulai membangun gambar Docker. Untuk melakukan ini, saya pergi ke tab Pemicu dan klik tombol Tambahkan pemicu :



Di sini saya memilih Build setelah berhasil membangun opsi paket sehingga gambar Docker dibangun setelah mengkompilasi proyek.

Sekarang kita perlu menambahkan tugas membangun gambar Docker. Untuk melakukan ini, buka tab Tugas , klik Tambahkan tugas , pilih jenis Docker . Masukkan deskripsi dan pilih gambar Build a Docker dari menu drop-down. Di bidang Repositori , masukkan

  aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest. 

Adapun Dockerfile, bisa seperti yang ditunjukkan di bawah ini:

 FROM openjdk:8-jre COPY *.war /usr/src/onboard.war WORKDIR /usr/src CMD ["/bin/bash", "-c", "java -DdataSource.url=$DATASOURCE_URL -DdataSource.username=$DATASOURCE_USERNAME -DdataSource.password=$DATASOURCE_PASSWORD -jar onboard.war"] 

Ketika Anda memulai aplikasi, Anda harus menentukan database. Variabel lingkungan DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD digunakan untuk mengirimkan informasi ini ke aplikasi, tetapi nilainya ditentukan saat wadah dimulai.

Ini menyelesaikan proses pengaturan untuk merakit gambar Docker dengan aplikasi. Langkah selanjutnya adalah mengonfigurasi unduhan gambar ini ke repositori Amazon ECR.



Unggah gambar ke Registry Wadah Elastis


Anda dapat menggunakan Elastic Container Registry untuk menyimpan gambar yang dikumpulkan menggunakan Bamboo. Untuk mencapai ini, saya mengikuti langkah-langkah ini:

  • Langkah 1. Instal Pembantu Kredensial Amazon ECR Docker
  • Langkah 2. Hubungkan peran IAM ke server Bamboo
  • Langkah 3: Konfigurasikan pekerjaan booting gambar Docker

Langkah 1. Instal Pembantu Kredensial Amazon ECR Docker


Untuk mengunduh gambar Docker ke Amazon ECR, Anda harus memiliki kredensial. Kredensial ini dapat diperoleh dengan menjalankan perintah

 aws ecr get-login 

Namun, kredensial ini hanya berlaku selama 12 jam. Oleh karena itu, Anda dapat menjalankan perintah di atas setiap kali sebelum mengunggah gambar ke ECR, atau menginstal ECR Docker Credential Helper, yang menjaga kredensial sementara tetap mutakhir dan masuk ke ECR. Ikuti langkah-langkah ini untuk menginstal ECR Docker Credential Helper.

Pertama, Anda perlu menginstal git dan kemudian mengkloning repositori github:

 $ sudo yum install git $ sudo su - bamboo $ git clone https://github.com/awslabs/amazon-ecr-credential-helper.git $ make docker 

Maka Anda perlu meletakkan baris berikut di file /home/bamboo/.docker/config.json :

 { "credsStore": "ecr-login" } 

Dan salin aplikasi yang dikompilasi ke direktori / usr / bin :

 $ exit $ sudo cp /home/bamboo/docker-credential-ecr-login /usr/bin/ 

Langkah 2. Hubungkan peran IAM ke server Bamboo


Agar server Bamboo dapat menggunakan ECR, Anda harus membuat peran, menambahkan kebijakan AmazonEC2ContainerRegistryPowerUser ke peran ini, dan kemudian melampirkan peran ini ke instance EC2 Bamboo. Buka konsol AWS dan pilih IAM. Selanjutnya, klik tombol Buat peran , pilih layanan AWS dan EC2 , seperti yang ditunjukkan di bawah ini:



Kemudian kita klik tombol Next: Izin dan pada layar berikutnya kita menemukan dan memilih kebijakan AmazonEC2ContainerRegistryPowerUser . Setelah itu, kami selesai membuat peran dan melampirkannya ke server Bamboo kami.

Langkah 3: Konfigurasikan pekerjaan booting gambar Docker


Aplikasi yang kami buat dan kumpulkan gambar Docker dengan file perang. Sekarang Anda perlu mengunggah gambar ini ke repositori. Untuk melakukan ini, saya menambahkan tugas Docker lain, kali ini untuk mengunggah gambar ke repositori ECR. Saya pergi ke tab Tugas , klik Tambah tugas , pilih jenis Docker . Saya memasukkan deskripsi dan memilih Push a Docker image to an Docker registry dari menu drop-down. Saya memilih Custom registry dan memasukkan alamat repositori di bidang Repository . Untuk jenis Otentikasi, saya pilih Gunakan kredensial asli agen .

Ini menyelesaikan proses pengaturan untuk memuat gambar Docker ke repositori Amazon ECR. Langkah-langkah berikut menjelaskan proses mengonfigurasi kluster dan layanan untuk meluncurkan aplikasi kontainer. Tetapi sebelum itu, Anda perlu mengonfigurasi opsi peluncuran untuk wadah. Inilah yang akan kita lakukan sekarang.



Buat Definisi Tugas ECS Amazon


Definisi Tugas - parameter eksekusi wadah ditulis di sini. Aplikasi kita menggunakan basis data yang parameternya ditentukan saat wadah dimulai, jadi di bagian ini kita juga akan membuat basis data. Saya menggunakan Amazon RDS sebagai database, dan saya menyimpan kata sandi untuk mengakses database dalam bentuk terenkripsi di AWS System Manager Parameter Store . Langkah-langkah berikut yang saya ikuti untuk membuat Definisi Tugas:

  • Langkah 1. Membuat database pada instance Amazon RDS;
  • Langkah 2. Mengkonfigurasi Parameter Store AWS System Manager;
  • Langkah 3. Buat Definisi Tugas.

Langkah 1. Buat database pada instance Amazon RDS


Aplikasi kami menggunakan database PostgreSQL. Untuk membuat database, buka konsol AWS, pilih layanan Amazon RDS, klik tombol Buat database , lalu pilih PostgreSQL sebagai mesin basis data. Pada halaman berikutnya, saya memilih Dev / Test sebagai lingkungan kerja dan klik Next . Kemudian saya menunjuk DB instance identifier sebagai onboard-dev-db , dan master username sebagai devdbadmin . Lalu saya pergi ke halaman berikutnya untuk mengkonfigurasi VPC, grup subnet, dan grup keamanan. Basis data ini akan digunakan pada jaringan pribadi, jadi saya pilih Tidak untuk parameter aksesibilitas Publik . Saya memasukkan devdb di bidang Nama database dan klik tombol Buat database .

Langkah 2. Mengkonfigurasi Parameter Store AWS System Manager


Saya menyimpan kata sandi basis data dalam bentuk terenkripsi. Untuk melakukan ini, buka konsol AWS dan pergi ke AWS System Manager β†’ Sumber Daya Bersama β†’ Toko Parameter β†’ Buat Parameter. Saya memasukkan devdbpassword sebagai nama parameter dan memilih SecureString untuk jenis parameter, lalu saya memasukkan kata sandi basis data di bidang Nilai .

Langkah 3. Buat Definisi Tugas


Amazon ECS adalah kluster tempat aplikasi wadah berjalan. Ini menggunakan Definisi Tugas untuk menentukan parameter eksekusi untuk aplikasi kontainer. Untuk mengatur parameter tersebut, klik tombol Buat Definisi Tugas baru . Lalu saya pilih Fargate sebagai jenis startup dan beralih ke langkah berikutnya. Di sini saya menetapkan nama sebagai onboard-dev-taskdef . Untuk parameter bidang peran IAM pelaksanaan tugas, pilih Buat peran baru . Adapun sumber daya yang dialokasikan untuk aplikasi ini, saya menetapkan 2 GB memori dan 1 vCPU. Sekarang Anda perlu menambahkan opsi peluncuran kontainer. Saya akan beri nama container onboard-dev-container . Saya akan memberi nama nama gambar seperti ini:

aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest . Pembantu Kredensial Amazon ECR Docker akan menangani autentikasi ECR, jadi saya membiarkan opsi otentikasi repositori Pribadi tidak dicentang. Di lingkungan dev, aplikasi tersedia di port 8080, jadi untuk parameter pemetaan port saya menulis 8080 dan pilih protokol tcp . Parameter URL Database, nama pengguna, dan kata sandi diteruskan ke wadah menggunakan variabel lingkungan. Saya mengatur parameter ini di bagian variabel Lingkungan. Untuk mendapatkan nilai parameter devdbpassword dari Parameter Store, saya menentukan tipe ValueFrom . Hal terakhir yang saya konfigurasikan adalah konfigurasi Log , di sini saya pilih Auto-configure CloudWatch Logs . Sekarang pembuatan Definisi Tugas selesai.

Namun, peran ecsTaskExecutionRole memerlukan kebijakan untuk mendapatkan devdbpassword dari Parameter Store. Untuk melakukannya, buka Peran IAM dan pilih ecsTaskExecutionRole, klik Tambahkan kebijakan sebaris . Dalam hal ini, saya menambahkan menggunakan editor visual. Oleh karena itu, di bidang Layanan saya masuk ke System Manager , di bidang Tindakan - GetParameters . Lalu saya klik Tambahkan ARN untuk bidang Sumber Daya dan isi nilai saya:



Pada akhirnya, saya melihat nilai-nilai parameter yang ditetapkan dengan mengklik Tinjau kebijakan, berikan nama dan selesai bekerja dengan konfigurasi ecsTaskExecutionRole.

Ini melengkapi konfigurasi pengaturan aplikasi wadah peluncuran. Sekarang Anda perlu membuat kluster dan layanan ECS.



Buat Layanan ECS Amazon


Aplikasi kontainer kami berjalan sebagai layanan di kluster ECS. Untuk mengonfigurasi, Anda harus melakukan langkah-langkah berikut:

  • Langkah 1. Buat kluster Amazon ECS;
  • Langkah 2: Membuat Layanan

Langkah 1. Buat Amazon ECS Cluster


Untuk membuat kluster ECS, buka konsol AWS dan pilih layanan ECS. Kemudian klik Buat Cluster dan pilih templat klaster hanya Jaringan . Pada halaman berikutnya, saya menamakan cluster sebagai onboard-dev-cluster dan menyelesaikan cluster. Sekarang saya memiliki klaster ECS berbasis Fargate .

Langkah 2: Membuat Layanan


Untuk membuat layanan, saya mengklik tautan on-cluster-dev , kemudian pergi ke tab Layanan dan klik tombol Buat . Untuk tipe peluncuran saya pilih Fargate, untuk Definisi Tugas saya pilih onboard-dev-taskdef. Selain itu, saya memilih onboard-dev-cluster di bidang Cluster. Di bidang Nama layanan , saya menulis onboard-dev. Saya menetapkan parameter Jumlah tugas ke nol, karena saya tidak ingin memulai aplikasi sekarang. Saya membiarkan parameter persen sehat minimum sama dengan 100, dan persen maksimum sama dengan 200. Untuk parameter tipe penempatan, pilih Pembaruan bergulir dan pergi ke langkah berikutnya.

Pada halaman Konfigurasi Jaringan , untuk parameter VPC Cluster , saya memilih VPC yang sebelumnya dibuat yang disebut VPC Pengembangan . Aplikasi yang sedang dikembangkan hanya tersedia di jaringan pribadi, jadi saya memilih dua subnet pribadi. Untuk mengkonfigurasi grup keamanan, saya klik tombol Edit , lalu pilih Pilih grup keamanan yang ada , kemudian grup keamanan default dan klik tombol Simpan . Untuk parameter IP publik yang ditetapkan secara otomatis , saya pilih Dinonaktifkan . Selanjutnya, untuk parameter jenis penyeimbang beban , saya memilih Tidak Ada dan membiarkan opsi Aktifkan integrasi penemuan layanan tidak dicentang . Lalu saya klik Next, Next dan Create service .

Sekarang saya memiliki layanan di mana jumlah pekerjaan yang berjalan adalah nol. Kami akan mengonfigurasi peluncuran aplikasi pada langkah berikutnya.



Pembaruan Layanan


Segera setelah pengembang memperbarui kode aplikasi, penerapan kami melalui pembuatan gambar Docker, mengunggahnya ke Elastic Container Registry, dan akhirnya meluncurkan aplikasi kontainer sebagai layanan di ECS Fargate cluster. Saat ini, jumlah pekerjaan yang berjalan di cluster adalah nol. Agar aplikasi dapat dimulai, Anda perlu memperbarui layanan, menunjukkan jumlah yang sama dengan satu. Saya mengikuti langkah-langkah ini untuk mencapai ini:

  • Langkah 1. Menginstal Tugas untuk plugin AWS Bamboo;
  • Langkah 2. Memperbarui Layanan ECS

Langkah 1. Menginstal Tugas untuk plugin AWS Bamboo


Tugas untuk AWS Bamboo adalah sebuah plugin yang menyederhanakan persiapan dan pengoperasian sumber daya AWS dari proyek pembangunan dan penyebaran Bamboo. Untuk menginstal plugin ini, saya pergi ke proyek penyebaran, klik Tambahkan tugas , pergi ke Atlassian Marketplace dan instal Tugas untuk AWS (Bambu) .

Langkah 2. Memperbarui Layanan ECS


Sekarang dalam proyek penyebaran, saya menambahkan pekerjaan Layanan ECS Amazon . Kemudian saya menulis di bidang deskripsi pekerjaan Layanan Pembaruan untuk onBoard-dev . Di bidang Tindakan, pilih Perbarui Layanan dan Paksa penyebaran baru . Lalu saya memilih US East (Ohio) sebagai wilayah peluncuran. Kemudian saya menulis di bidang ARN (Nama Sumber Daya Amazon) yang sesuai untuk Task Definiton, cluster dan layanan. Dalam tugas ini, saya memperbarui jumlah tugas berjalan yang diinginkan menjadi satu. Berikutnya, saya mengisi kotak teks konfigurasi penempatan dengan nilai-nilai berikut:

 { "maximumPercent": 200, "minimumHealthyPercent": 100 } 

Saya mengatur jaringan tanpa IP publik sebagai berikut:

 { "awsvpcConfiguration": { "assignPublicIp": "DISABLED", "subnets": ["subnet-ID1", "subnet-ID2"], "securityGroups": ["sg-ID"] } } 

Di bagian Sumber untuk Kredensial Keamanan AWS, saya memilih Peran IAM untuk EC2 .

Saya harus dapat memperbarui ECS, jadi saya melampirkan kebijakan AmazonECS_FullAccess ke instance Bamboo EC2 saya. Untuk melakukan ini, buka konsol AWS, pilih IAM. Kemudian saya memilih peran yang saya gunakan untuk server Bamboo saya. Saya klik tombol Lampirkan kebijakan , saya menemukan kebijakan AmazonECS_FullAccess, saya memilih kotak centang di sebelah kiri dan selesai melampirkan kebijakan.

Ini menyimpulkan pengaturan CI / CD menggunakan AWS dan Bamboo. Dengan demikian, ketika pengembang memperbarui kode aplikasi, mengunggah kode ini ke repositori, pengujian dan perakitan aplikasi diluncurkan. Kemudian gambar Docker dibangun dengan file perang aplikasi, dan gambar ini disalin ke repositori Amazon ECR. Selanjutnya, di kluster Amazon ECS, aplikasi kontainer diluncurkan sebagai layanan, yang memperbarui aplikasi saat ini jika belum dihentikan. Jika aplikasi dihentikan untuk menghemat sumber daya, maka aplikasi akan dimulai. Setelah memeriksa aplikasi di lingkungan dev, Anda dapat menghentikan aplikasi dengan menentukan jumlah pekerjaan yang berjalan di cluster ke nol.

Jika Anda menyukai artikel dan memiliki ide untuk perbaikan, tulis di komentar.

Source: https://habr.com/ru/post/id458648/


All Articles