diff --git a/content/hands-on-labs/backups/on-demand-backup.en.md b/content/hands-on-labs/backups/on-demand-backup.en.md index e0cc999c..354858ac 100644 --- a/content/hands-on-labs/backups/on-demand-backup.en.md +++ b/content/hands-on-labs/backups/on-demand-backup.en.md @@ -16,11 +16,12 @@ table performance or availability. 1. First, go to the [DynamoDB Console](https://console.aws.amazon.com/dynamodbv2/) and click on *Tables* from the side menu.Choose ProductCatalog table. On the **Backups** tab of the ProductCatalog table, choose **Create backup**. -![OD Backup 1](/static/images/hands-on-labs/backup/od_backup_1.png) +:image[OD Backup 1]{src="/static/images/hands-on-labs/backup/od_backup_1.png" disableZoom=true width=950} 2. Make sure that ProductCatalog is the source table name. Choose **Customize settings** and then select **Backup with DynamoDB**. Enter the name `ProductCatalogBackup`. Click **Create backup** to create the backup. -![OD Backup 2](/static/images/hands-on-labs/backup/od_backup_2.png) +:image[OD Backup 2]{src="/static/images/hands-on-labs/backup/od_backup_2.png" disableZoom=true width=850} + While the backup is being created, the backup status is set to **Creating**. After the backup is complete, the backup status changes to @@ -28,11 +29,11 @@ While the backup is being created, the backup status is set to ### Restore Backup -1. Go to the [DynamoDB Console](https://console.aws.amazon.com/dynamodbv2/) and click on *Tables* from the side menu.Choose ProductCatalog table. - Choose **Backups** tab. In the list of backups, choose ProductCatalogBackup. +1. Click on *Tables* from the side menu. Choose the ProductCatalog table. + Choose the **Backups** tab. In the list of backups, choose ProductCatalogBackup. Choose **Restore**. -![OD Backup 3](/static/images/hands-on-labs/backup/od_backup_3.png) +:image[OD Backup 3]{src="/static/images/hands-on-labs/backup/od_backup_3.png" disableZoom=true width=850} 2. Enter `ProductCatalogODRestore` as the new table name. Confirm the backup name and other backup details. Choose **Restore** @@ -41,7 +42,7 @@ While the backup is being created, the backup status is set to finished, the status of the `ProductCatalogODRestore` table changes to **Active**. -![OD Backup 4](/static/images/hands-on-labs/backup/od_backup_4.png) +:image[OD Backup 4]{src="/static/images/hands-on-labs/backup/od_backup_4.png" disableZoom=true width=850} ### To delete a backup @@ -52,10 +53,11 @@ ProductCatalogBackup. You can only delete the backup after the table `ProductCat 1. Choose ProductCatalog table. 1. Choose **Backups** tab. 1. In the list of backups, choose ProductCatalogBackup. -1. Click **Delete**: +1. Click **Delete**. -![OD Backup 5](/static/images/hands-on-labs/backup/od_backup_5.png) +:image[OD Backup 5]{src="/static/images/hands-on-labs/backup/od_backup_5.png" disableZoom=true width=850} Finally, type the world `Delete` and click **Delete** to delete the backup. -![OD Backup 6](/static/images/hands-on-labs/backup/od_backup_6.png) +:image[OD Backup 6]{src="/static/images/hands-on-labs/backup/od_backup_6.png" disableZoom=true width=550} + diff --git a/content/hands-on-labs/backups/pitr-backup.en.md b/content/hands-on-labs/backups/pitr-backup.en.md index d8cb2a31..abbabb2b 100644 --- a/content/hands-on-labs/backups/pitr-backup.en.md +++ b/content/hands-on-labs/backups/pitr-backup.en.md @@ -18,39 +18,38 @@ default, PITR is disabled. ### How to enable PITR 1. First, go to the [DynamoDB Console](https://console.aws.amazon.com/dynamodbv2/) and click on *Tables* from the side menu. -In the list of tables, choose the ProductCatalog table.On the **Backups** tab of the ProductCatalog table in the **Point-in-time recovery** section, choose **Edit**. +In the list of tables, choose the ProductCatalog table. On the **Backups** tab of the ProductCatalog table in the **Point-in-time recovery** section, choose **Edit**. -![PITR Backup 1](/static/images/hands-on-labs/backup/pitr_backup_1.png) +:image[PITR Backup 1]{src="/static/images/hands-on-labs/backup/pitr_backup_1.png" disableZoom=true width=850} 2. Select **Enable Point-in-time-recovery** and choose **Save changes**. -![PITR Backup 2](/static/images/hands-on-labs/backup/pitr_backup_2.png) +:image[PITR Backup 2]{src="/static/images/hands-on-labs/backup/pitr_backup_2.png" disableZoom=true width=850} ### To restore a table to a point in time Now let us say we get some unwanted records in ProductCatalog table as highlighted below. -![PITR Unwanted Records](/static/images/hands-on-labs/backup/pitr_unwanted_records.png) +:image[PITR Unwanted Records]{src="/static/images/hands-on-labs/backup/pitr_unwanted_records.png" disableZoom=true width=1150} -Follow the below steps to restore ProductCatalog using Point-in-time-recovery. +Follow the steps below to restore the ProductCatalog table using Point-in-time-recovery. -1. Sign in to the AWS Management Console and open the DynamoDB console. - In the navigation pane on the left side of the console, choose +1. In the navigation pane on the left side of the console, choose **Tables**. In the list of tables, choose the ProductCatalog table. On the **Backups** tab of the ProductCatalog table, in the **Point-in-time recovery** section, choose **Restore to point-in-time**. -![PITR Restore 1](/static/images/hands-on-labs/backup/pitr_restore_1.png) +:image[PITR Restore 1]{src="/static/images/hands-on-labs/backup/pitr_restore_1.png" disableZoom=true width=950} 2. For the new table name, enter ProductCatalogPITR. To confirm -the restorable time, set the **Restore date and time** to the **Latest +the restore time, set the **Restore date and time** to the **Latest restore date**. Choose **Restore** to start the restore process. -![PITR Restore 2](/static/images/hands-on-labs/backup/pitr_restore_2.png) +:image[PITR Restore 2]{src="/static/images/hands-on-labs/backup/pitr_restore_2.png" disableZoom=true width=950} *Note : You can restore the table to the same AWS Region or to a -different Region from where the backup resides. You can also exclude +different region from where the backup resides. You can also exclude secondary indexes from being created on the new restored table. In addition, you can specify a different encryption mode.* @@ -58,4 +57,4 @@ The table that is being restored is shown with the status **Restoring**. After the restore process is finished, the status of the *ProductCatalogPITR* table changes to **Active**. -![PITR Restore 3](/static/images/hands-on-labs/backup/pitr_restore_3.png) +:image[PITR Restore 3]{src="/static/images/hands-on-labs/backup/pitr_restore_3.png" disableZoom=true width=950} diff --git a/content/hands-on-labs/backups/restrict-backup-deletion.en.md b/content/hands-on-labs/backups/restrict-backup-deletion.en.md index fefcb20a..f89295bf 100644 --- a/content/hands-on-labs/backups/restrict-backup-deletion.en.md +++ b/content/hands-on-labs/backups/restrict-backup-deletion.en.md @@ -5,13 +5,9 @@ date: 2020-04-21T07:38:58-05:00 weight: 65 --- -Customer has a common ask when they want their developer/admin should be -allowed to create and delete DynamoDB tables but they shouldn’t be -allowed to delete the backups. +Customers often request that their developers or administrators be allowed to create and delete DynamoDB tables, but not be permitted to delete the backups. -You can achieve this by creating IAM policy. Following is an example of -the AWS IAM policy which allow “Create Table”, “List Table”, “Create -Backup” and “Delete Table” and denies “Delete Backup” of DynamoDB table. +This can be achieved by creating an IAM policy. The following is an example of an AWS IAM policy that allows “Create Table,” “List Tables,” “Create Backup,” and “Delete Table”, while denying the “Delete Backup” action on DynamoDB tables. ```json @@ -49,8 +45,7 @@ Backup” and “Delete Table” and denies “Delete Backup” of DynamoDB tabl -You can restrict in AWS backup by denying as well by denying -“DeleteBackupSelection” in IAM policy. +You can also restrict backup deletion in AWS Backup by adding an explicit Deny statement for the “DeleteBackupSelection” Action in an IAM policy. ```json @@ -61,7 +56,6 @@ You can restrict in AWS backup by denying as well by denying "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ - "backup:DeleteBackupSelection", "backup:CreateBackupSelection", "backup:StartBackupJob", "backup:CreateBackupPlan", @@ -86,14 +80,11 @@ You can restrict in AWS backup by denying as well by denying ``` -You can apply the policy to role and assign the role to IAM group. Now -users belonging to this IAM group will inherit the permission. +You can apply the policy to a role and assign the role to an IAM group, so users belonging to the IAM group inherit the permission. -Let’s say now the user tries to delete the backup in AWS backup. - -![Restrict Backup Deletion 1](/static/images/hands-on-labs/backup/restrict_delete_1.png) - -User gets the access denied error due to insufficient permission to +If a user now tries to delete the backup in AWS backup, they will received an access denied error due to insufficient permissions to delete the backup. -![Restrict Backup Deletion 2](/static/images/hands-on-labs/backup/restrict_delete_2.png) +:image[Restrict Backup Deletion 1]{src="/static/images/hands-on-labs/backup/restrict_delete_1.png" disableZoom=true width=1150} + +:image[Restrict Backup Deletion 2]{src="/static/images/hands-on-labs/backup/restrict_delete_2.png" disableZoom=true width=1050} diff --git a/content/hands-on-labs/backups/schedule-backup.en.md b/content/hands-on-labs/backups/schedule-backup.en.md index a2fb50a0..b696ef09 100644 --- a/content/hands-on-labs/backups/schedule-backup.en.md +++ b/content/hands-on-labs/backups/schedule-backup.en.md @@ -12,103 +12,97 @@ starting a backup job. 1. In the AWS Management Console, navigate to **Services -> AWS Backup.** Click on **Create Backup vault** under **Backup vaults**. -![Scheduled Backup 1](/static/images/hands-on-labs/backup/sched_backup_1.png) +:image[Scheduled Backup 1]{src="/static/images/hands-on-labs/backup/sched_backup_1.png" disableZoom=true width=950} + 2. Provide Backup vault name of your choice. AWS KMS encryption master key. By default, AWS Backup creates a master key with the alias aws/backup for you. You can choose that key or choose any other key - in your account. Click on **Create Backup vault** + in your account. Click on **Create Backup vault**. -![Scheduled Backup 2](/static/images/hands-on-labs/backup/sched_backup_2.png) +:image[Scheduled Backup 2]{src="/static/images/hands-on-labs/backup/sched_backup_2.png" disableZoom=true width=650} -You can see Backup vault is created successfully +After a few moments, you will see the Backup vault has been created successfully. -![Scheduled Backup 3](/static/images/hands-on-labs/backup/sched_backup_3.png) +:image[Scheduled Backup 3]{src="/static/images/hands-on-labs/backup/sched_backup_3.png" disableZoom=true width=650} Now, we need to create backup plan. 3. Click on **Create Backup plan** under **Backup plans**. -![Scheduled Backup 4](/static/images/hands-on-labs/backup/sched_backup_4.png) +:image[Scheduled Backup 4]{src="/static/images/hands-on-labs/backup/sched_backup_4.png" disableZoom=true width=950} 4. Select **Build a new plan**. Provide **backup plan name** and **rule name**. -![Scheduled Backup 5](/static/images/hands-on-labs/backup/sched_backup_5.png) +:image[Scheduled Backup 5]{src="/static/images/hands-on-labs/backup/sched_backup_5.png" disableZoom=true width=650} -5. Select **backup frequency.** The backup frequency determines how +5. Select the **backup vault** we created earlier. Next, select **backup frequency.** The backup frequency determines how often a backup is created. Using the console, you can choose a **frequency** of every 12 hours, daily, weekly, or monthly. Choose a - **backup window**. Backup window consists of the time that the - backup window begins and the duration of the window in hours. Backup - jobs are started within this window. I am configuring backup at 6 PM - UTC start within 1 hour and completes within 4 hours. - - Further, select **lifecycle**. The lifecycle defines when a backup is - transitioned to cold storage and when it expires. I am configuring - backup to move cold storage after 31 days and expire after 366 days. + **backup window**. The backup window consists of the time when the + backup begins and the duration of the window in hours. Backup + jobs are started within this window. Here, we are configuring the backup to start within 1 hour of 18:00 UTC and to complete within 4 hours. -![Scheduled Backup 6](/static/images/hands-on-labs/backup/sched_backup_6.png) +:image[Scheduled Backup 6]{src="/static/images/hands-on-labs/backup/sched_backup_6.png" disableZoom=true width=650} +6. Select **Lifecycle**. The lifecycle defines when a backup is transitioned to cold storage and when it expires. Here, we are configuring the backup to move cold storage after 31 days and to expire after 365 days. -6. Select **backup vault** we created earlier. Click on **Create - plan**. +:image[Scheduled Backup 7]{src="/static/images/hands-on-labs/backup/sched_backup_7.png" disableZoom=true width=650} -![Scheduled Backup 7](/static/images/hands-on-labs/backup/sched_backup_7.png) +7. At the bottom of the page, click on **Create plan**. *Note: Backups that are transitioned to cold storage must be stored in cold storage for a minimum of 90 days* -Now assign the resource to backup plan. When you assign a resource to a +Next, assign the resource to backup plan. When you assign a resource to a backup plan, that resource is backed up automatically according to the backup plan. -7. Give Resource a assignment name. Choose the default role. Select **Include specific resource types** under "1. Define resource selection" +8. Give Resource a assignment name. Choose the default role. Under "**1. Define resource selection**", select **Include specific resource types**. -![Scheduled Backup 8](/static/images/hands-on-labs/backup/sched_backup_8.png) +:image[Scheduled Backup 8]{src="/static/images/hands-on-labs/backup/sched_backup_8.png" disableZoom=true width=650} -8. Under "2. Select specific resource types" select the resource type **DynamoDB** in the drop down. Click choose resources, uncheck All, and select the **ProductCatalog** table. Click **Assign resources** +9. Under "**2. Select specific resource types**", select the resource type **DynamoDB** in the dropdown. Click choose resources, uncheck **All Tables**, and select the **ProductCatalog** table. Click **Assign resources**. -![Scheduled Backup 9](/static/images/hands-on-labs/backup/sched_backup_9.png) +:image[Scheduled Backup 9]{src="/static/images/hands-on-labs/backup/sched_backup_9.png" disableZoom=true width=650} -9. You can see the status of your backup job under jobs section after - your scheduled backup window timeframe. You can see your DynamoDB - backup is completed. +10. You will only be able to see the status of your backup job under the jobs section after your scheduled backup window timeframe has passed. You will be able to see that your DynamoDB backup completed successfully. -![Scheduled Backup 10](/static/images/hands-on-labs/backup/sched_backup_10.png) -### Restore a Backup: +### Restore a Backup After a resource has been backed up at least once, it is considered -protected and is available to be restored using AWS Backup. In your account a backup may not yet be available. If this is the case, review the screenshots in lieu of doing this in your own account. +protected and is available to be restored using AWS Backup. A backup may not yet be available in your account. If this is the case, simply review the process below. 1. On the **Protected resources** page, you can explore details of the resources that are backed up in AWS Backup. Choose our DynamoDB table resource. -![Scheduled Backup 11](/static/images/hands-on-labs/backup/sched_backup_11.png) +:image[Scheduled Backup 11]{src="/static/images/hands-on-labs/backup/sched_backup_11.png" disableZoom=true width=650} 2. Choose the recovery point ID of the resource. Click on **Restore**. _Note: If you do not see a recovery point, you can click "Create an on-demand backup" and complete the backup. For the purposes of this lab, you need a completed backup to continue, and you may not want to wait for your backup plan's scheduled backup._ -![Scheduled Backup 12](/static/images/hands-on-labs/backup/sched_backup_12.png) +:image[Scheduled Backup 12]{src="/static/images/hands-on-labs/backup/sched_backup_12.png" disableZoom=true width=650} 3. Provide new DynamoDB table name. Leave all the settings on the defaults and click **Restore backup** -![Scheduled Backup 13](/static/images/hands-on-labs/backup/sched_backup_13.png) +:image[Scheduled Backup 13]{src="/static/images/hands-on-labs/backup/sched_backup_13.png" disableZoom=true width=650} The **Restore jobs** pane appears. A message at the top of the page provides information about the restore job. You can see job status is running.After some time you can see status changes to completed -![Scheduled Backup 14](/static/images/hands-on-labs/backup/sched_backup_14.png) + +:image[Scheduled Backup 14]{src="/static/images/hands-on-labs/backup/sched_backup_14.png" disableZoom=true width=650} You can also monitor the all backup and restore jobs in central dashboard. -![Scheduled Backup 15](/static/images/hands-on-labs/backup/sched_backup_15.png) +:image[Scheduled Backup 15]{src="/static/images/hands-on-labs/backup/sched_backup_15.png" disableZoom=true width=650} To see the restored table, go to the [DynamoDB Console](https://console.aws.amazon.com/dynamodbv2/) and click on *Tables* from the side menu.Choose *ProductCatalogRestored* table. You can see the table is restored along with data. -![Scheduled Backup 16](/static/images/hands-on-labs/backup/sched_backup_16.png) +:image[Scheduled Backup 16]{src="/static/images/hands-on-labs/backup/sched_backup_16.png" disableZoom=true width=650} \ No newline at end of file diff --git a/content/hands-on-labs/explore-console/console-gsi.en.md b/content/hands-on-labs/explore-console/console-gsi.en.md index a7995342..e2fbb2dc 100644 --- a/content/hands-on-labs/explore-console/console-gsi.en.md +++ b/content/hands-on-labs/explore-console/console-gsi.en.md @@ -14,7 +14,7 @@ Armed with this knowledge of GSIs, we can now create a GSI on the **Reply** tabl Navigate to the **Reply** table, switch to the **Indexes** tab and click `Create Index`. -![Console Create GSI 1](/static/images/hands-on-labs/explore-console/console_create_gsi_1.png) +:image[Console Create GSI 1]{src="/static/images/hands-on-labs/explore-console/console_create_gsi_1.png" disableZoom=true width=850} Enter `PostedBy` as the Partition key, `ReplyDateTime` as the Sort key, and `PostedBy-ReplyDateTime-gsi` as the Index name. Leave the other settings as defaults and click `Create Index`. Once the index leaves the `Creating` state you can continue on to the exercise below. @@ -34,11 +34,11 @@ The solution is expandable below but try to figure it out yourself before moving Even if the table has a billion **Reply** items authored by other Users, this query will only cost us to read the exact 3 items we're hoping to return (unlike a `Scan`). -![Console Create GSI 2](/static/images/hands-on-labs/explore-console/console_create_gsi_2.png) +:image[Console Create GSI 2]{src="/static/images/hands-on-labs/explore-console/console_create_gsi_2.png" disableZoom=true width=850} :::: ### Cleanup When you're done, make sure to remove the GSI. Return to the Indexes tab, select the `PostedBy-ReplyDateTime-gsi` index and click `Delete`. -![Console Delete GSI](/static/images/hands-on-labs/explore-console/console_delete_gsi.png) +:image[Console Delete GSI]{src="/static/images/hands-on-labs/explore-console/console_delete_gsi.png" disableZoom=true width=850} diff --git a/content/hands-on-labs/explore-console/console-read-data.en.md b/content/hands-on-labs/explore-console/console-read-data.en.md index 7c45699b..98161fa7 100644 --- a/content/hands-on-labs/explore-console/console-read-data.en.md +++ b/content/hands-on-labs/explore-console/console-read-data.en.md @@ -6,18 +6,18 @@ weight: 31 First, go to the [DynamoDB Console](https://console.aws.amazon.com/dynamodbv2/) and click on *Tables* from the side menu. -![Console Pick Tables](/static/images/hands-on-labs/explore-console/dynamodb_pick_tables.png) +:image[Console Pick Tables]{src="/static/images/hands-on-labs/explore-console/dynamodb_pick_tables.png" disableZoom=true width=600} Next, choose the `ProductCatalog` table and click `Explore table items` on the top right to view the items. -![Console ProductCatalog Items Preview](/static/images/hands-on-labs/explore-console/console_productcatalog_preview.png) +:image[Console ProductCatalog Items Preview]{src="/static/images/hands-on-labs/explore-console/console_productcatalog_preview.png" disableZoom=true width=900} We can see visually that the table has a Partition Key of *Id* (which is the `Number` type), no sort key, and there are 8 items in the table. Some items are Books and some items are Bicycles and some attributes like *Id*, *Price*, *ProductCategory*, and *Title* exist in every Item while other Category specific attributes like Authors or Colors exist only on some items. Click on the *Id* attribute `101` to pull up the Item editor for that Item. We can see and modify all the attributes for this item right from the console. Try changing the *Title* to "Book 101 Title New and Improved". Click **Add new attribute** named *Reviewers* of the String set type and then clicking **Insert a field** twice to add a couple of entries to that set. When you're done click **Save changes** -![Console ProductCatalog Items Editor Forms](/static/images/hands-on-labs/explore-console/console_item_editor_forms.png) +:image[Console ProductCatalog Items Editor Forms]{src="/static/images/hands-on-labs/explore-console/console_item_editor_forms.png" disableZoom=true width=900} You can also use the Item editor in DynamoDB JSON notation (instead of the default Form based editor) by clicking **JSON** in the top right corner. This notation should look familiar if you already went through the [Explore the DynamoDB CLI](/hands-on-labs/explore-cli.html) portion of the lab. The DynamoDB JSON format is described in the [DynamoDB Low-Level API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html) section of the Developer Guide. -![Console ProductCatalog Items Editor JSON](/static/images/hands-on-labs/explore-console/console_item_editor_json.png) +:image[Console ProductCatalog Items Editor JSON]{src="/static/images/hands-on-labs/explore-console/console_item_editor_json.png" disableZoom=true width=900} \ No newline at end of file diff --git a/content/hands-on-labs/explore-console/console-read-item-collection.en.md b/content/hands-on-labs/explore-console/console-read-item-collection.en.md index d1c8c192..955cca70 100644 --- a/content/hands-on-labs/explore-console/console-read-item-collection.en.md +++ b/content/hands-on-labs/explore-console/console-read-item-collection.en.md @@ -16,29 +16,34 @@ The Key Condition Expression will define the number of RRUs or RCUs that are con We can optionally also specify a [Filter Expression](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.FilterExpression) for our Query. If we were comparing this to SQL, we would say "this is the part of the WHERE clause that acts on the non-Key attributes". Filter Expressions act to remove some items from the Result Set returned by the Query, **but they do not affect the consumed capacity of the Query**. If your Key Condition Expression matches 1,000,000 items and your FilterExpression reduces the result set down to 100 items, you will still be charged to read all 1,000,000 items. But the Filter Expression reduces the amount of data returned from the network connection so there is still a benefit to our application in using Filter Expressions even if it doesn't affect the price of the Query. The ProductCatalog table we used in the previous examples only has a Partition Key so let's look at the data in the **Reply** table which has both a Partition Key and a Sort Key. Select the left menu bar **Explore items** under Tables. -![Console Menu Item Explorer](/static/images/hands-on-labs/explore-console/console_menu_explore_item.png) + +:image[Console Menu Item Explorer]{src="/static/images/hands-on-labs/explore-console/console_menu_explore_item.png" disableZoom=true width=300} + You may need to click the hamburger menu icon to expand the left menu if its hidden. -![Console Menu Hamburger Icon](/static/images/hands-on-labs/explore-console/console_menu_hamburger_icon.png) + +:image[Console Menu Hamburger Icon]{src="/static/images/hands-on-labs/explore-console/console_menu_hamburger_icon.png" disableZoom=true width=900} Once you enter the Explore Items you need to select the **Reply** table and then expand the Scan/Query items box. -![Item Explorer Expand Tables](/static/images/hands-on-labs/explore-console/console_explore_item_select_table.png) +:image[Item Explorer Expand Tables]{src="/static/images/hands-on-labs/explore-console/console_explore_item_select_table.png" disableZoom=true width=900} Data in this table has an Id attribute which references items in the Thread table. Our data has two threads, and each thread has 2 replies. Let's use the *Query* functionality to read just the items from thread 1 by pasting `Amazon DynamoDB#DynamoDB Thread 1` into the *Id (Partition key)* box and then clicking **Run**. We can see that there are two Reply items in the `DynamoDB Thread 1` thread. -![Item Explorer Query Reply 1](/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_1.png) +:image[Item Explorer Query Reply 1]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_1.png" disableZoom=true width=900} + Since the Sort Key in this table is a timestamp, we could specify a Key Condition Expression to return only the replies in a thread that were posted after a certain time by adding a sort key condition where `ReplyDateTime` is More than `2015-09-21` and clicking **Run**. -![Item Explorer Query Reply 2](/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_2.png) +:image[Item Explorer Query Reply 2]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_2.png" disableZoom=true width=900} Remember we can use Filter Expressions if we want to limit our results based on non-key attributes. For example, we could find all the replies in Thread 1 that were posted by User B. Clear the sort key condition, and click **Add filter** then use `PostedBy` for the Attribute name, Condition `Equals` and Value `User B`, then click **Run**. -![Item Explorer Query Reply 3](/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_3.png) +:image[Item Explorer Query Reply 3]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_3.png" disableZoom=true width=900} + ## Exercise @@ -51,6 +56,7 @@ The solution is expandable below but try to figure it out yourself before moving ::::expand{header="Expand this to see the solution"} If we want to order items in descending order of the sort key there are two ways to accomplish this in the console. We could either choose the **Sort descending** checkbox before running the query, or we could run the query and click the arrow next to the *ReplyDateTime* attribute name in the **Items returned** pane to change the sort order on that attribute. -![Item Explorer Query Reply 4](/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_4.png) +:image[Item Explorer Query Reply 4]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_query_reply_4.png" disableZoom=true width=900} + :::: diff --git a/content/hands-on-labs/explore-console/console-scan.en.md b/content/hands-on-labs/explore-console/console-scan.en.md index b885b4e6..5bcf4cf5 100644 --- a/content/hands-on-labs/explore-console/console-scan.en.md +++ b/content/hands-on-labs/explore-console/console-scan.en.md @@ -9,18 +9,21 @@ The [Scan API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/AP The Scan API is similar to the Query API except that since we want to scan the whole table and not just a single Item Collection, there is no Key Condition Expression for a Scan. However, you can specify a [Filter Expression](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.FilterExpression) which will reduce the size of the result set (even though it will not reduce the amount of capacity consumed). Let us look at the data in the **Reply** table which has both a Partition Key and a Sort Key. Select the left menu bar **Explore items**. -![Console Menu Item Explorer](/static/images/hands-on-labs/explore-console/console_menu_explore_item.png) + +:image[Console Menu Item Explorer]{src="/static/images/hands-on-labs/explore-console/console_menu_explore_item.png" disableZoom=true width=250} + You may need to click the hamburger menu icon to expand the left menu if its hidden. -![Console Menu Hamburger Icon](/static/images/hands-on-labs/explore-console/console_menu_hamburger_icon.png) + +:image[Console Menu Hamburger Icon]{src="/static/images/hands-on-labs/explore-console/console_menu_hamburger_icon.png" disableZoom=true width=900} Once you enter the Explore Items you need to select the **Reply** table and then expand the Scan/Query items box. -![Item Explorer Expand Tables](/static/images/hands-on-labs/explore-console/console_explore_item_select_table.png) +:image[Item Explorer Expand Tables]{src="/static/images/hands-on-labs/explore-console/console_explore_item_select_table.png" disableZoom=true width=900} For example, we could find all the replies in the Reply that were posted by User A. -![Item Explorer Scan Reply 1](/static/images/hands-on-labs/explore-console/console_item_explorer_scan_reply_1.png) +:image[Item Explorer Scan Reply 1]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_scan_reply_1.png" disableZoom=true width=900} You should see 3 **Reply** items posted by User A. @@ -35,5 +38,6 @@ The solution is expandable below but try to figure it out yourself before moving ::::expand{header="Expand this to see the solution"} For this access pattern we will need to make a FilterCondition with clauses on both the *Threads* and *Views* attributes before clicking **Run**. -![Item Explorer Scan Reply 2](/static/images/hands-on-labs/explore-console/console_item_explorer_scan_reply_2.png) +:image[Item Explorer Scan Reply 2]{src="/static/images/hands-on-labs/explore-console/console_item_explorer_scan_reply_2.png" disableZoom=true width=900} + :::: diff --git a/content/hands-on-labs/explore-console/console-writing-data.en.md b/content/hands-on-labs/explore-console/console-writing-data.en.md index 7c4c9d18..d4054471 100644 --- a/content/hands-on-labs/explore-console/console-writing-data.en.md +++ b/content/hands-on-labs/explore-console/console-writing-data.en.md @@ -10,7 +10,7 @@ The DynamoDB [PutItem API](https://docs.aws.amazon.com/amazondynamodb/latest/API Let's say we wanted to insert a new item into the *Reply* table from the console. First, navigate to the **Reply** table click the **Create Item** button. -![Console Create Item 1](/static/images/hands-on-labs/explore-console/console_create_item_1.png) +:image[Console Create Item 1]{src="/static/images/hands-on-labs/explore-console/console_create_item_1.png" disableZoom=true width=650} Click `JSON view`, ensure `View DynamoDB JSON` is deselected, paste the following JSON, and then click **Create Item** to insert the new item. @@ -23,7 +23,7 @@ Click `JSON view`, ensure `View DynamoDB JSON` is deselected, paste the followin } ``` -![Console Create Item 2](/static/images/hands-on-labs/explore-console/console_create_item_2.png) +:image[Console Create Item 2]{src="/static/images/hands-on-labs/explore-console/console_create_item_2.png" disableZoom=true width=850} ## Updating or Deleting Data @@ -33,7 +33,7 @@ The DynamoDB [DeleteItem API](https://docs.aws.amazon.com/amazondynamodb/latest/ You can easily modify or delete an item using the console by selecting the checkbox next to the item of interest, clicking the **Actions** dropdown and performing the desired action. -![Console Delete Item](/static/images/hands-on-labs/explore-console/console_delete_item.png) +:image[Console Delete Item]{src="/static/images/hands-on-labs/explore-console/console_delete_item.png" disableZoom=true width=650} ## Exercise @@ -47,17 +47,17 @@ The solution is expandable below but try to figure it out yourself before moving Navigate to the **ProductCatalog** Table and click the `Id` 201 hyperlink to bring up the Item Editor for that item. Click the `+` icon next to the *Color* attribute to expand that List. -![Console Modify Item 1](/static/images/hands-on-labs/explore-console/console_modify_item_1.png) +:image[Console Modify Item 1]{src="/static/images/hands-on-labs/explore-console/console_modify_item_1.png" disableZoom=true width=750} Click `Insert a field` and pick the `String` type. Do this twice. Add the colors "Silver" and "Green" to the list, then click `Save changes`. -![Console Modify Item 2](/static/images/hands-on-labs/explore-console/console_modify_item_2.png) +:image[Console Modify Item 2]{src="/static/images/hands-on-labs/explore-console/console_modify_item_2.png" disableZoom=true width=750} We can see by expanding the Items Preview that those two list entries were added. -![Console Modify Item 3](/static/images/hands-on-labs/explore-console/console_modify_item_3.png) +:image[Console Modify Item 3]{src="/static/images/hands-on-labs/explore-console/console_modify_item_3.png" disableZoom=true width=750} Return to the item editor for `Id` 201 and use the `Remove` button next to the Silver and Green list entries to remove them from the `Color` attribute, then click `Save changes`. -![Console Modify Item 4](/static/images/hands-on-labs/explore-console/console_modify_item_4.png) +:image[Console Modify Item 4]{src="/static/images/hands-on-labs/explore-console/console_modify_item_4.png" disableZoom=true width=750} :::: diff --git a/content/hands-on-labs/setup/aws-ws-event.en.md b/content/hands-on-labs/setup/aws-ws-event.en.md index 082589f4..0049984d 100644 --- a/content/hands-on-labs/setup/aws-ws-event.en.md +++ b/content/hands-on-labs/setup/aws-ws-event.en.md @@ -10,26 +10,32 @@ chapter: true 1. If you are provided a one-click join link, use it and skip to step 3. 2. Visit [https://catalog.us-east-1.prod.workshops.aws](https://catalog.us-east-1.prod.workshops.aws). If you attended any other workshop earlier on this portal, please logout first. Click on **Get Started** on the right hand side of the window. -![Workshop Studio Landing Page](/static/images/aws-ws-event1.png) + +:image[Workshop Studio Landing Page]{src="/static/images/aws-ws-event1.png" disableZoom=true width=1100} 3. On the next, **Sign in** page, choose **Email One-Time Passcode (OTP)** to sign in to your workshop page. -![Sign in page](/static/images/aws-ws-event2.png) + +:image[Sign in page]{src="/static/images/aws-ws-event2.png" disableZoom=true width=400} 4. Provide an email address to receive a one-time passcode. -![Email address input](/static/images/aws-ws-event3.png) + +:image[Email address input]{src="/static/images/aws-ws-event3.png" disableZoom=true width=450} 5. Enter the passcode that you received in the provided email address, and click **Sign in**. 6. Next, in the textbox, enter the event access code (eg: abcd-012345-ef) that you received from the event facilitators. If you are provided a one-click join link, you will be redirected to the next step automatically. -![Event access code](/static/images/aws-ws-event4.png) + +:image[Event access code]{src="/static/images/aws-ws-event4.png" disableZoom=true width=750} + 7. Select on **I agree with the Terms and Conditions** on the bottom of the next page and click **Join event** to continue to the event dashboard. 8. On the event dashboard, click on **Open AWS console** to federate into AWS Management Console in a new tab. On the same page, click **Get started** to open the workshop instructions. -![Event dashboard](/static/images/common/workshop-studio-01.png) + +:image[Event dashboard]{src="/static/images/common/workshop-studio-01.png" disableZoom=true width=750} 9. In addition to the AWS console you should open your Visual Studio code server, by clicking in the `VSCodeServerURL` parameter, available from the "Event Outputs" section. When prompted for a password use the value from `VSCodeServerPassword`. -![Event dashboard](/static/images/common/workshop-studio-02.png) +:image[Event dashboard]{src="/static/images/common/workshop-studio-02.png" disableZoom=true width=750} 10. Continue with the steps as listed in the section :link[Launch Visual Studio Code]{href="/hands-on-labs/setup/vscode"}. \ No newline at end of file diff --git a/content/hands-on-labs/setup/index.en.md b/content/hands-on-labs/setup/index.en.md index 88eb22cd..4f958630 100644 --- a/content/hands-on-labs/setup/index.en.md +++ b/content/hands-on-labs/setup/index.en.md @@ -10,7 +10,7 @@ In this chapter, we'll cover the prerequisites needed to get started with [Amazo The deployment architecture that you will be building in this lab will look like the below. -![Final Deployment Architecture](/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png) +:image[Final Deployment Architecture]{src="/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png" disableZoom=true width=650} ## Prerequisites @@ -27,7 +27,7 @@ You can use your own account, or an account provided through Workshop Studio Eve If you are running this workshop using a link provided to you by your AWS instructor, please use that link and enter the access-code provided to you as part of the workshop. In the lab AWS account, the Visual Studio Code instance should already be provisioned. This should be available at the "Event Output" section in your Workshop studio URL. -![CloudFormation parameters](/static/images/common/on-your-own-cf-03.png) +:image[CloudFormation parameters]{src="/static/images/common/on-your-own-cf-03.png" disableZoom=true width=1000} #### Using your own AWS account diff --git a/content/hands-on-labs/setup/load-sample-data.en.md b/content/hands-on-labs/setup/load-sample-data.en.md index 16dcdb82..06437349 100644 --- a/content/hands-on-labs/setup/load-sample-data.en.md +++ b/content/hands-on-labs/setup/load-sample-data.en.md @@ -41,6 +41,7 @@ After each data load you should get this message saying that there were no Unpro ``` #### Sample output -![Processed Items](/static/images/hands-on-labs/load-sample-data.png) + +:image[Processed Items]{src="/static/images/hands-on-labs/load-sample-data.png" disableZoom=true width=900} You can now continue with the section :link[Explore DynamoDB with the CLI]{href="/hands-on-labs/explore-cli"}. \ No newline at end of file diff --git a/content/hands-on-labs/setup/vscode.en.md b/content/hands-on-labs/setup/vscode.en.md index afda9e4f..224b797d 100644 --- a/content/hands-on-labs/setup/vscode.en.md +++ b/content/hands-on-labs/setup/vscode.en.md @@ -4,14 +4,20 @@ date: 2021-04-21T07:33:04-05:00 weight: 13 --- +In addition to the AWS console you should open your Visual Studio code server, by clicking in the `VSCodeServerURL` parameter, available from the "Event Outputs" section. When prompted for a password use the value from `VSCodeServerPassword`. + +:image[Event dashboard]{src="/static/images/common/workshop-studio-02.png" disableZoom=true width=750} + +Continue with the steps as listed in the section :link[Launch Visual Studio Code]{href="/hands-on-labs/setup/vscode"}. + During the first 60 seconds, the environment will automatically update extensions and plugins. Any startup notification can be safely dismissed. - -![VS Code Setup](/static/images/common/common-vs-code-01.png) -If a terminal is not available at the bottom left side of your screen, please open a new one like the following picture indicates. +:image[VS Code Setup]{src="/static/images/common/common-vs-code-01.png" disableZoom=true width=1000} + +If a terminal is not available at the bottom left side of your screen, please open a new one, as shown in the picture below: -![VS Code Setup](/static/images/common/common-vs-code-02.png) +:image[VS Code Setup]{src="/static/images/common/common-vs-code-02.png" disableZoom=true width=900} -Then run the command `aws sts get-caller-identity` just to verify that your AWS credentials have been properly configured. +To verify that your AWS credentials have been properly configured, run the command `aws sts get-caller-identity` -![VS Code Setup](/static/images/common/common-vs-code-03.png) +:image[VS Code Setup]{src="/static/images/common/common-vs-code-03.png" disableZoom=true width=1000} \ No newline at end of file diff --git a/static/images/hands-on-labs/backup/od_backup_1.png b/static/images/hands-on-labs/backup/od_backup_1.png index 51b8073d..20b6b902 100644 Binary files a/static/images/hands-on-labs/backup/od_backup_1.png and b/static/images/hands-on-labs/backup/od_backup_1.png differ diff --git a/static/images/hands-on-labs/backup/od_backup_2.png b/static/images/hands-on-labs/backup/od_backup_2.png index 66200a41..ac0b3abd 100644 Binary files a/static/images/hands-on-labs/backup/od_backup_2.png and b/static/images/hands-on-labs/backup/od_backup_2.png differ diff --git a/static/images/hands-on-labs/backup/od_backup_3.png b/static/images/hands-on-labs/backup/od_backup_3.png index dc964a9d..c6bf4c3c 100644 Binary files a/static/images/hands-on-labs/backup/od_backup_3.png and b/static/images/hands-on-labs/backup/od_backup_3.png differ diff --git a/static/images/hands-on-labs/backup/od_backup_5.png b/static/images/hands-on-labs/backup/od_backup_5.png index e89a71c5..25181c41 100644 Binary files a/static/images/hands-on-labs/backup/od_backup_5.png and b/static/images/hands-on-labs/backup/od_backup_5.png differ diff --git a/static/images/hands-on-labs/backup/od_backup_6.png b/static/images/hands-on-labs/backup/od_backup_6.png index 4fcd75d8..31ce15db 100644 Binary files a/static/images/hands-on-labs/backup/od_backup_6.png and b/static/images/hands-on-labs/backup/od_backup_6.png differ diff --git a/static/images/hands-on-labs/backup/pitr_backup_1.png b/static/images/hands-on-labs/backup/pitr_backup_1.png index 706acd16..1c9d73b8 100644 Binary files a/static/images/hands-on-labs/backup/pitr_backup_1.png and b/static/images/hands-on-labs/backup/pitr_backup_1.png differ diff --git a/static/images/hands-on-labs/backup/pitr_backup_2.png b/static/images/hands-on-labs/backup/pitr_backup_2.png index ae5f90ae..f78f49e4 100644 Binary files a/static/images/hands-on-labs/backup/pitr_backup_2.png and b/static/images/hands-on-labs/backup/pitr_backup_2.png differ diff --git a/static/images/hands-on-labs/backup/pitr_restore_1.png b/static/images/hands-on-labs/backup/pitr_restore_1.png index 7472ddf9..39048159 100644 Binary files a/static/images/hands-on-labs/backup/pitr_restore_1.png and b/static/images/hands-on-labs/backup/pitr_restore_1.png differ diff --git a/static/images/hands-on-labs/backup/pitr_restore_2.png b/static/images/hands-on-labs/backup/pitr_restore_2.png index 93c26f66..84aa85d3 100644 Binary files a/static/images/hands-on-labs/backup/pitr_restore_2.png and b/static/images/hands-on-labs/backup/pitr_restore_2.png differ diff --git a/static/images/hands-on-labs/backup/pitr_restore_3.png b/static/images/hands-on-labs/backup/pitr_restore_3.png index e8c136f3..93c09e66 100644 Binary files a/static/images/hands-on-labs/backup/pitr_restore_3.png and b/static/images/hands-on-labs/backup/pitr_restore_3.png differ diff --git a/static/images/hands-on-labs/backup/pitr_unwanted_records.png b/static/images/hands-on-labs/backup/pitr_unwanted_records.png index 0721efbe..6c9330f6 100644 Binary files a/static/images/hands-on-labs/backup/pitr_unwanted_records.png and b/static/images/hands-on-labs/backup/pitr_unwanted_records.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_1.png b/static/images/hands-on-labs/backup/sched_backup_1.png index 1a173574..6866c9a7 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_1.png and b/static/images/hands-on-labs/backup/sched_backup_1.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_2.png b/static/images/hands-on-labs/backup/sched_backup_2.png index cc6d48cf..4c414917 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_2.png and b/static/images/hands-on-labs/backup/sched_backup_2.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_3.png b/static/images/hands-on-labs/backup/sched_backup_3.png index 6e6db2ae..dca41b40 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_3.png and b/static/images/hands-on-labs/backup/sched_backup_3.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_4.png b/static/images/hands-on-labs/backup/sched_backup_4.png index c43f7e29..4e64f47d 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_4.png and b/static/images/hands-on-labs/backup/sched_backup_4.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_5.png b/static/images/hands-on-labs/backup/sched_backup_5.png index 3a86b129..10de55ff 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_5.png and b/static/images/hands-on-labs/backup/sched_backup_5.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_6.png b/static/images/hands-on-labs/backup/sched_backup_6.png index d56c239c..3fe0c279 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_6.png and b/static/images/hands-on-labs/backup/sched_backup_6.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_7.png b/static/images/hands-on-labs/backup/sched_backup_7.png index d36e6c2f..4fa0ed57 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_7.png and b/static/images/hands-on-labs/backup/sched_backup_7.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_8.png b/static/images/hands-on-labs/backup/sched_backup_8.png index 7eda88f8..5a0d3988 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_8.png and b/static/images/hands-on-labs/backup/sched_backup_8.png differ diff --git a/static/images/hands-on-labs/backup/sched_backup_9.png b/static/images/hands-on-labs/backup/sched_backup_9.png index 0dced9d5..b898a70e 100644 Binary files a/static/images/hands-on-labs/backup/sched_backup_9.png and b/static/images/hands-on-labs/backup/sched_backup_9.png differ diff --git a/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png b/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png index 7f594c84..6e84be2e 100644 Binary files a/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png and b/static/images/hands-on-labs/setup/dynamodb_lab_architecture.png differ