gRPC ile AWS Application Load Balancer Kurulumu ve Kullanımı
AWS CDK ile sıfırdan gRPC destekli Application Load Balancer (ALB) kurulumu!
Herkese merhaba! Yılın son blogpost’u ile yeniden birlikteyiz.
Bu yazıda AWS Application Load Balancer’a 29 Ekim 2020 tarihinde gelmiş olan gRPC protokolü desteğini ve ilgili kurulumların sıfırdan nasıl yapılacağı hakkında bilgiler veriyor olacağım. Bunu yaparken her zamanki gibi bir de örnek uygulamamız mevcut. İlk kısımdan başlayalım.
Neler Gerekli
Genel Bakış
AWS Application Load Balancer üzerinde gRPC protokolüyle Load Balancing işlemi yapmak istediğimizde, bununla beraber birçok servise de dokunmuş oluyoruz. Mecburi yapılması gerekenleri dışında bu uygulama için hazırladığım, -Infrastructure as Code- tarafında ilgili uygulamanın altyapısını yaratmak için AWS CDK kullanımı gerçekleştirdim. Hem Github kaynağında hem de bu yazıda ilgili bilgilere sahip olacaksınız. Bunun dışında, AWS Certificate Manager, Route 53 gibi iki ayrı servisle de “gRPC Application Load Balancer” özelinde işlem yapıyor olacağız.
Yukarıda bulunan şekilden kısaca bahsedebiliriz. Application Load Balancer, gRPC protokolü kullanımı için dinleme ucunda (Listener) güvenli bir bağlantı mecburiyeti koşuyor (HTTPS). Bu işlemi sağlamak içinse AWS Certificate Manager’da bir SSL sertifika sahibi oluyoruz ve kendi domain’imize bu SSL sertifikasını bağlıyoruz. Artık bu güvenli domain üzerinden ilgili Load Balancer’ın gRPC ucuna erişebilir hale geliyoruz. Bu uçtan sonra Target Group diye bahsedilen dağıtım grubu için ise protokolümüz HTTP veya HTTPS olabiliyor. Protokol versiyonu için ise gRPC kullanıyoruz.
İlk Adımlar
Öncelikle, bu senaryo için hazırlanmış olan kaynak kodları bilgisayarınıza indirin ve bundan sonraki adımları sırasıyla takip edin. Kaynak koda ulaşmak için tıklayın.
Kaynak kod içerisinde “cdk-iac” klasörü içerisinde AWS’te oluşturacağımız altyapımız ve ana dizinde ise Node.js ile yazılmış örnek bir gRPC uygulaması bulunmakta.
AWS ECR — Docker İşlemleri
Uygulama kaynak kodunda bulunan Dockerfile yardımıyla uygulamamızı AWS ECR servisine gönderimini sağlayacak ve sonrasında bu Docker imajını uygulama sunucumuzda kullanıyor olacağız. Bunun için aşağıdaki komutlarlı terminalinizde çalıştırarak bu işlemi tamamlayın. “1234567890” kısmına kendi AWS hesap ID’nizi girmeniz gerekmekte.
- ECR’a login oluyoruz
aws ecr get-login-password — region eu-central-1 | docker login — username AWS — password-stdin 1234567890.dkr.ecr.eu-central-1.amazonaws.com
- İlgili imaj kaynağını yaratıyoruz
aws ecr create-repository — repository-name grpc-nodejs-example
Bu işlemlemden sonra AWS ECR servisine konsol üzerinden ulaşın ve yaratmış olduğunuz repository’nin içerisine girin. Sağ üst köşede bulunan “View push commands” seçeneğini tıklayın ve karşınıza gelen ekrandaki komutları sırasıyla, indirmiş olduğumuz kodda Dockerfile’ın bulunduğu dizine gelerek çalıştırın.
Bu işlem sonunda docker imajımız AWS hesabımız içerisindeki herhangi bir uygulama sunucusu tarafından kullanıma hazır hale gelmiş olacaktır.
AWS CDK stack kurulumu
Kaynak kodun README kısmında belirtilen, AWS hesap ID’nizi değiştirdikten sonra sırasıyla ilgili AWS CDK komutlarını çalıştırın. Bu işlem sonunda ihtiyacınız olacak Networking, Uygulama Sunucusu gibi ilgili her parça otomatik olarak AWS tarafında yaratılmış olacak.
Tam burada henüz AWS’in, CloudFormation ve AWS CDK gibi araçlarının gRPC Load Balancer desteği henüz bulunmadığı için desteği bulunmayan kısımları konsol üzerinden elle yaratıyor olacağız. İlgili desteğin geliştirilme sürecini takip etmek isterseniz bu linkten ulaşabilirsiniz.
gRPC Uygulamasını Başlatma
Bu kısımda konsol üzerinden yaratılmış olan EC2 makinemize ulaşarak Docker kurulumu gerçekleştirin. Bu kurulum sonrasında uygulamayı AWS ECR reponuzdan çekerek “50051” portundan uygulamanızı host edin.
AWS Certificate Manager
Hali hazırda bir domain için sertifikasyonunuz bulunmuyor ya da AWS üzerine aktarımını gerçekleştirmemişseniz ACM üzerinden yeni bir sertifika talep edebilir ya da mevcut SSL sertifikanızı IAM’e yükleyip kullanım yapabilirsiniz.
Örnek olarak wildcard’lı bir şekilde bir SSL alımı gerçekleştirdim. Bu kısımda sertifikanızın Issued olabilmesi için ilgili değerlerin CNAME olarak domain provider’a girilmesi gerekmektedir. Ben yine bunun örneği için AWS Route 53 servisini kullandım.
Load Balancer Target Group Yaratma
Bu kısım için ALB yaratmaya geçmeden önce uygulama Target Group’umuzu yaratabiliriz.
Bu işlemde Target grubumuza bir isim veriyor, Protokol olarak HTTP ve 80 portuna açıyor; Protokol versiyon olarak da gRPC versiyonunu seçiyoruz. Yukarıda gösterilen test-vpc adlı VPC ise AWS CDK stack’iyle birlikte kurulu bir şekilde gelecektir. Uygulama sunucusu da bu VPC üzerinde bulunduğu için ALB’nin VPC kaynağı için test-vpc’yi seçerek devam edebilirsiniz.
Target grubun “Advanced Settings” kısmında healcheck değeri için ‘/HelloService.healthCheck’ girişini sağlayın ve status code olarak da 0 -sıfır- değerini girin.
Target grup yaratıldıktan sonra mevcut uygulamamızı “50051” portuyla birlikte target olarak bu grup içerisine ekliyoruz. Bu target’ın durumunu henüz bir Load Balancer ucu bu target gruba bakmadığı için “unused” durumunda göreceksiniz.
Application Load Balancer Yaratma
Bu kısımda yine AWS EC2 konsolu üzerinden Load Balancer yaratma kısmına geliyor ve Application Load Balancer seçeneğiyle beraber devam ediyoruz.
Load Balancer protokolü olarak HTTPS ve VPC olarak ise vpc-test seçimini gerçekleştiriyoruz.
Bu kısımda ACM üzerinde daha öncesinde yaratmış olduğumuz SSL sertifikasını seçerek devam ediyoruz.
Load balancer’ımız Ingress (In Bound) ucuna 443 (HTTPS) portunu giriyoruz.
Routing kısmında ise önceden yaratmış olduğumuz gRPC Target grubumuzu seçiyor ve yukarıda bahsedilen health check ayarlarını yapıyoruz.
Bu routing ayarının hemen aşağısında, yukarıda belirtilen health check path’i ve status code değerini giriyoruz.
Bu kısımdan sonra Application Load Balancer’ımız yaratılmış oluyor. Şimdi EC2 konsolunda Security Group sekmesine giderek, Load Balancer için yaratmış olduğumuz Security Group değerini, uygulama Security Group’una Ingress (In Bound) kuralı olarak ekleyelim. Bunu, Load Balancer’ın uygulamaya “50051” portu ile ulaşabilmesi için gerçekleştiriyoruz.
Bu işlemi de kaydedip kapattıktan sonra geriye sadece son bir işlem kalıyor.
Son kısımda Amazon Route 53 servisi ya da hangi domain servis sağlayıcı ile çalışıyorsanız, yaratmış olduğumuz Load Balancer’a domain üzerinden yönlendirme sağlayacağız. Bu sayede üzerinde SSL takılı olan domain’imiz üzerinden gRPC Load Balancer’a ulaşabileceğiz.
Bu işlem sonrası artık “grpc-service.azmimengu.com:443” URI’ı üzerinden gRPC Load Balancer’ına ulaşmış ve canlı ortamda kullanıma hazır hale getirmiş bulunduk.
Uygulama kod kaynağındaki gRPC test client’ı ile bağlanmak ve test etmek isterseniz aşağıdaki satırda bir değişiklik yapmanız gerekmekte.
```const grpcClient = new helloServiceProto(SERVER_URI, grpc.credentials.createInsecure()); ```
Burada yer alan “createInsecure” fonksiyonunu “createSsl” fonksiyonu ile değiştirdiğinizde kurmuş olduğunuz yapıya ulaşabilecekseniz.
Bu kısma kadar sabırla takip edip okuduğunuz için teşekkür ederim. Uygulama kaynak kodunu her zamanki gibi aşağıda bulabilirsiniz. Yazının herhangi bir kısmında açıklık göremiyorsanız çekinmeden ulaşabilirsiniz. CloudFormation ve CDK gibi ürünlerin gRPC Load Balancer desteği sonrası AWS CDK kaynak kodunda bu değişiklikleri yapıyor olacağım. Bununla beraber yukarıda görmüş olduğunuz birçok ekrandaki işlemi elle yapmamıza gerek kalmayacaktır :)
İyi seneler, Hoşçakalın.