diff --git a/content/Azure/01_intro_to_cloud_console.ipynb b/content/Azure/01_intro_to_cloud_console.ipynb index 1315d3b..b48fb8c 100644 --- a/content/Azure/01_intro_to_cloud_console.ipynb +++ b/content/Azure/01_intro_to_cloud_console.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "dba7ad08", + "id": "976355b6", "metadata": {}, "source": [ "# Introduction to the Azure Console\n", @@ -28,10 +28,10 @@ }, { "cell_type": "markdown", - "id": "ed22965b", + "id": "41948653", "metadata": {}, "source": [ - "### Setup\n", + "## Setup\n", "\n", "The console is the point of entry where you will start your Azure journey. If you are participating in the CLASS Essentials Workshop, you will have received a csv file via email. This csv file contains your **username**, **temporary password** and **console login link**. \n", "\n", @@ -47,14 +47,14 @@ "\n", "Figure 1 is what your screen should look like when you log in to the Azure console. Next, let's take a closer look at some key concepts and components of the Azure console. \n", "\n", - "\n", + "\n", "\n", "
Figure 1: Logging in to the Azure console

" ] }, { "cell_type": "markdown", - "id": "15ee81a4", + "id": "27fc9127", "metadata": {}, "source": [ " **1. Hamburger**\n", diff --git a/content/Azure/02_intro_to_compute.ipynb b/content/Azure/02_intro_to_compute.ipynb new file mode 100644 index 0000000..0777636 --- /dev/null +++ b/content/Azure/02_intro_to_compute.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8932d2c1", + "metadata": {}, + "source": [ + "# Introduction to Virtual Machines (VM) in Azure\n", + "\n", + "\n", + "```{admonition} Overview\n", + ":class: tip\n", + "\n", + "**Teaching:** 45 mins\n", + "\n", + "**Exercises:** 10 mins\n", + "\n", + "**Questions:**\n", + "\n", + "**Objectives:**\n", + "* Understand the concept of virtual servers.\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "05306c25", + "metadata": {}, + "source": [ + "**Create a VM**\n", + "\n", + "Hamburger in upper left -> Virtual Machines -> Create (+) in upper left -> virtual machines ->\n", + "In the middle of the page under \"Create Virtual Machine\" heading there are menu options from left to right: Basic, Disk, Networking, Management, Advanced, Tags, Review & Create\n", + " \n", + "**Basic:**\n", + " \n", + "**Part 1**\n", + "* Check subscription \n", + "* select or create Resource Group\n", + "* VM name\n", + "* Image\n", + "* Spot\n", + "* Size\n", + "\n", + "\n", + "\n", + "**Part 2**\n", + "* Authentication type \n", + " * ssh public key\n", + "* Username\n", + " * Choose usename (default: azeruser)\n", + "* ssh public key source\n", + " * Generate new key pair\n", + "* Key pair name\n", + " * Choose name for key pair (default: auto generated based on VM name)\n", + "* Ports (none)\n", + " * Open inbound ports (default: none)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "536af466", + "metadata": {}, + "source": [ + "Now let's continue to the disk configuration by clicking Next:Disk> on the bottum or on the top heading menu choose the Disk option.\n", + "\n", + "**Disk**\n", + "* OS Disk type\n", + " * Leave as default\n", + "* Encryption type\n", + " * Leave as default\n", + "* Data disk (create or attach)\n", + " * Leave as default\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "007e8359", + "metadata": {}, + "source": [ + "Now let's continue to the networking configuration by clicking Next:Networking> on the bottum or on the top heading menu choose the Networking option.\n", + "\n", + "**Networking**\n", + "* Virtual network name\n", + "* Public IP\n", + " * None\n", + "* NIC network security group \n", + " * None\n", + "* Public inbound port(s)\n", + " * Allow selected port\n", + "* Select inbound port(s)\n", + " * Use 22 for ssh access\n", + " \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1e052657", + "metadata": {}, + "source": [ + "Now let's continue to provision the VM. The next three menu options accross the top are outside the scope of this tutoial so now we are ready to click Review & Create.\n", + "\n", + "**Management**\n", + "* Outside of scope\n", + "\n", + "**Advanced**\n", + "\n", + " * Outside of scope\n", + " \n", + "**Tags**\n", + "\n", + " * Outside of scope\n", + " \n", + "**Review & Create**\n", + "\n", + " * Click Review & Create \n", + " * After review you should have a green check indicating a successful validation\n", + " * Check parameters for correctness\n", + " * Click create\n", + "\n", + "When the VM is provisioned we can verify that the VM was created.\n", + "\n", + "**Verify deployment**\n", + "* Click the hamburger in the upper left\n", + "* Choose Virtual Machines\n", + "* You should see your VM name\n", + "* Click on VM name to get more information about your VM\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "48a51891", + "metadata": {}, + "source": [ + "```{admonition} Exercise\n", + ":class: attention\n", + "\n", + "* How do Spot Instances help you optimize costs?\n", + "````" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Azure/02_intro_to_compute_old.ipynb b/content/Azure/02_intro_to_compute_old.ipynb new file mode 100644 index 0000000..41e2c89 --- /dev/null +++ b/content/Azure/02_intro_to_compute_old.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fcfca89e", + "metadata": {}, + "source": [ + "# Introduction to Virtual Machines (VM) in Azure\n", + "\n", + "\n", + "```{admonition} Overview\n", + ":class: tip\n", + "\n", + "**Teaching:** 45 mins\n", + "\n", + "**Exercises:** 10 mins\n", + "\n", + "**Questions:**\n", + "* What is an EC2 instance?\n", + "* When would I use an EC2 instance?\n", + "* How do I launch an EC2 instance?\n", + "\n", + "**Objectives:**\n", + "* Understand the concept of virtual servers.\n", + "* Understand what an Elastic Cloud Compute (EC2) instance is.\n", + "\n", + "```\n", + "\n", + "There are 7 steps to walk through to create a new EC2 instance; we will go through each in detail: \n", + "1. Select an AMI\n", + "2. Choose Instance Type\n", + "3. Configure Instance \n", + "4. Add Storage\n", + "5. Add Tags\n", + "6. Configure Security Group\n", + "7. Review/Launch\n", + "\n", + "\n", + "# Tutoroial to depoy VMs and show commands\n", + "# https://docs.microsoft.com/en-us/cli/azure/azure-cli-vm-tutorial\n", + "\n", + "# Create resource group\n", + "az group create --name TutorialResources --location eastus\n", + "\n", + "# Create VM\n", + "az vm create --resource-group TutorialResources \\\n", + " --name TutorialVM1 \\\n", + " --image UbuntuLTS \\\n", + " --generate-ssh-keys \\\n", + " --output json \\\n", + " --verbose \n", + "\n", + "# Login into VM\n", + "ssh \n", + "\n", + "# Show VM details (all)\n", + "az vm show --name TutorialVM1 --resource-group TutorialResources\n", + "\n", + "# NIC object ID\n", + "az vm show --name TutorialVM1 \\\n", + " --resource-group TutorialResources \\\n", + " --query 'networkProfile.networkInterfaces[].id' \\\n", + " --output tsv\n", + "\n", + "# Assign NIC ID to env variable \n", + "NIC_ID=$(az vm show -n TutorialVM1 -g TutorialResources \\\n", + " --query 'networkProfile.networkInterfaces[].id' \\\n", + " -o tsv)\n", + "\n", + "# Show NIC details\n", + "az network nic show --ids $NIC_ID\n", + "\n", + "# Since two values on separate lines are displayed, the read command delimiter must be set \n", + "# to the empty string rather than the default of non-newline whitespace.\n", + "read -d '' IP_ID SUBNET_ID <<< $(az network nic show \\\n", + " --ids $NIC_ID \\\n", + " --query '[ipConfigurations[].publicIpAddress.id, ipConfigurations[].subnet.id]' \\\n", + " -o tsv)\n", + "\n", + "# Assign IP to env variable\n", + "VM1_IP_ADDR=$(az network public-ip show --ids $IP_ID \\\n", + " --query ipAddress \\\n", + " -o tsv)\n", + "\n", + "# Show IP address\n", + "echo $VM1_IP_ADDR\n", + "\n", + "# Create another VM and assign to existing subnet\n", + "VM2_IP_ADDR=$(az vm create -g TutorialResources \\\n", + " -n TutorialVM2 \\\n", + " --image UbuntuLTS \\\n", + " --generate-ssh-keys \\\n", + " --subnet $SUBNET_ID \\\n", + " --query publicIpAddress \\\n", + " -o tsv)\n", + "\n", + "# Login to second VM2\n", + "ssh $VM2_IP_ADDR\n", + "\n", + "# Delete resource group (& all above)\n", + "az group delete --name TutorialResources --no-wait\n", + "\n", + "# The --no-wait parameter keeps the CLI from blocking while the deletion takes place. \n", + "az group wait --name TutorialResources --deleted" + ] + }, + { + "cell_type": "markdown", + "id": "81c865bc", + "metadata": {}, + "source": [ + "Hamburger in upper left -> Virtual Machines -> Create (+) in upper left -> virtual machines ->\n", + "In the middle of the page under \"Create Virtual Machine\" heading there are menu options from left to right: Basic, Disk, Networking, Management, Advanced, Tags, Review & Create\n", + "\n", + "**Basic:**\n", + "* Check subscription \n", + "* select or create Resource Group\n", + "* VM name\n", + "\n", + "**Disk**\n", + "\n", + "**Networking**\n", + "\n", + "**Management**\n", + "\n", + "**Advanced**\n", + "\n", + "**Tags**\n", + "\n", + "**Review & Create**\n", + "\n", + "Recall that the two fundamental components of cloud computing is compute and storage. On AWS, a \"virtual server\" or \"virtual computer\" is known as an **Elastic Cloud Compute (EC2) instance**; sometimes it's called \"EC2\", sometimes it's called an \"instance\" to denote that the ability to build and terminate this server instantaneously, but they all mean the same thing. An EC2 instance is no different from a server that sits under your desk, or your local departmental cluster, or even your local HPC cluster. You even boot up an EC2 instance through the web console, install software and then shut down your instance just like you would a real computer, except that Amazon takes care of the physical machinery while you are in charge of process of creating the computer. In some sense, you can think of utilizing an EC2 instance as renting a server or computer from Amazon! \n", + "\n", + "In cloud jargon, the term **elasticity** denotes the ability to quickly expand or decrease computer processing, memory, and storage resources to meet changing demands. In that way, you can expand the size of your CPU, RAM and disk size on your EC2 instance almost instantenously. Since EC2 forms the backbone of most of AWS's core infrastructure, it is an important part of your cloud journey. \n", + " \n", + "\n", + "Let's walk through some of the steps on getting an EC2 instance up and running. \n" + ] + }, + { + "cell_type": "markdown", + "id": "99fc77c6", + "metadata": {}, + "source": [ + "We begin with the AWS console again. Under the \"Build a Solution\" panel, select `Launch a Virtual Machine`\n", + "\n", + "\n", + "\n", + "
Figure 1: Start page for the AWS console

\n", + "\n", + "This will then lead you through a series of steps to get a **Free Tier** EC2 instance up and running. \n", + "\n", + "```{admonition} Note\n", + ":class: note\n", + "\n", + "AWS Free Tier refers to several of the services that AWS offers to help users gain more hands on experience on the AWS platform without being charged. [Click here](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all) for more info about the AWS Free Tier [external link] . \n", + "```\n", + "\n", + "There are 7 steps to walk through to create a new EC2 instance; we will go through each in detail: \n", + "1. Select an AMI\n", + "2. Choose Instance Type\n", + "3. Configure Instance \n", + "4. Add Storage\n", + "5. Add Tags\n", + "6. Configure Security Group\n", + "7. Review/Launch" + ] + }, + { + "cell_type": "markdown", + "id": "72dc7149", + "metadata": {}, + "source": [ + "## 1. Select an AMI\n", + "\n", + "An Amazon Machine Image (AMI) is a template that Amazon uses to describe the operating system, disk type and all the software configuration that is needed to make sure a computer runs smoothly. Imagine that you are purchasing a new laptop; fresh out of the box, the laptop is pre-configured with an operating system (e.g. Windows, Mac OS, Ubuntu etc.), configuration files that tells the laptop what peripherals are attached, and pre-installed software like Adobe PDF reader. An AMI contains all this information so that your EC2 instance runs exactly like it would a new laptop out of the box! There is much more to learn about AMIs and how they can used for collaboration and data sharing but that is not within the scope of CLASS Essentials. \n", + "\n", + "As you scroll through the AMI list (Figure 2) you will notice that the list contains offerings from various vendors (e.g. Amazon, RedHat, Windows, etc.). We will be choosing the Ubuntu operating system for flexibility and versatility (can be used outside of the AWS ecosystem). \n", + "\n", + "To list all the Free Tier AMIs, check the box on the right that says ```Free tier only```.\n", + "\n", + "\n", + "\n", + "
Figure 2: Step 1 - Select an AMI - Free Tier Only

\n", + "\n", + "Scroll to ```Ubuntu Server 20.04 LTS(HVM), SSD Volume Type``` (Figure 3). Select ```64-bit(x86)```. \n", + "\n", + "\n", + "\n", + "
Figure 3: Step 1 - Select an AMI - Operating System Selection

" + ] + }, + { + "cell_type": "markdown", + "id": "17597535", + "metadata": {}, + "source": [ + "## Step 2: Choose an Instance Type\n", + "\n", + "Choosing an instance type is choosing the hardware for your computing system: you get to pick the number of CPUs and memory size for your instance. \n", + "\n", + "Instance types are group by [**families**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) and denotes whether, for example, an instance is optimized for batch processing (compute-optimized, C-family), optimized for databases (memory-optimized, R-family) or has accelerated hardware (GPUs) for AI or Machine Learning pipelines. \n", + "\n", + "When you choose an Instance Type (Figure 3), the screen show additional information about the selected instance type including the number of CPUs, the memory size, the type of storage and information about networking. \n", + "\n", + "In the Instance Storage (GB) column, you will notice a term called **EBS**. EBS is the acronym for **Elastic Block Storage** and is analogous to the hard disk or boot drive on your personal computer or laptop. More details about EBS and different kinds of disk storage on EC2 instances are beyond the scope of CLASS Essentials. \n", + "\n", + "```{admonition} Note\n", + ":class: note\n", + "The four most common types of storage you will encounter on AWS are: Elastic Block Storage (EBS), Elastic File Storage (EFS), Simple Storage Service (s3) and s3 Glacier. In the simplest terms, EBS is analogous to a computer hard drive and EFS is analogous to a network file system (NFS) or shared file system. s3 is AWS's object storage which is discussed [here](./intro_to_s3). s3 Glacier is a cost-effective way of storing s3 files that you do not need to access frequently. \n", + "```\n", + "\n", + "Here will will select a ```t2.micro``` instance which is Free Tier Eligible but only has 1vCPU and 1 GiB of memory. The cost of running a t2.micro instance is " + ] + }, + { + "cell_type": "markdown", + "id": "4ee655a3", + "metadata": {}, + "source": [ + "\n", + "\n", + "
Figure 3: Step 2 - Choose an Instance Type

\n", + "\n", + "Select ```Next: Configure Instance Details```.\n", + "\n", + "## Step 3: Configure Instance Details\n", + "Step 3 in creating an EC2 instance involves a rudimentary understanding of several key AWS and cloud jargon (Figure 4). While delving deeper into some of the terminology is outside of the scope of CLASS Essentials, we go will through these terms in brief as we learn how to configure your EC2 instance. \n", + "\n", + "\n", + "\n", + "
Figure 4: Step 3 - Configure Instance Details

\n", + "\n", + "**Number of instances** : This indicates how many instances you want to create at the same time. Here, we will leave the value as '1' but in actuality, you can can have up to 20 instances per region. \n", + "\n", + "```{admonition} Note\n", + ":class: note\n", + "Recall that we learned about regions in the [previous chapter](./intro_to_cloud_console). \n", + "```\n", + "\n", + "**Purchasing Options** : Throughout your AWS journey, you will hear the term [**Spot Instances**](). Spot instances make use of the servers that go unused in AWS data centers to minimize costs. Recall that AWS has many data centers spread across the globe and not all their servers are utilized at 100% capacity at all times. Amazon uses Spot Instances as a flexible way to profit from extra capacity. Users have access to Spot Instances through a bidding process, sometimes users can save up to 90% off the on-deman compute instance this way! We will not expand much more on Spot Instances in CLASS Essentials but if you are interested, I2's CLASS Intermediate talks more " + ] + }, + { + "cell_type": "markdown", + "id": "9c874bad", + "metadata": {}, + "source": [ + "```{admonition} Exercise\n", + ":class: attention\n", + "\n", + "* What kind of information is contained in an AMI? \n", + "* How do Spot Instances help you optimize costs?\n", + "````" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Azure/02_intro_to_compute_part1.ipynb b/content/Azure/02_intro_to_compute_part1.ipynb index e49623e..a6c4161 100644 --- a/content/Azure/02_intro_to_compute_part1.ipynb +++ b/content/Azure/02_intro_to_compute_part1.ipynb @@ -70,9 +70,11 @@ ] }, { - "cell_type": "markdown", - "id": "b9809503", + "cell_type": "code", + "execution_count": null, + "id": "1e02813b", "metadata": {}, + "outputs": [], "source": [ "## 1. Select an AMI\n", "\n", @@ -117,9 +119,11 @@ ] }, { - "cell_type": "markdown", - "id": "4ee655a3", + "cell_type": "code", + "execution_count": null, + "id": "f4247acd", "metadata": {}, + "outputs": [], "source": [ "\n", "\n", @@ -160,7 +164,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -174,7 +178,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/content/Azure/03_intro_to_compute_part2.ipynb b/content/Azure/03_intro_to_compute_part2.ipynb index a85f0bd..f81f13b 100644 --- a/content/Azure/03_intro_to_compute_part2.ipynb +++ b/content/Azure/03_intro_to_compute_part2.ipynb @@ -129,7 +129,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -143,7 +143,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/content/Azure/05_intro_to_cloud_storage.ipynb b/content/Azure/05_intro_to_cloud_storage.ipynb index f3f90ef..98030c8 100644 --- a/content/Azure/05_intro_to_cloud_storage.ipynb +++ b/content/Azure/05_intro_to_cloud_storage.ipynb @@ -2,43 +2,188 @@ "cells": [ { "cell_type": "markdown", - "id": "dc57021c", + "id": "677549a8", "metadata": {}, "source": [ - "# Introduction to Cloud Storage\n", + "# Introduction to Azure Cloud Storage\n", "\n", + "Learner Questions\n", + " * How do I store data in the cloud?\n", "\n", - "```{admonition} Overview\n", - ":class: tip\n", + "Learning Objectives:\n", + " * Navigate the Azure Cloud Storage service and terminology\n", + " * Understand the roles and permissions needed to use Azure Cloud Storage\n", + " * Allocate storage in Azure Cloud Storage account\n", + " * Allocate storage in Azure Cloud Storage\n", + " * De-allocate Azure Cloud Storage storage" + ] + }, + { + "cell_type": "markdown", + "id": "09e26920", + "metadata": {}, + "source": [ + "Drew, after working with a Research Computing and Data (RCD) facilitator, has decided to continue his cloud journey with storage.\n", + "\n", + "One of the most common and economic ways to store data in the cloud is to use object storage.\n" + ] + }, + { + "cell_type": "markdown", + "id": "d46f786b", + "metadata": { + "tags": [] + }, + "source": [ + "## Azure Cloud Storage\n", + "\n", + "To learn more about the Azure blob Storage service we will use the web console to create, explore, and destroy a storage container. The ability to quickly create, explore, and then discard resources in the web-console is a powerful tool to explore a service. After an initial exploration with the web-console, programmatic access using scripts and programming languages should be used.\n", + "\n", + "Unfortunately, the terminology used for object storage differs from one commercial cloud provider to another. Azure uses the terms Storage Container. Data is stored in Objects and Objects are stored in Containers. Objects (data) are stored as a key-value pair, which is similar to a Python dictionary but persistent. Values are stored and retrieved using a unique key and the value can contain any information (more on this later).\n", + "\n", + "We now take Drew through the process of creating a Google Cloud Storage bucket." + ] + }, + { + "cell_type": "markdown", + "id": "89b2cc65", + "metadata": { + "tags": [] + }, + "source": [ + "### Security (Still need to update for Azure)\n", "\n", + "Everything in the cloud requires permission (authorization). Let's first verify that we have the permissions to create a bucket. A Bucket (a resource) is created within a project and inheres permissions from it.\n", "\n", - "```" + "We are interested in what permissions that *your* account has for *your* project. To do this navigate to the IAM page (**Navigation Menu -> IAM & Admin -> IAM -> Permissions -> View By: Principals**). This shows the permissions for the project.\n", + "\n", + "*Note: There is a powerful filter box to limit the permissions shown.*\n", + "\n", + "You should see a row with your account shown in the Principal column. Here you should see the \"Owner\" Role in the Role column. A *role* is a collection of permissions managed by Google or someone else. The **Owner** or the **Storage Admin** role for a project will *allow* *you* to create, access, and delete Buckets *in* the project.\n", + "\n", + "There are three important pieces of information that work together to form the **IAM policy**. The permission (role), the identity (principal or member), and the resource (project)." ] }, { "cell_type": "markdown", - "id": "502f2360", + "id": "3e396a67", "metadata": {}, "source": [ - "```{code-cell} ipython3\n", - ":tags: [mytag]\n", + "### Create Resource Group (Note sure if this is needed)\n", + "\n", + "Alocating any resource in Azure requires a Resource Goup. Resources Groups scope your resources under a common entity for \n", + "resource interaction, IAM, billing (technically subsription but a resource group is under a subscription), ..., etc. \n", + "\n", + "* Navigate to Resource Groups\n", + "* Click \"+ create\" in the upper left \n", + "* Select a name for your Resource Group\n", + "* Leave the rest as default\n", + "* Click Review & Create\n", + "* After passing validation, click create\n" + ] + }, + { + "cell_type": "markdown", + "id": "4a8f2f30", + "metadata": {}, + "source": [ + "### Create storage account\n", + "\n", + "Like all things in Azure you will need an account to manage your service. In this case we need a storage account. To create a storage account, follow these steps.\n", + "\n", + "* Navigate to storage accounts\n", + "* Click \"+ create\" in the upper left \n", + "\n", + "\n", + "\n", + "* Select (or create) a Resource Group\n", + "* Select a name for your Storage account\n", + "* Leave the rest as default\n", + "* Click Review & Create\n", + "\n", + "\n", + "\n", + "* After passing validation, click create\n", + "* The page will indicate when the account has been deployed. Click on \"go to resource\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "4860da70", + "metadata": { + "tags": [] + }, + "source": [ + "### Allocate Azure Cloud Storage\n", + "\n", + "To create a blob storage container in the Azure portal, follow these steps:\n", "\n", - "print(\"A python cell\")\n", - "```" + "* Navigate to your new storage account in the Azure portal.\n", + "* In the left menu for the storage account, scroll to the Data storage section, then select containers.\n", + "* Select the + Container button.\n", + "* Type a name for your new container.\n", + "* Select OK to create the container.\n", + "\n", + "\n" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "c543528f", + "cell_type": "markdown", + "id": "d7bdd31c", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "**Now click on the container**\n", + "* This is where your blob objects can be viewed, uploaded, downloaded, & deleted.\n", + "* Click \"Upload\"\n", + "* In the Upload blob menu, either type in a file name or click on the icon to the right to browse your local filesystem.\n", + "* Choose a file from your local filesystem\n", + "* click upload" + ] + }, + { + "cell_type": "markdown", + "id": "21adbab1", + "metadata": { + "tags": [] + }, + "source": [ + "### Enumerate the Buckets\n", + "\n", + "Now lets find and examine the bucket. To view a bucket we do the following:\n", + "\n", + "* Navigate to Storage Accounts in the Azure portal and select your new storage account.\n", + "* In your storage account select containers\n", + "* Under containers you should see the container you created in the previous step\n", + "* This verifies that a storage container was deployed\n" + ] + }, + { + "cell_type": "markdown", + "id": "9f28062e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "### Delete the Storage\n", + "\n", + "To complete the resource life-cycle we simply delete the storage container created in this lesson. All blobs in the container will also be deleted. This will leave you with a storage account that can be used again for additional stoarge services.\n", + "\n", + "To delete the container:\n", + "\n", + "* In the Azure portal, navigate to the list of containers in your storage account.\n", + "* Select the container to delete.\n", + "* Select the More button (...), and select Delete.\n", + "* Confirm that you want to delete the container.\n", + "\n" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -52,7 +197,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/content/Azure/05_intro_to_cloud_storage_gcp.ipynb b/content/Azure/05_intro_to_cloud_storage_gcp.ipynb new file mode 100644 index 0000000..98030c8 --- /dev/null +++ b/content/Azure/05_intro_to_cloud_storage_gcp.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "677549a8", + "metadata": {}, + "source": [ + "# Introduction to Azure Cloud Storage\n", + "\n", + "Learner Questions\n", + " * How do I store data in the cloud?\n", + "\n", + "Learning Objectives:\n", + " * Navigate the Azure Cloud Storage service and terminology\n", + " * Understand the roles and permissions needed to use Azure Cloud Storage\n", + " * Allocate storage in Azure Cloud Storage account\n", + " * Allocate storage in Azure Cloud Storage\n", + " * De-allocate Azure Cloud Storage storage" + ] + }, + { + "cell_type": "markdown", + "id": "09e26920", + "metadata": {}, + "source": [ + "Drew, after working with a Research Computing and Data (RCD) facilitator, has decided to continue his cloud journey with storage.\n", + "\n", + "One of the most common and economic ways to store data in the cloud is to use object storage.\n" + ] + }, + { + "cell_type": "markdown", + "id": "d46f786b", + "metadata": { + "tags": [] + }, + "source": [ + "## Azure Cloud Storage\n", + "\n", + "To learn more about the Azure blob Storage service we will use the web console to create, explore, and destroy a storage container. The ability to quickly create, explore, and then discard resources in the web-console is a powerful tool to explore a service. After an initial exploration with the web-console, programmatic access using scripts and programming languages should be used.\n", + "\n", + "Unfortunately, the terminology used for object storage differs from one commercial cloud provider to another. Azure uses the terms Storage Container. Data is stored in Objects and Objects are stored in Containers. Objects (data) are stored as a key-value pair, which is similar to a Python dictionary but persistent. Values are stored and retrieved using a unique key and the value can contain any information (more on this later).\n", + "\n", + "We now take Drew through the process of creating a Google Cloud Storage bucket." + ] + }, + { + "cell_type": "markdown", + "id": "89b2cc65", + "metadata": { + "tags": [] + }, + "source": [ + "### Security (Still need to update for Azure)\n", + "\n", + "Everything in the cloud requires permission (authorization). Let's first verify that we have the permissions to create a bucket. A Bucket (a resource) is created within a project and inheres permissions from it.\n", + "\n", + "We are interested in what permissions that *your* account has for *your* project. To do this navigate to the IAM page (**Navigation Menu -> IAM & Admin -> IAM -> Permissions -> View By: Principals**). This shows the permissions for the project.\n", + "\n", + "*Note: There is a powerful filter box to limit the permissions shown.*\n", + "\n", + "You should see a row with your account shown in the Principal column. Here you should see the \"Owner\" Role in the Role column. A *role* is a collection of permissions managed by Google or someone else. The **Owner** or the **Storage Admin** role for a project will *allow* *you* to create, access, and delete Buckets *in* the project.\n", + "\n", + "There are three important pieces of information that work together to form the **IAM policy**. The permission (role), the identity (principal or member), and the resource (project)." + ] + }, + { + "cell_type": "markdown", + "id": "3e396a67", + "metadata": {}, + "source": [ + "### Create Resource Group (Note sure if this is needed)\n", + "\n", + "Alocating any resource in Azure requires a Resource Goup. Resources Groups scope your resources under a common entity for \n", + "resource interaction, IAM, billing (technically subsription but a resource group is under a subscription), ..., etc. \n", + "\n", + "* Navigate to Resource Groups\n", + "* Click \"+ create\" in the upper left \n", + "* Select a name for your Resource Group\n", + "* Leave the rest as default\n", + "* Click Review & Create\n", + "* After passing validation, click create\n" + ] + }, + { + "cell_type": "markdown", + "id": "4a8f2f30", + "metadata": {}, + "source": [ + "### Create storage account\n", + "\n", + "Like all things in Azure you will need an account to manage your service. In this case we need a storage account. To create a storage account, follow these steps.\n", + "\n", + "* Navigate to storage accounts\n", + "* Click \"+ create\" in the upper left \n", + "\n", + "\n", + "\n", + "* Select (or create) a Resource Group\n", + "* Select a name for your Storage account\n", + "* Leave the rest as default\n", + "* Click Review & Create\n", + "\n", + "\n", + "\n", + "* After passing validation, click create\n", + "* The page will indicate when the account has been deployed. Click on \"go to resource\"\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "4860da70", + "metadata": { + "tags": [] + }, + "source": [ + "### Allocate Azure Cloud Storage\n", + "\n", + "To create a blob storage container in the Azure portal, follow these steps:\n", + "\n", + "* Navigate to your new storage account in the Azure portal.\n", + "* In the left menu for the storage account, scroll to the Data storage section, then select containers.\n", + "* Select the + Container button.\n", + "* Type a name for your new container.\n", + "* Select OK to create the container.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d7bdd31c", + "metadata": {}, + "source": [ + "**Now click on the container**\n", + "* This is where your blob objects can be viewed, uploaded, downloaded, & deleted.\n", + "* Click \"Upload\"\n", + "* In the Upload blob menu, either type in a file name or click on the icon to the right to browse your local filesystem.\n", + "* Choose a file from your local filesystem\n", + "* click upload" + ] + }, + { + "cell_type": "markdown", + "id": "21adbab1", + "metadata": { + "tags": [] + }, + "source": [ + "### Enumerate the Buckets\n", + "\n", + "Now lets find and examine the bucket. To view a bucket we do the following:\n", + "\n", + "* Navigate to Storage Accounts in the Azure portal and select your new storage account.\n", + "* In your storage account select containers\n", + "* Under containers you should see the container you created in the previous step\n", + "* This verifies that a storage container was deployed\n" + ] + }, + { + "cell_type": "markdown", + "id": "9f28062e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "### Delete the Storage\n", + "\n", + "To complete the resource life-cycle we simply delete the storage container created in this lesson. All blobs in the container will also be deleted. This will leave you with a storage account that can be used again for additional stoarge services.\n", + "\n", + "To delete the container:\n", + "\n", + "* In the Azure portal, navigate to the list of containers in your storage account.\n", + "* Select the container to delete.\n", + "* Select the More button (...), and select Delete.\n", + "* Confirm that you want to delete the container.\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Azure/05_intro_to_cloud_storage_old.ipynb b/content/Azure/05_intro_to_cloud_storage_old.ipynb new file mode 100644 index 0000000..f3f90ef --- /dev/null +++ b/content/Azure/05_intro_to_cloud_storage_old.ipynb @@ -0,0 +1,60 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "dc57021c", + "metadata": {}, + "source": [ + "# Introduction to Cloud Storage\n", + "\n", + "\n", + "```{admonition} Overview\n", + ":class: tip\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "502f2360", + "metadata": {}, + "source": [ + "```{code-cell} ipython3\n", + ":tags: [mytag]\n", + "\n", + "print(\"A python cell\")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c543528f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Azure/images/01_CLASS_Azure_VM_basic_01.pg b/content/Azure/images/01_CLASS_Azure_VM_basic_01.pg new file mode 100644 index 0000000..0d8a3ed Binary files /dev/null and b/content/Azure/images/01_CLASS_Azure_VM_basic_01.pg differ diff --git a/content/Azure/images/01_CLASS_Azure_VM_basic_01.png b/content/Azure/images/01_CLASS_Azure_VM_basic_01.png new file mode 100644 index 0000000..0d8a3ed Binary files /dev/null and b/content/Azure/images/01_CLASS_Azure_VM_basic_01.png differ diff --git a/content/Azure/images/01_CLASS_Azure_VM_basic_02.png b/content/Azure/images/01_CLASS_Azure_VM_basic_02.png new file mode 100644 index 0000000..9606ff3 Binary files /dev/null and b/content/Azure/images/01_CLASS_Azure_VM_basic_02.png differ diff --git a/content/Azure/images/02_CLASS_Azure_VM_disks.png b/content/Azure/images/02_CLASS_Azure_VM_disks.png new file mode 100644 index 0000000..4ffa485 Binary files /dev/null and b/content/Azure/images/02_CLASS_Azure_VM_disks.png differ diff --git a/content/Azure/images/03_CLASS_Azure_VM_networking.png b/content/Azure/images/03_CLASS_Azure_VM_networking.png new file mode 100644 index 0000000..b88f40c Binary files /dev/null and b/content/Azure/images/03_CLASS_Azure_VM_networking.png differ diff --git a/content/Azure/images/04_CLASS_Azure_VM_verify.png b/content/Azure/images/04_CLASS_Azure_VM_verify.png new file mode 100644 index 0000000..4a192d6 Binary files /dev/null and b/content/Azure/images/04_CLASS_Azure_VM_verify.png differ diff --git a/content/Azure/images/04_azure_create_storage_account.png b/content/Azure/images/04_azure_create_storage_account.png new file mode 100644 index 0000000..7e26861 Binary files /dev/null and b/content/Azure/images/04_azure_create_storage_account.png differ diff --git a/content/Azure/images/04_azure_storage_account_create_name.png b/content/Azure/images/04_azure_storage_account_create_name.png new file mode 100644 index 0000000..507543d Binary files /dev/null and b/content/Azure/images/04_azure_storage_account_create_name.png differ diff --git a/content/Azure/images/04_azure_storage_account_finished_page.png b/content/Azure/images/04_azure_storage_account_finished_page.png new file mode 100644 index 0000000..fffdd18 Binary files /dev/null and b/content/Azure/images/04_azure_storage_account_finished_page.png differ diff --git a/content/Azure/images/04_azure_storage_blob_list.png b/content/Azure/images/04_azure_storage_blob_list.png new file mode 100644 index 0000000..69c8376 Binary files /dev/null and b/content/Azure/images/04_azure_storage_blob_list.png differ diff --git a/content/Azure/images/04_azure_storage_choose_file.png b/content/Azure/images/04_azure_storage_choose_file.png new file mode 100644 index 0000000..e530225 Binary files /dev/null and b/content/Azure/images/04_azure_storage_choose_file.png differ diff --git a/content/Azure/images/04_azure_storage_create_container.png b/content/Azure/images/04_azure_storage_create_container.png new file mode 100644 index 0000000..0be9c08 Binary files /dev/null and b/content/Azure/images/04_azure_storage_create_container.png differ diff --git a/content/Azure/images/Azure_perfSONAR.png b/content/Azure/images/Azure_perfSONAR.png new file mode 100644 index 0000000..c301558 Binary files /dev/null and b/content/Azure/images/Azure_perfSONAR.png differ diff --git a/content/Azure/images/Azure_perfSONAR_container.png b/content/Azure/images/Azure_perfSONAR_container.png new file mode 100644 index 0000000..aaa2005 Binary files /dev/null and b/content/Azure/images/Azure_perfSONAR_container.png differ diff --git a/content/Azure/images/Azure_perfSONAR_initial_network.png b/content/Azure/images/Azure_perfSONAR_initial_network.png new file mode 100644 index 0000000..723bebc Binary files /dev/null and b/content/Azure/images/Azure_perfSONAR_initial_network.png differ diff --git a/content/Azure/images/acceleratescience.svg b/content/Azure/images/acceleratescience.svg new file mode 100644 index 0000000..6985786 --- /dev/null +++ b/content/Azure/images/acceleratescience.svg @@ -0,0 +1 @@ +WILL CLOUD COMPUTING HELP ACCELERATE MYSCIENTIFIC DISCOVERY?Local computeresources taketoo longPersonalcomputersrun of memory orCPUNeed scalablecomputingComputational ProblemCommondatasets are hosted onthe cloudCollaborators arealready using thecloudInterestedinreproduciblescienceExternal motivationDo youalready havecloudcredits?Do you useproprietary softwarethat requires a operatingsystem?Whichprovider doyourcollaboratorsuse?choosing a cloud providerAre theredata securityand privacyconcerns?Do you haveresources toadapt to a cloud-native if necessary?Do you needto make dataavailable for'x' amount ofyears?further assessmentIn your assessment of whether or not your research will from using the cloud, you need to be aware that there is an associated learning curve and a set of bestpractices that you are encouraged to follow! \ No newline at end of file diff --git a/content/Azure/images/azure_intro_console.jpg b/content/Azure/images/azure_intro_console.jpg new file mode 100644 index 0000000..c3cd325 Binary files /dev/null and b/content/Azure/images/azure_intro_console.jpg differ diff --git a/content/Azure/images/azure_storage_account.png b/content/Azure/images/azure_storage_account.png new file mode 100644 index 0000000..133b409 Binary files /dev/null and b/content/Azure/images/azure_storage_account.png differ diff --git a/content/Azure/images/classprogram.svg b/content/Azure/images/classprogram.svg new file mode 100644 index 0000000..36bba0a --- /dev/null +++ b/content/Azure/images/classprogram.svg @@ -0,0 +1 @@ +CLASS CORECLASS ESSENTIALSCLASS INTERMEDIATECLASS ADVANCEDUnderstanding the why and when of using the cloud forresearch computingUnderstanding the howsof using the cloud for research computingUnderstanding the hows and whens and whats of using the cloud for research computingPutting together all the plumbing to help researchers arrive  at a solution!THE INTERNET2 CLASS PROGRAMHELPING ACCELERATE SCIENTIFICDISCOVERY ON THE CLOUDAN END TO END FRAMEWORK FOR CLOUD ADOPTION!- Cloud neutral solutions- Hands-on, experiential learning- Build a community of practice- Developed by researchers for researchers! \ No newline at end of file diff --git a/content/Azure/images/cloudcomponents.svg b/content/Azure/images/cloudcomponents.svg new file mode 100644 index 0000000..ec8d99d --- /dev/null +++ b/content/Azure/images/cloudcomponents.svg @@ -0,0 +1 @@ +Compute Virtual Machines or "instances" that come with a pre-determined compute power, memoryand operating system. These compute systems canrange from small to powerful.storageStorage options range from "hot" (e.g.imagine yourlocal hard drive) to "cold" i.e. archival. Costsare often decreasing.Storage and compute often gohand in hand for data analysis. data Data on the cloud can be stored in databases ordata warehouses as a service and these often comewith options for security, automated backup anddisaster recovery. Applications& servicesData on the cloud can be stored in databases ordata warehouses as a service and these often comewith options for security, automated backup anddisaster recovery. networkNetworks allow users to connect to their computeinstances, develop web services and utilize cloudservices in a and secure way. \ No newline at end of file diff --git a/content/Azure/images/frustrated_cloud.svg b/content/Azure/images/frustrated_cloud.svg new file mode 100644 index 0000000..3638942 --- /dev/null +++ b/content/Azure/images/frustrated_cloud.svg @@ -0,0 +1 @@ +??? \ No newline at end of file diff --git a/content/Azure/images/is_the_cloud_right.ipynb b/content/Azure/images/is_the_cloud_right.ipynb new file mode 100644 index 0000000..60aefce --- /dev/null +++ b/content/Azure/images/is_the_cloud_right.ipynb @@ -0,0 +1,72 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1b6fcbc0", + "metadata": {}, + "source": [ + "# Is the Cloud Right for Me?\n", + "\n", + "Now that you have an idea of what cloud computing is, the question that is most pertinent to researchers is whether or not you ***should*** move your work to the cloud. The following chart outlines some fundamental questions to ask in your assessment: \n", + "\n", + "
\n", + "\n", + "Many researchers move to the commercial cloud simply because their local compute resources (local HPC clusters, or departmental clusters) are insufficient to deal with the volume of data and type of computation. With the cloud, there is no wait time to obtain the computing resources you need. With sufficient funds, you may even be able to obtain a near infinite number of CPUs, RAM and GPUs and compute can start as soon as you want it!\n", + "\n", + "```{note}\n", + "Scalable computing is the ability to obtain more computers(horizontal scaling) and/or to obtain more powerful computers(vertical scaling)\n", + "```\n", + "\n", + "With cloud computing, you do not need to purchase or maintain and update hardware, operating systems and a slew of dependencies. For the most part, providers maintain their hardware. Further, cloud providers just keep making new services to keep up with demands the rapidly expanding community building cloud-native workflows. Cloud providers are constantly evolving their tools and resources with a focus on storage, reliability, and security. \n", + "\n", + "\n", + "Other factors that will play in your decision to move to the cloud include knowing where common large datasets are hosted. The core idea in working on the cloud involves a paradigm shift: researchers should no longer bring their data to the compute (i.e. downloading data) but should instead bring their compute to the data! If you think about it, why spend hours on end to download data and find a place to store it when you can work directly with the data?\n", + "\n", + "\n", + "If your collaborators are already working in the cloud i.e. hosting data on the cloud or building cloud-based workflows, it would also make sense for you to bring your work to the cloud. Go here for more on Open Science and Collaboration.\n", + "\n", + "\n", + "## Why *not* to migrate to the cloud?\n", + "\n", + "If you have already identified an adequate-to-your-needs computing environment like XSEDE or you already have the access to the resources you need, it just doesn't make sense to migrate to the cloud!\n", + "\n", + "Using the public cloud requires a learning curve. Sometimes you may just simply not have the time or resources to do this important step. The CLASS program can help you overcome some of these hurdles, but you may prefer to spend your time learning other things or exploring other avenues and it just doesn't seem worth it to invest your time in learning about the cloud. \n", + "\n", + "If you operate your computer(s) at a very high duty cycle i.e. you computer is constantly computing something and you have massive datasets that you work with frequently that is stored on-premise, the cloud may not be a very cost-effective option. \n", + "\n", + "Finally, if there is too much of an administrative drag preventing you from using the cloud (e.g. regulations and compliance such as HIPAA or FERPA), you may want to reconsider staying with your local infrastructure. \n", + "\n", + "In the next chapter, we will discuss the million dollar question: \"But which cloud provider should I choose?!\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ddad00f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Azure/images/readme.md b/content/Azure/images/readme.md new file mode 100644 index 0000000..eca3e78 --- /dev/null +++ b/content/Azure/images/readme.md @@ -0,0 +1 @@ +This dir hold the images for the Azure essentials diff --git a/content/Azure/intro_to_Azure_Essentials.ipynb b/content/Azure/intro_to_Azure_Essentials.ipynb index 45acd85..6d14a5b 100644 --- a/content/Azure/intro_to_Azure_Essentials.ipynb +++ b/content/Azure/intro_to_Azure_Essentials.ipynb @@ -10,7 +10,7 @@ "The modules in this lesson are: \n", "\n", "1. [Introduction to the Azure Cloud Portal](./01_intro_to_cloud_console)\n", - "2. [Introduction to Cloud Compute (Azure Virtual Machines)](./02_intro_to_compute_part1)\n", + "2. [Introduction to Cloud Compute (Azure Virtual Machines)](./02_intro_to_compute)\n", "3. [Introduction to the Azure CLI](./04_intro_to_cli)\n", "4. [Introduction to Cloud Storage (Blob Storage)](./05_intro_to_cloud_storage)\n", "5. [Running Analysis on the Cloud](./06_running_analysis)\n", @@ -21,7 +21,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -35,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/content/_toc.yml b/content/_toc.yml index 38a8fcb..2fc584c 100644 --- a/content/_toc.yml +++ b/content/_toc.yml @@ -25,8 +25,7 @@ parts: - file: Azure/intro_to_Azure_Essentials sections: - file: Azure/01_intro_to_cloud_console - - file: Azure/02_intro_to_compute_part1 - - file: Azure/03_intro_to_compute_part2 + - file: Azure/02_intro_to_compute - file: Azure/04_intro_to_cli - file: Azure/05_intro_to_cloud_storage - file: Azure/06_running_analysis