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.
AWS CLI'yi yükleyin : AWS Komut Satırı Arayüzünü yüklemek için kılavuzu izleyin.
AWS SAM'i (Sunucusuz Uygulama Modeli) yükleyin : 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.
Ortam Kurulumu
AWS Kurulumu :
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: //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: //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: //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 //aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: //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 # //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 "//${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
API'yi test edin
API'yi test etmeden önce DynamoDB'ye SAM tarafından oluşturulan Lambda rolüne erişim izni verin.
API Gateway'e gidin ve hizmetinizin URL'sini almak için şu adımları izleyin:
Content-Type: application/json
).
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 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
CodePipeline oluşturma
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