Bu makale, AWS hizmetlerini kullanan Sunucusuz bir API'nin geliştirilmesini gösterir ve AWS ortamında Sürekli Entegrasyon/Sürekli Dağıtım (CICD) hattı oluşturur.
Bölüm 1: API Ağ Geçidinden gelen istekleri işlemek ve Sunucusuz Uygulama Modeli'ni kullanarak verileri DynamoDB'de sürdürmek için bir Lambda işlevinin oluşturulmasını araştırıyor.
Bölüm 2: AWS'de CodeCommit deposunu yapılandırmak ve depoya yeni değişikliklerin gönderilmesi üzerine otomatik olarak bir derleme süreci başlatan bir CICD işlem hattı kurmak için gerekli adımların ayrıntılarını verir.
Bu proje için bir AWS hesabına ihtiyacınız olacak (Ücretsiz Kullanım yeterlidir). Aşağıdaki AWS bileşenleri kullanılacaktır:
Yerel geliştirme ortamınızın aşağıdaki gibi kurulduğundan emin olun:
AWS CLI'yi yükleyin : AWS Komut Satırı Arayüzünü yüklemek için buradaki kılavuzu izleyin.
AWS SAM'i (Sunucusuz Uygulama Modeli) yükleyin : Buradaki talimatları izleyerek SAM CLI'yi yükleyin.
Bir IDE seçin : Geliştirme için IntelliJ veya benzer bir IDE kullanın. IntelliJ'i tercih ederim
Paketleme için Maven : Uygulamanızı paketlemek için Maven'in kurulu olduğundan emin olun.
İsteğe bağlı: Docker (Lambda işlevlerini yerel olarak test etmeniz gerekiyorsa): Lambda işlevlerini yerel olarak test etmeyi planlıyorsanız Docker'ı yükleyin.
Bu araçlar ve bileşenler projenin temelini oluşturacaktır.
Bu bölümde, işleyici sınıfını tamamlama, oluşturma, AWS'ye dağıtma ve Postman kullanarak test yürütme dahil olmak üzere AWS SAM kullanarak bir başlangıç projesi oluşturma sürecini göreceğiz.
Ortam Kurulumu
AWS Kurulumu :
https://aws.amazon.com/console/ adresindeki AWS konsoluna gidin, yönetici kullanıcı kimlik bilgilerinizi kullanarak oturum açın.
AWS CLI'yi Yerel Makinede Yapılandırma :
$ aws configure
çalıştırınAWS Sunucusuz Uygulama Modelini (SAM) kullanarak bir Proje başlatın :
$ sam init
çalıştırınProjeyi Yeniden Adlandırın : Projeyi tercih ettiğiniz adla yeniden adlandırın.
Projeyi IntelliJ'de açın : IntelliJ'i başlatın ve projeyi açın.
pom.xml dosyasına Bağımlılıklar ekleyin :
Gerekli bağımlılıkları pom.xml
dosyasına ekleyin. Diğer bağımlılıklar SAM tarafından otomatik olarak dahil edileceğinden yalnızca DynamoDB'yi eklemeniz gerekir.
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.573</version> </dependency> </dependencies>
İşleyici Sınıfını Yazın
Lambda fonksiyonu için sam tarafından otomatik olarak oluşturulan handler sınıfını düzenleyip aşağıdaki kodu ekleyin; bu basit bir koddur ve gerçek projeler için daha modüler kod kullanmak isteyebilirsiniz.
public class UserRequestHandler implements RequestHandler<Map<String,String>, Map<String,String>> { private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "users"; private Regions REGION = Regions.US_EAST_1; @Override public Map<String,String> handleRequest(Map<String,String> input, Context context) { this.initDynamoDbClient(); LambdaLogger logger = context.getLogger(); logger.log("Input payload:" + input.toString()); String userId = UUID.randomUUID().toString(); String firstName= input.get("firstName"); String lastName= input.get("lastName"); Map<String, AttributeValue> attributesMap = new HashMap<>(); attributesMap.put("id", new AttributeValue(userId)); attributesMap.put("firstName", new AttributeValue(firstName)); attributesMap.put("lastName", new AttributeValue(lastName)); logger.log(attributesMap.toString()); amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); Map<String, String> response = new HashMap<>(); response.put("id", userId); response.put("firstName", firstName); response.put("lastName", lastName); return response; } private void initDynamoDbClient() { this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() .withRegion(REGION) .build(); } }
SAM Şablon dosyasını güncelleyin
SAM şablon dosyası, değişikliklerin AWS'de oluşturulup dağıtılmasında önemli bir rol oynar. Proje için dosyayı güncelleyin. Bu dosyada odaklanılacak temel öğeler Lambda işlev adları ve API Ağ Geçidi uç noktalarıdır. Bunlar, sunucusuz uygulamanızın işlevselliğinin merkezinde yer alır.
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > pc-aws-user-api Sample SAM Template for pc-aws-user-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 20 MemorySize: 128 Tracing: Active Api: TracingEnabled: true Resources: UserRequestHandlerLambdaFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: PcAwsUsersApi Handler: com.pc.aws.users.UserRequestHandler::handleRequest Runtime: java11 Architectures: - x86_64 MemorySize: 512 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 # More info about tiered compilation https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /users Method: post ApplicationResourceGroup: Type: AWS::ResourceGroups::Group Properties: Name: Fn::Sub: ApplicationInsights-SAM-${AWS::StackName} ResourceQuery: Type: CLOUDFORMATION_STACK_1_0 ApplicationInsightsMonitoring: Type: AWS::ApplicationInsights::Application Properties: ResourceGroupName: Ref: ApplicationResourceGroup AutoConfigurationEnabled: 'true' Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api PcAwsUsersApi: Description: API Gateway endpoint URL for Prod stage Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/" UserRequestHandlerLambdaFunction: Description: Lambda Function ARN Value: !GetAtt UserRequestHandlerLambdaFunction.Arn UserRequestHandlerLambdaFunctionIamRole: Description: Implicit IAM Role created Value: !GetAtt UserRequestHandlerLambdaFunctionRole.Arn
SAM kullanarak Kod Oluşturun ve Dağıtın
IntelliJ'de terminali açın ve aşağıdaki komutları yürütün:
$ sam build
$ sam deploy –guided
İstendiğinde Yığın adını "PcAwsUsersApi" olarak sağlayın ve varsayılan seçenekleri seçin.
Çıktı, oluşturulan CloudFormation yığınını sergileyecek ve aynı zamanda API Ağ Geçidi uç noktasını da sağlayacaktır.
API'yi test edin
API'yi test etmeden önce DynamoDB'ye SAM tarafından oluşturulan Lambda rolüne erişim izni verin.
Bu adım, Lambda işlevinin DynamoDB ile etkileşim kurmak için gerekli izinlere sahip olmasını sağlar.
API Gateway'e gidin ve hizmetinizin URL'sini almak için şu adımları izleyin:
AWS Konsolunda API Gateway'e gidin.
API'nizi seçin.
Sol kenar çubuğunda "Aşamalar"ı tıklayın.
"Aşamalar" altında "Ürün" aşamasını seçin.
Sahne Düzenleyici bölümünde "URL'yi Çağır" seçeneğini bulacaksınız. Bu URL'yi kopyalayın.
Content-Type: application/json
).
Bu bölümde AWS CodeCommit, CodeBuild ve CodePipeline kullanılarak bir CICD işlem hattının nasıl oluşturulacağını göstereceğiz. İşlem hattı, depodan kod alan, derleme dosyasını kullanarak derleyen ve yığını oluşturmak için CloudFormation'ı tetikleyen bir derleme işlemi başlatacaktır.
CodeCommit Deposu Oluşturun
AWS'de oturum açın ve CodeCommit hizmetini arayın.
Projenizin kaynak kodunu depolamak için AWS CodeCommit'te yeni bir depo oluşturun.
Kodu Depoya Kaydet
IntelliJ'de terminali açın ve Adım I'de oluşturulan kodu işlemek için aşağıdaki komutları girin.
$ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"
Değişiklikleri uzak Repo'ya aktarın
CodeCommit repo URL'sini aws konsolundan kopyalayın.
$ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password
AWS CodeBuild projesi oluşturun
Uygulamanızı nasıl oluşturacağınızı belirten bir CodeBuild projesi oluşturun. Buna derleme ortamlarının, derleme komutlarının ve bağımlılıkların tanımlanması da dahildir.
CodeBuild'ı kurmak için proje dizininizde buildspec.yml
adında bir yapı belirtimi dosyası oluşturmanız gerekir. Bu dosya CodeBuild için derleme komutlarını ve talimatlarını içerecektir.
buildspec.yml
dosyası oluşturmaya ilişkin ayrıntılı talimatlar için buradaki resmi belgelere başvurabilirsiniz.
version: 0.2 phases: install: runtime-versions: java: corretto11 pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - sam build - sam package --output-template-file pcoutputtemplate.yaml --s3-bucket com-appsdev-pc-001 post_build: commands: - echo Build completed on `date` artifacts: files: - pcoutputtemplate.yaml
Yeni dosyayı yerelden depoya aktarın.
Bundan sonra, Kodun Repo'dan Çekilip Çekilmediğini ve yapıtların oluşturulup oluşturulmadığını görmek için projeyi inşa edebilirsiniz.
CodePipeline oluşturma
İşlem hattı, git taahhüdüne göre otomatik olarak kod oluşturacak ve dağıtacaktır.
Boru Hattını Test Edin
$ git branch CR01 $ git checkout CR01 $ git add . $ git commit -m “CR01” $ git push --set-upstream origin CR01 You cand also create a pull request in aws code commit, just for simplicity I am merging from local $ git checkout master $ git merge --ff-only CR01 $ git push
Bu, kodunuzda değişiklik yapma, bunları depoya gönderme ve CICD işlem hattının güncellenmiş kodu otomatik olarak tetikleyip dağıtma sürecini simüle edecektir.
Makale, AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild ve CodePipeline'dan yararlanarak esnek ve otomatik bir dağıtım sürecinin nasıl tasarlanacağını gösteriyor.
Okuduğunuz için teşekkürler. Sunucusuz çalışmalarınızın başarı ve yeniliklerle buluşmasını dilerim!