Phần 1: Tìm hiểu cách tạo hàm Lambda để xử lý các yêu cầu từ Cổng API và duy trì dữ liệu trong DynamoDB bằng Mô hình ứng dụng phi máy chủ.
Phần 2: Chi tiết các bước cần thiết để đặt cấu hình kho lưu trữ CodeCommit trong AWS và thiết lập quy trình CICD tự động khởi tạo quy trình xây dựng khi gửi các thay đổi mới tới kho lưu trữ.
Cài đặt AWS CLI : Làm theo hướng dẫn để cài đặt Giao diện dòng lệnh AWS.
Cài đặt AWS SAM (Mô hình ứng dụng không có máy chủ) : Cài đặt SAM CLI bằng cách làm theo hướng dẫn .
Chọn một IDE : Sử dụng IntelliJ hoặc một IDE tương tự để phát triển. Tôi thích IntelliJ hơn
Maven để đóng gói : Đảm bảo bạn đã cài đặt Maven để đóng gói ứng dụng của mình.
Tùy chọn: Docker (nếu bạn cần kiểm tra các hàm Lambda cục bộ): Cài đặt Docker nếu bạn định kiểm tra các hàm Lambda cục bộ.
Thiết lập môi trường
Thiết lập AWS :
Đi tới bảng điều khiển AWS tại , Đăng nhập bằng thông tin xác thực người dùng quản trị viên của bạn.Định cấu hình AWS CLI trên Máy cục bộ :
$ aws configure
Khởi tạo Dự án bằng Mô hình ứng dụng phi máy chủ AWS (SAM) :
$ sam init
Đổi tên dự án : Đổi tên dự án thành tên ưa thích của bạn.
Mở Dự án trong IntelliJ : Khởi chạy IntelliJ và mở dự án.
Thêm phụ thuộc vào pom.xml :
Thêm các phần phụ thuộc cần thiết vào tệp pom.xml
. Bạn chỉ cần thêm DynamoDB vì các phần phụ thuộc khác sẽ được SAM tự động đưa vào.
<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>
Viết lớp xử lý
Đối với hàm lambda, hãy chỉnh sửa lớp trình xử lý do sam tạo tự động và thêm mã sau đây; đây là một mã đơn giản và đối với các dự án thực tế, bạn có thể muốn sử dụng nhiều mã mô-đun hơn. 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(); } }
Cập nhật tệp mẫu SAM
Tệp mẫu SAM đóng vai trò then chốt trong việc xây dựng và triển khai các thay đổi đối với AWS. Cập nhật tập tin cho dự án. Các thành phần chính cần tập trung vào trong tệp này là tên hàm Lambda và điểm cuối Cổng API. Chúng đóng vai trò trung tâm đối với chức năng của ứng dụng serverless của bạn.
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
Xây dựng và triển khai mã bằng SAM
Trong IntelliJ, mở terminal và thực hiện các lệnh sau: $ sam build
$ sam deploy –guided
Kiểm tra API
Trước khi thử nghiệm API, hãy cấp cho DynamoDB quyền truy cập vào vai trò Lambda do SAM tạo.
Điều hướng đến API Gateway, sau đó làm theo các bước sau để lấy URL cho dịch vụ của bạn:
Content-Type: application/json
).
Tạo kho lưu trữ CodeCommit
Đăng nhập vào AWS và tìm kiếm dịch vụ CodeCommit.
Tạo kho lưu trữ mới trong AWS CodeCommit để lưu trữ mã nguồn dự án của bạn.
Cam kết mã vào kho lưu trữ
Trong IntelliJ, mở terminal và nhập các lệnh sau để xác nhận mã được tạo ở Bước I $ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"
Đẩy các thay đổi vào Repo từ xa
Sao chép URL kho lưu trữ CodeCommit từ bảng điều khiển aws. $ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password
Tạo dự án AWS CodeBuild
Thiết lập dự án CodeBuild chỉ định cách xây dựng ứng dụng của bạn. Điều này bao gồm việc xác định môi trường xây dựng, lệnh xây dựng và các phần phụ thuộc.
Để thiết lập CodeBuild, bạn cần tạo tệp đặc tả bản dựng có tên buildspec.yml
trong thư mục dự án của mình. Tệp này sẽ chứa các lệnh xây dựng và hướng dẫn cho CodeBuild.
Bạn có thể tham khảo tài liệu chính thức để biết hướng dẫn chi tiết về cách tạo tệp buildspec.yml
.
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
Tạo một CodePipeline
Kiểm tra đường ống
$ 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