[AWS Certificate] Cùng nhau practice 01 – Share AMI cross account để sử dụng cho ASG

Đây là series mới mình quyết định thực hiện trong quá trình ôn tập và luyện đề để thi chứng chỉ AWS.

Khoe nhẹ mình đã pass 2 exam AWS SAA-C03 và SAP-C02, chắc sẽ viết một bài chia sẽ kinh nghiệm sau vì thật sự là lười chả biết viết gì nữa =)))

Trong quá trình luyện đề mình thấy sẽ rất hữu ích khi vừa luyện đè vừa practice (lab) lại vì vừa hiểu sâu vừa nhớ dai hơn, hôm nay mình sẽ cùng lab thử câu hỏi sau nha.

Câu hỏi được lấy trên examtopic, bộ đề DOP-C02: https://www.examtopics.com/discussions/amazon/view/105265-exam-aws-certified-devops-engineer-professional-dop-c02/

A company must encrypt all AMIs that the company shares across accounts. A DevOps engineer has access to a source account where an unencrypted custom AMI has been built. The DevOps engineer also has access to a target account where an Amazon EC2 Auto Scaling group will launch EC2 instances from the AMI. The DevOps engineer must share the AMI with the target account.
The company has created an AWS Key Management Service (AWS KMS) key in the source account.
Which additional steps should the DevOps engineer perform to meet the requirements? (Choose three.)

A. In the source account, copy the unencrypted AMI to an encrypted AMI. Specify the KMS key in the copy action.
B. In the source account, copy the unencrypted AMI to an encrypted AMI. Specify the default Amazon Elastic Block Store (Amazon EBS) encryption key in the copy action.
C. In the source account, create a KMS grant that delegates permissions to the Auto Scaling group service-linked role in the target account.
D. In the source account, modify the key policy to give the target account permissions to create a grant. In the target account, create a KMS grant that delegates permissions to the Auto Scaling group service-linked role.
E. In the source account, share the unencrypted AMI with the target account.
F. In the source account, share the encrypted AMI with the target account.

Okay, đáp án ở đây là ADF:

Câu hỏi đại loại là muốn share AMI đã được encrypt từ account A đến account B để trên account B dùng AMI này cho Auto Scaling Group thì step thực hiện như thế nào?

Bây giờ mình thử lab xem thế nào nhé, bài lab mình thử thực hiện việc share AMI encypt ở account A -> account B xem như thế nào.

Ở account A:

Mình đã tạo sẵn một AMI ID ami-09f1de097128509b4 như hình bên dưới, EBS volume đã được encrypt, nhưng ở đây mình dùng KMS key managed bởi chính AWS chứ không phải customer master key (CMK)

Bây giờ mình thử share từ account A sang account B nha:

Như bạn thấy chúng ta không thể share được, EBS encrypt bằng CKM mới có thể share AMI qua account khác.

Step 1: Tạo CMK

Từ AWS dashboard chúng ta vào KMS tạo một symetric key

Đặt alias name và description

Set admin và user permission như policy mình kèm bên dưới nha, đảm bảo sửa lại cho đúng accountID

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::314605996074:root",
                    "arn:aws:iam::122067411352:root"
                ]
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey",
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*"
        }
    ]
}

 

Step 2: Tạo lại AMI với CMK trên

Quay lại EC2 >> AMI vào copy AMI cũ ra một AMI mới

Chỉ đinh key mình vừa tạo khi nãy:

Tạo xong rồi đây:

Step 3: Share AMI với account B và test thử ASG trước khi grant quyền

Tại account A, chúng ta share AMI như hình mình bên dưới

Chúng ta sang account B sẽ thấy AMI được share thành công như hình

Trước khi grant quyền cho account B có thể decrypt AMI thì mình có tạo thử Auto Scaling Group sử dụng AMI này trên account B để test thử thì đúng là không thành công.

Vậy bây giờ mình grant thử nhé, chúng ta sẽ dùng awscli.

aws kms create-grant \                                                                                                             
  --region eu-west-1 \
  --key-id arn:aws:kms:eu-west-1:<AccountID_A>:key/663471b2-5415-438b-be83-238a8de7579c \
  --grantee-principal arn:aws:iam::<AccountID_B>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling \
  --operations "Encrypt" "Decrypt" "ReEncryptFrom" "ReEncryptTo" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "DescribeKey" "CreateGrant" \
  --profile accountB

ARN chúng ta lấy sau khi đã tạo KMS thành công.

Chúng ta có thể kiểm tra lại list grant bằng command sau:

aws kms list-grants --key-id arn:aws:kms:eu-west-1:<AccountID_A>:key/663471b2-5415-438b-be83-238a8de7579c --profile accountB

và revoke nó nếu không dùng nữa:

aws kms revoke-grant --key-id arn:aws:kms:eu-west-1:<AccountID_A>:key/663471b2-5415-438b-be83-238a8de7579c --grant-id c1f9413a91dd3d3e5dcb5b1a686b2536a75a623ddb6c5823ead236064c9d9bb9 --profile accountB

Role role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling bạn phải check và đảo bảo nó đã tồn tại rồi nhé, đây cũng chúng là service-linked role khi bạn tạo ASG.

Và đây là kết quả của ASG khi bạn grant quyền cho KMS thành công, ASG cũng đã tạo được instance successful.

Phần lab xong rồi, như vậy câu hỏi cũng dễ hiểu hơn rồi nhỉ, nhớ delete resource để tránh bị charge tiền nhé.