Files
kodekloud-engineer/aws-11-20.md

7.7 KiB

Task 11

An instance named xfusion-ec2 and an elastic network interface named xfusion-eni already exists in us-east-1 region. Attach the xfusion-eni network interface to the xfusion-ec2 instance. Make sure status is attached before submitting the task.

# Instance ID from Name tag
IID=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=xfusion-ec2" "Name=instance-state-name,Values=pending,running,stopping,stopped" \
  --region us-east-1 \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

# ENI ID from Name tag
ENI_ID=$(aws ec2 describe-network-interfaces \
  --filters "Name=tag:Name,Values=xfusion-eni" \
  --region us-east-1 \
  --query 'NetworkInterfaces[0].NetworkInterfaceId' \
  --output text)

# Attach at device index 1 (0 is taken by the primary ENI)
aws ec2 attach-network-interface \
  --network-interface-id "$ENI_ID" \
  --instance-id "$IID" \
  --device-index 1 \
  --region us-east-1


# validate
aws ec2 describe-network-interfaces \
  --network-interface-ids "$ENI_ID" \
  --region us-east-1 \
  --query 'NetworkInterfaces[0].Attachment.Status'

Task 12

An instance named datacenter-ec2 and a volume named datacenter-volume already exists in us-east-1 region. Attach the datacenter-volume volume to the datacenter-ec2 instance, make sure to set the device name to /dev/sdb while attaching the volume.

# Instance ID from Name tag
IID=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=datacenter-ec2" "Name=instance-state-name,Values=pending,running,stopping,stopped" \
  --region us-east-1 \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

# Volume ID from Name tag
VOL_ID=$(aws ec2 describe-volumes \
  --filters "Name=tag:Name,Values=datacenter-volume" \
  --region us-east-1 \
  --query 'Volumes[0].VolumeId' \
  --output text)

# Attach at /dev/sdb
aws ec2 attach-volume \
  --volume-id "$VOL_ID" \
  --instance-id "$IID" \
  --device /dev/sdb \
  --region us-east-1

# waiter
aws ec2 wait volume-in-use --volume-id "$VOL_ID" --region us-east-1

# validate
aws ec2 describe-volumes \
  --volume-ids "$VOL_ID" \
  --region us-east-1 \
  --query 'Volumes[0].{State:State,Device:Attachments[0].Device,Instance:Attachments[0].InstanceId,AttachState:Attachments[0].State}'

Task 13

For this task, create an AMI from an existing EC2 instance named nautilus-ec2 with the following requirement: Name of the AMI should be nautilus-ec2-ami, make sure AMI is in available state.

# Instance ID from Name tag
IID=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=nautilus-ec2" "Name=instance-state-name,Values=pending,running,stopping,stopped" \
  --region us-east-1 \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

# Create the AMI
AMI_ID=$(aws ec2 create-image \
  --instance-id "$IID" \
  --name nautilus-ec2-ami \
  --region us-east-1 \
  --query 'ImageId' \
  --output text)

echo "AMI: $AMI_ID"

# waiter
aws ec2 wait image-available --image-ids "$AMI_ID" --region us-east-1

# verify
aws ec2 describe-images \
  --image-ids "$AMI_ID" \
  --region us-east-1 \
  --query 'Images[0].{Name:Name,State:State,Id:ImageId}'

Task 14

  1. Delete the ec2 instance named datacenter-ec2 present in us-east-1 region.
  2. Before submitting your task, make sure instance is in terminated state.
# Instance ID from Name tag
IID=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=datacenter-ec2" "Name=instance-state-name,Values=pending,running,stopping,stopped" \
  --region us-east-1 \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

# Clear termination protection if it's set (harmless if it wasn't)
aws ec2 modify-instance-attribute \
  --instance-id "$IID" \
  --no-disable-api-termination \
  --region us-east-1

# Terminate
aws ec2 terminate-instances --instance-ids "$IID" --region us-east-1

# Block until fully terminated
aws ec2 wait instance-terminated --instance-ids "$IID" --region us-east-1

# Verify
aws ec2 describe-instances \
  --instance-ids "$IID" \
  --region us-east-1 \
  --query 'Reservations[0].Instances[0].State.Name'

Task 15

Create a snapshot of an existing volume named nautilus-vol in us-east-1 region.

  1. The name of the snapshot must be nautilus-vol-ss.
  2. The description must be nautilus Snapshot.
  3. Make sure the snapshot status is completed before submitting the task.
# Volume ID from Name tag
VOL_ID=$(aws ec2 describe-volumes \
  --filters "Name=tag:Name,Values=nautilus-vol" \
  --region us-east-1 \
  --query 'Volumes[0].VolumeId' \
  --output text)

# Create snapshot: description as field, name as tag
SNAP_ID=$(aws ec2 create-snapshot \
  --volume-id "$VOL_ID" \
  --description "nautilus Snapshot" \
  --region us-east-1 \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=nautilus-vol-ss}]' \
  --query 'SnapshotId' \
  --output text)

echo "Snapshot: $SNAP_ID"

# Verify
aws ec2 describe-snapshots \
  --snapshot-ids "$SNAP_ID" \
  --region us-east-1 \
  --query 'Snapshots[0].{Id:SnapshotId,State:State,Desc:Description,Name:Tags[?Key==`Name`]|[0].Value}'

Task 16

create an IAM user named iamuser_anita.

aws iam create-user --user-name iamuser_anita

# Validate
aws iam get-user --user-name iamuser_anita \
  --query 'User.{Name:UserName,Arn:Arn,Created:CreateDate}'

Task 17

Create an IAM group named iamgroup_ravi.

aws iam create-group --group-name iamgroup_ravi

# Verify
aws iam get-group --group-name iamgroup_ravi \
  --query 'Group.{Name:GroupName,Arn:Arn,Created:CreateDate}'

Task 18

Create an IAM policy named iampolicy_anita in us-east-1 region, it must allow read-only access to the EC2 console, i.e this policy must allow users to view all instances, AMIs, and snapshots in the Amazon EC2 console.

cat > /tmp/iampolicy_anita.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    }
  ]
}
EOF

aws iam create-policy \
  --policy-name iampolicy_anita \
  --policy-document file:///tmp/iampolicy_anita.json


# Verify
aws iam list-policies \
  --scope Local \
  --query 'Policies[?PolicyName==`iampolicy_anita`].{Name:PolicyName,Arn:Arn,Attachments:AttachmentCount}' \
  --output table

Task 19

An IAM user named iamuser_kirsty and a policy named iampolicy_kirsty already exist. Attach the IAM policy iampolicy_kirsty to the IAM user iamuser_kirsty.

# Resolve the policy ARN by name
POLICY_ARN=$(aws iam list-policies \
  --scope Local \
  --query 'Policies[?PolicyName==`iampolicy_kirsty`].Arn' \
  --output text)

# Attach it to the user
aws iam attach-user-policy \
  --user-name iamuser_kirsty \
  --policy-arn "$POLICY_ARN"

# Verify
aws iam list-attached-user-policies \
  --user-name iamuser_kirsty \
  --query 'AttachedPolicies[].{Name:PolicyName,Arn:PolicyArn}' \
  --output table

Task 20

Create an IAM role as below:

  1. IAM role name must be iamrole_john.
  2. Entity type must be AWS Service and use case must be EC2.
  3. Attach a policy named iampolicy_john.
# 1. Trust policy: allow the EC2 service to assume this role
cat > /tmp/trust-ec2.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "ec2.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# 2. Create the role with that trust policy
aws iam create-role \
  --role-name iamrole_john \
  --assume-role-policy-document file:///tmp/trust-ec2.json

# 3. Resolve the policy ARN, then attach
POLICY_ARN=$(aws iam list-policies \
  --scope Local \
  --query 'Policies[?PolicyName==`iampolicy_john`].Arn' \
  --output text)

aws iam attach-role-policy \
  --role-name iamrole_john \
  --policy-arn "$POLICY_ARN"