- vừa được xem lúc

Tạo Amazon S3 bucket sử dụng AWS CDK

0 0 20

Người đăng: VNTechies

Theo Viblo Asia

s3-cdk

Hướng dẫn này sẽ giải thích những gì cần thiết để tạo một Amazon S3 bucket sử dụng AWS CDK Python. Mã nguồn được cung cấp tại đây đi kèm với tất cả các bước cần thiết để chạy và triển khai mã AWS CDK trên AWS Cloud.

Đầu tiên, bạn cần [cài đặt AWS CDK] và IAM profile cho để có thể triển khai hệ thống bằng AWS CLI. Sau khi học cách tổng hợp code từ AWS CDK để tạo ra Amazon S3 bucket construct, bạn có thể triển khai trên AWS Cloud và dọn dẹp tài nguyên sử dụng câu lệnh AWS CDK destroy.

Dưới đây là các bước cụ thể để cài đặt, triển khai một Amazon S3 bucket sử dụng AWS CDK:

Trước khi xây dựng Amazon S3 bucket construct, bạn cần hoàn thành các bước sau để có thể chạy AWS CDK với Python

  1. Cài đặt AWS CDK và Python
  2. Cài đặt AWS CLI và AWS profile
  3. Tạo một project AWS CDK với Python

Nếu bạn đã hoàn thành các bước này, bạn có thể bắt đầu làm từ bước số 4

1. Cài đặt AWS CDK

Cài đặt AWS CDK bằng npm package manager bằng câu lệnh dưới đây

npm install -g aws-cdk typescript
cdk version

Bạn cũng có thể tham khảo bài viết hướng dẫn chi tiết cài đặt AWS CDK

2. Cài đặt AWS CLI và cài đặt AWS profile

AWS CLI là một công cụ dòng lệnh (command line tool) cho phép bạn tương tác với các dịch vụ của AWS thông qua terminal của bạn. Tuỳ thuộc vào hệ điều hành mà bạn đang sử dụng, cách cài đặt có thể sẽ khác

# macOS
brew install awscli # Windows
wget https://awscli.amazonaws.com/AWSCLIV2.msi
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi # Linux (Ubuntu)
sudo apt install awscli

Để có thể truy cập vào AWS account của bạn từ AWS CLI, bạn cần thiết lập AWS Profile. Có 2 cách để bạn có thể làm điều đó:

  1. Access và secret key từ IAM User
  2. AWS Single Sign-on (SSO) user

Trong bài viết này, để có thể nhanh chóng thiết lập AWS Profile, chúng ta sẽ chọn cách số 1.

Đi tới IAM Users

  • Chọn IAM user, click Security credentials và tạo một credential mới

Chọn IAM user, click Security credentials và tạo một credential mới

  • Lưu lại access key và secret key (vì đây là lần duy nhất cũng là lần cuối bạn thấy nó)
  • Cài đặt AWS profile cho AWS CLI
aws configure
AWS Access Key ID [None]: <insert_access_key>
AWS Secret Access Key [None]: <insert_secret_key>
Default region name [None]: <insert_aws_region>
Default output format [json]: json
  • Thông tin vể credential của bạn sẽ được lưu tại ~/.aws/credentials dưới profile tên [default], bạn có thể xác nhận bằng câu lệnh sau
aws sts get-caller-identity
{ "UserId": "xxx", "Account": "012345678901", "Arn": "arn:aws:iam::012345678901:user/vntechies"
}

3. Tạo một AWS CDK Python project

Sau khi cài đặt profile và các packages, bạn bắt đầu tạo project AWS CDK python để xây dựng Amazon S3 bucket construct.

  • Bạn có thể tạo một project AWS CDK python bằng cách chạy câu lệnh sau tại một directory trống
cdk init --language python
  • Chạy câu lệnh sau để tạo môi trường ảo và cài đặt các package cần thiết cho python
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

4. Tạo một Amazon S3 Bucket construct với AWS CDK

Sau khi init project, các các file sẽ được tạo ra dưới dạng sau

./
├── README.md
├── app.py
├── aws_cdk_python_s3
│ ├── __init__.py
│ └── aws_cdk_python_s3_stack.py
├── cdk.json
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests ├── __init__.py └── unit ├── __init__.py └── test_aws_cdk_python_s3_stack.py
from constructs import Construct
from aws_cdk import ( Stack, aws_iam as iam, aws_s3 as s3, aws_kms as kms,
) class AwsCdkPythonS3Stack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) bucket = s3.Bucket(self, "VNTechies-AWS-CDK-S3-demo-bucket", object_ownership=s3.ObjectOwnership.BUCKET_OWNER_ENFORCED, block_public_access=s3.BlockPublicAccess.BLOCK_ALL, encryption_key=kms.Key(self, 'VNTechies-AWS-CDK-S3-demo-bucket-key'),) bucket.grant_read(iam.AccountRootPrincipal())
  • kms_key là AWS Key Management Service được tạo mới để mã hoá dữ liệu trên s3
  • object_ownership giúp bạn vô hiệu các access control list (ACLs) và người sở hữu bucket sẽ có tất cả các quyền với mọi object trong bucket này. ACLs sẽ không ảnh hưởng tới việc quản lý quyền nữa mà bucket sẽ sử dụng các policies để quản lý quyền truy cập. Điều này giúp đơn giản hoá cách bản quản lý và truy cập vào các objects được lưu trữ trong bucket của bạn.
  • block_public_access các object mới sẽ mặc định ở chế độ private và sẽ không cho phép truy cập công khai (public access)
  • encryption_key cho phép sử dụng một Customer managed keys để mã hoá các objects được lưu trên s3 bucket.
  • bucket.grant_read() cho phép người dùng có quền root của AWS account truy cập vào bucket được tạo

5. Tổng hợp lại Amazon S3 Bucket với AWS CDK

Amazon S3 bucket construct đã được tạo trong stack của AWS CDK app, bước tiếp theo sẽ là tổng hợp lại thành một CloudFormation template bằng cách chạy câu lệnh cho AWS CDK Synthesize

cdk synth
Resources: VNTechiesAWSCDKS3demobucketkey2DF32451: Type: AWS::KMS::Key Properties: KeyPolicy: Statement: - Action: kms:* Effect: Allow Principal: AWS: Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":iam::" - Ref: AWS::AccountId - :root Resource: "*" - Action: - kms:Decrypt - kms:DescribeKey Effect: Allow Principal: AWS: Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":iam::" - Ref: AWS::AccountId - :root Resource: "*" Version: "2012-10-17" UpdateReplacePolicy: Retain DeletionPolicy: Retain Metadata: aws:cdk:path: aws-cdk-python-s3/VNTechies-AWS-CDK-S3-demo-bucket-key/Resource VNTechiesAWSCDKS3demobucketB20DE88B: Type: AWS::S3::Bucket Properties: BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: KMSMasterKeyID: Fn::GetAtt: - VNTechiesAWSCDKS3demobucketkey2DF32451 - Arn SSEAlgorithm: aws:kms OwnershipControls: Rules: - ObjectOwnership: BucketOwnerEnforced PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true UpdateReplacePolicy: Retain DeletionPolicy: Retain Metadata: aws:cdk:path: aws-cdk-python-s3/VNTechies-AWS-CDK-S3-demo-bucket/Resource VNTechiesAWSCDKS3demobucketPolicy2584B1E9: Type: AWS::S3::BucketPolicy Properties: Bucket: Ref: VNTechiesAWSCDKS3demobucketB20DE88B PolicyDocument: Statement: - Action: - s3:GetBucket* - s3:GetObject* - s3:List* Effect: Allow Principal: AWS: Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":iam::" - Ref: AWS::AccountId - :root Resource: - Fn::GetAtt: - VNTechiesAWSCDKS3demobucketB20DE88B - Arn - Fn::Join: - "" - - Fn::GetAtt: - VNTechiesAWSCDKS3demobucketB20DE88B - Arn - /* Version: "2012-10-17" Metadata: aws:cdk:path: aws-cdk-python-s3/VNTechies-AWS-CDK-S3-demo-bucket/Policy/Resource CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/0XIQQrCMBCF4bN0n4zWgLi2SzelPYDUacQxbQKdBAkhd7chgqv/ve8E6gJtM31Y4mzkQg9Io5/QiJ3uyawM6aaj6J52TxasIF0DGu0L/VZN7xbC+Of6cy4yaHZhQ1125+xMnpzNoo/+5exBQXuEc/NmIrkF62nVMNR+AXbnt16gAAAA Metadata: aws:cdk:path: aws-cdk-python-s3/CDKMetadata/Default Condition: CDKMetadataAvailable
Conditions: CDKMetadataAvailable: Fn::Or: - Fn::Or: - Fn::Equals: - Ref: AWS::Region - af-south-1 - Fn::Equals: - Ref: AWS::Region - ap-east-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-2 - Fn::Equals: - Ref: AWS::Region - ap-south-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-2 - Fn::Equals: - Ref: AWS::Region - ca-central-1 - Fn::Equals: - Ref: AWS::Region - cn-north-1 - Fn::Equals: - Ref: AWS::Region - cn-northwest-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - eu-central-1 - Fn::Equals: - Ref: AWS::Region - eu-north-1 - Fn::Equals: - Ref: AWS::Region - eu-south-1 - Fn::Equals: - Ref: AWS::Region - eu-west-1 - Fn::Equals: - Ref: AWS::Region - eu-west-2 - Fn::Equals: - Ref: AWS::Region - eu-west-3 - Fn::Equals: - Ref: AWS::Region - me-south-1 - Fn::Equals: - Ref: AWS::Region - sa-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-2 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - us-west-1 - Fn::Equals: - Ref: AWS::Region - us-west-2
Parameters: BootstrapVersion: Type: AWS::SSM::Parameter::Value<String> Default: /cdk-bootstrap/hnb659fds/version Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]
Rules: CheckBootstrapVersion: Assertions: - Assert: Fn::Not: - Fn::Contains: - - "1" - "2" - "3" - "4" - "5" - Ref: BootstrapVersion AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.

Sau khi chạy câu lệnh trên thì một CloudFormation dưới dạng YAML sẽ được in ra stdout. Ngoài ra, directory cdk.out cũng được tạo ra với các file templates dưới format JSON để có thể triển khai trên AWS Cloud thông qua CloudFormation.

├── README.md
├── app.py
├── aws_cdk_python_s3
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-310.pyc
│ │ └── aws_cdk_python_s3_stack.cpython-310.pyc
│ └── aws_cdk_python_s3_stack.py
├── cdk.json
├── cdk.out
│ ├── aws-cdk-python-s3.assets.json
│ ├── aws-cdk-python-s3.template.json
│ ├── cdk.out
│ ├── manifest.json
│ └── tree.json
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests ├── __init__.py └── unit ├── __init__.py └── test_aws_cdk_python_s3_stack.py

6. Deploy Amazon S3 Bucket lên AWS Cloud sử dụng AWS CDK

Nếu đây là lần đầu tiên bạn chạy câu lệnh deploy, bạn cần phải bootstrap ứng dụng AWS CDK trước khi có thể deploy lên AWS[^1], việc này giúp tạo các tài nguyên cần thiết để CDK toolkit có thể deploy ứng dụng của bạn, chúng bao gồm: S3 bucket, IAM roles, SSM Parameter,...

cdk bootstrap

Để triển khai S3 bucket trên AWS, chúng ta chạy câu lệnh sau

cdk deploy

Bạn có thể kiểm tra KMS key và S3 vừa được tạo trên AWS console

Bạn có thể kiểm tra KMS key và S3 vừa được tạo trên AWS console

7. Dọn dẹp tài nguyên

Để dọn dẹp tài nguyên đã được tạo, sử dụng destroy command

cdk destroy # output
Are you sure you want to delete: aws-cdk-python-s3 (y/n)? y
aws-cdk-python-s3: destroying... ✅ aws-cdk-python-s3: destroyed

Tổng kết

Chúng ta đã tạo thành công một Amazon S3 Bucket sử dụng AWS CDK cùng Python với một số thuộc tính giúp tăng tính bảo mật bucket đó. Các bạn có thể tham khảo những bài viết, hướng dẫn về AWS CDK tại series này

Bài viết gốc trên VNTechies Dev Blog

https://dev.vntechies.com/blog/aws/cdk/tao-s3-bucket-voi-aws-cdk

References

Bình luận

Bài viết tương tự

- vừa được xem lúc

PDF Export, cẩn thận với những input có thể truyền vào

Giới thiệu. Dạo gần đây mình tình cờ gặp rất nhiều lỗi XSS, tuy nhiên trang đó lại có sử dụng dữ liệu người dùng input vào để export ra PDF.

0 0 49

- vừa được xem lúc

Giới thiệu về AWS Batch

Khi sử dụng hệ thống cloud service, điều chúng ta thường phải quan tâm đến không chỉ là hiệu suất hoạt động (performance) mà còn phải chú ý đến cả chi phí bỏ ra để duy trì hoạt động của hệ thống. Chắn hẳn là hệ thống lớn hay nhỏ nào cũng đã từng phải dùng đến những instance chuyên để chạy batch thực

0 0 128

- vừa được xem lúc

Tìm hiểu về AWS KMS

1. AWS KMS là gì. Ở KMS bạn có thể lựa chọn tạo symetric key (khóa đối xứng) hoặc asymetric key (khóa bất đối xứng) để làm CMK (Customer Master Key). Sau khi tạo key thì có thể thiết đặt key policy để control quyền access và sử dụng key.

0 0 53

- vừa được xem lúc

AWS VPC cho người mới bắt đầu

Tuần này, tôi trình bày lại những gì tôi đã học được về Virtual Private Cloud (VPC) của Amazon. Nếu bạn muốn xem những gì tôi đã học được về AWS, hãy xem Tổng quan về DynamoDB và Tổng quan về S3. VPC là gì. Những điều cần lưu ý:.

0 0 69

- vừa được xem lúc

AWS Essentials (Phần 6): Guildline SNS Basic trên AWS

Tiếp tục với chuỗi bài viết về Basic AWS Setting, chúng ta tiếp tục tìm hiểu tiếp tới SNS (Simple Notification Service). Đây là một service của AWS cho phép người dùng setting thực hiện gửi email, text message hay push notification tự động tới mobile device dựa trên event người dùng setting phía AWS

0 0 125

- vừa được xem lúc

Sử dụng Amazon CloudFront Content Delivery Network với Private S3 Bucket — Signing URLs

Trong nhiều trường hợp, thì việc sử dụng CDN là bắt buộc. Mình đã trải nghiệm với một số CDN nhưng cuối cùng mình lựa chọn sử dụng AWS CloudFront.

0 0 105