terraform import existing azure resources - terraform

I want to create subnet in my existing vnet which is present in azure. I found a command to import resource terraform import . but how do i use the resource details example: vnet resource group in the code.
resource "azurerm_virtual_network" "vnet" {
name = var.vnet_name
address_space = var.vnet_address_space
resource_group_name = var.subscriptionrg_name
location }
I ran the command and found that the dns server which we earlier present are now deleted. Does that means i have to define everything in my code and import. Or is there any other way to use existing resources.

First just define an empty block like this:
resource "azurerm_virtual_network" "vnet" {
}
Then, run terraform import command to import existing resource into your Terraform state. Afterward, execute the terraform show to print out the TF state into the screen. Finally, you can copy the content of printed "azurerm_virtual_network" "vnet" block into the actual block in .tf file.

Related

Azure : ResourceNotFound from az cli but resource exist in Portal

Facing this "ResourceNotFound" issue (JPG-1), but I can see the logicapp resource in Azure portal(JPG-2)
(ResourceNotFound) The Resource 'Microsoft.Web/sites/us-analytics-dev-dsvm-auto-deletion-logicapp-eastus2' under resource group 'us-analytics-dev-dsvm-auto-deletion-eastus2' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Code: ResourceNotFound
Message: The Resource 'Microsoft.Web/sites/us-analytics-dev-dsvm-auto-deletion-logicapp-eastus2' under resource group 'us-analytics-dev-dsvm-auto-deletion-eastus2' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Note :
Already configured (us-analytics-dev) as default subscription in
cli.
Logicapp resource created through Terraform (Code below : code-1)
Code-1 :(edited)
resource "azurerm_resource_group" "dsvm_auto_deletion_resource_group" {
name = "us-analytics-dev-dsvm-auto-deletion-logicapp-eastus2"
location = "East US 2"
}
resource "azurerm_logic_app_workflow" "dsvm_auto_deletion_logicapp" {
name = "us-analytics-dev-dsvm-auto-deletion-logicapp-eastus2"
location = "East US 2"
resource_group_name = "us-analytics-dev-dsvm-auto-deletion-eastus2"
}
First note I noticed your azurerm_resource_group resource name is the same as your azurerm_logic_app_workflow resource name but I think it is just a typo :)
I tried the same command as you and it didn't work for me, it kept returning empty list, I think something is wrong with the az logicapp command.
After some research I found that there is a package in preview that can be used instead which is logic workflow.
Just past in the following command and install the package and it should work, so for your case it would be something like :
az logic workflow show -g us-analytics-dev-dsvm-auto-deletion-eastus2 --name us-analytics-dev-dsvm-auto-deletion-logicapp-eastus2

How to manage existing resource group in azure with terraform

I am having my azure infrastructure created using terraform.
Now I want to add few resources to existing resource group.
When I did same it is giving error like resources group is already exists.
How can I refer existing resource and no changes to existing resources and tfstate file.
There is a couple of ways to refer existing resource in Azure without making changes.
Use Terraform import
Use Terraform data resource
Terraform import example:
resource "azurerm_resource_group" "example" {
# ...instance configuration...
name = "MyResourceGroup"
}
Run command: terraform import azurerm_resource_group.example \ /subscriptions/MySubscriptionNumber/resourceGroups/MyResourceGroup
Terraform data resource example:
data "azurerm_resource_group" "example" {
name = "MyResourceGroup"
}

Reference two Azure subscriptions within the same terraform module block?

I am currently using terraform to deploy azure resources and would like to point to a DDOS protection plan in a different subscription than the vnet is deployed to. The code is as follows:
resource "azurerm_virtual_network" "example" {
for_each = var.virtual_networks
name = each.value.vnet_name
location = each.value.vnet_location
resource_group_name = data.azurerm_resource_group.this[each.value.resource_group_key].name
address_space = each.value.vnet_address_space
tags = each.value.vnet_tags
ddos_protection_plan {
id = each.value.ddos_protection_plan_id
enable = true
}
}
I have referenced other subscriptions using azure provider for resources that the entire block will exist in a new subscription. https://samcogan.com/deploying-to-multiple-azure-subscriptions-with-terraform/
But running into trouble referencing another subscription for a (sub?)resource within a block.
TLDR: want to deploy VNET in one sub, reference ddos protection plan in another. is it possible?

Deploy azure resource in prebuilt resource group using terraform

I am having one resource group in my azure subscription name "demoterraform"
Now I would like to create one windows VM in this resource group, So I don't deploy new VM in existing resource group.
Use the azurerm_resource_group data source.
data "azurerm_resource_group" "demo" {
name = "demoterraform"
}
in the rest of the code you can refer to it with a similar expression data.azurerm_resource_group.demo.id.

Creating a Azure Windows VM through Terraform

In Azure, I'm trying to create a Windows VM using Terraform. I have done this through Powershell previously using Template.json file. Now I have to do with terraform, which I'm completely new to. So I have searched for some Sample scripts which creates VM in Azure and found this.
In this link, there is a sample Terraform script to spin a Linux VM. But I need to spin a windows VM from an Image. Where should I give the Image details. My complete requirement is:
Create a Windows VM from an Image (have resource Id)
I already have Resource group, Virtual network, Subnet created. I just need to pass those values and create them.
We have already defined the Subnet address prefix, Vnet address space from the portal itself. So do I have to give again in the script or can I skip it.
The business requirement is that no VMs should have public IP and DNS name, So if I remove "# Create public IPs" section, will that not create public IP?
The script for creating a Linux machine is here, which I'm taking it as reference.
Below is an example of how to use data to use already existing resources in terraform, also there is a code block to create a windows VM. You will need to get the existing VNET and create a NIC
Use the data directive to get the VNET azurerm_virtual_network, you can see the syntax below for the resource group. You will need to add the resource group and possibly location into this block.
Create a azurerm_network_interface resource using the VNET ID
Add the network interface ID to the VM (network_interface_ids = [])
Example TF Code to Create and load balance VMs
variable "subscription_id" {}
variable "client_id" {}
variable "client_secret" {}
variable "tenant_id" {}
provider "azurerm" {
tenant_id = "${var.tenant_id}"
subscription_id = "${var.subscription_id}"
client_id = "${var.client_id}"
client_secret = "${var.client_secret}"
}
data "azurerm_resource_group" "resource_group" {
name = "learning-tf-web-rg"
}
resource "azurerm_virtual_machine" "web_server" {
name = "server"
location = "westus2"
resource_group_name = "${data.azurerm_resource_group.resource_group.name}"
network_interface_ids = []
vm_size = "Standard_B2s"
storage_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2016-Datacenter-Server-Core-smalldisk"
version = "latest"
}
storage_os_disk {
name = "server-os"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}
os_profile {
computer_name = "server"
admin_username = "server"
admin_password = "Passw0rd1234"
}
os_profile_windows_config {
}
}
From Terraform's perspective, a Windows VM is really quite similar to a Linux VM. The #1 difference in my opinion is that the Windows VM requires a os_profile_windows_config attribute, while the Linux VM needs os_profile_linux_config.
The TF code you found on the Microsoft site is a fine start. Additionally, you may look in the Terraform Registry. For example, here's a module for a Linux VM.
I strongly recommend reading through all of the options in the VM resource. I know it's a lot, but you should understand what choices you have.
Lastly, there's no substitute for writing some code and testing it. If you do something wrong, either Terraform and/or the Azure API will tell you, and if it's unclear, a web search will pop up an answer or a pointer in the right direction.

Resources