Search code examples
azureazure-resource-managerazure-bicep

How to reference a parent resource name to a resource inside a module using bicep


How to reference a parent resource name to a resource inside a module using Microsoft bicep code.

Below main.bicep file code is working.

# main.bicep

param apimName string = 'devApim'
param apimLocation string = 'eastus'
param publisherName string = 'danny'
param publisherEmail string = 'danny@gmail.com'

param api_display_name string = 'Test Consumer API'
param api_description         = 'Test API description'
param api_versioningScheme    = 'Segment'

resource devApim_resource 'Microsoft.ApiManagement/service@2021-01-01-preview' = {
  name: apimName
  location: apimLocation
  sku: {
    name: 'Developer'
    capacity: 1
  }
  properties: {
    publisherEmail: publisherEmail
    publisherName: publisherName
  }
}


resource test_api_vs_v1 'Microsoft.ApiManagement/service/apiVersionSets@2021-01-01-preview' = {
// Below reference to first/parent resource is working fine as it's in the same bicep file.
  parent: devApim_resource
  name: 'test_api_vs_name'
  properties: {
    displayName: api_display_name
    description: api_description
    versioningScheme: api_versioningScheme
  }
}

I want to modify this main.bicep second resource(VersionSet resource) into a module like the below files.

# main.bicep

param apimName string = 'devApim'
param apimLocation string = 'eastus'
param publisherName string = 'danny'
param publisherEmail string = 'danny@gmail.com'

param api_display_name string = 'Test Consumer API'
param api_description         = 'Test API description'
param api_versioningScheme    = 'Segment'


resource devApim_resource 'Microsoft.ApiManagement/service@2021-01-01-preview' = {
  name: apimName
  location: apimLocation
  sku: {
    name: 'Developer'
    capacity: 1
  }
  properties: {
    publisherEmail: publisherEmail
    publisherName: publisherName
  }
}

module test_api_module 'test-api.bicep' = {
  name: 'test_api'
  params: {
    api_display_name: api_display_name
    api_description: api_description
    api_versioningScheme: api_versioningScheme
     
  }
  
}

# test-api.bicep file

param api_display_name string 
param api_description  string
param api_versioningScheme string 

resource test_api_vs_v1 'Microsoft.ApiManagement/service/apiVersionSets@2021-01-01-preview' = {
  // Below reference to first/parent resource is not working.
  //parent: devApim_resource 

  name: 'test_api_vs_name'
  properties: {
    displayName: api_display_name
    description: api_description
    versioningScheme: api_versioningScheme
  }
}

Now how do I reference/pass parent resource 'devApim_resource' (first resource) into module resource test_api_vs_v1 (second resource) as using parent: devApim_resource is not working in test-api.bicep module file

I'm very new to bicep coding.


Solution

  • Found this documentation for more detail:

    You need to add the parent resource name as a parameter in your child module:

    param apimName string
    

    Then you can reference an existing resource like this:

    // Reference to the parent resource
    resource devApim_resource 'Microsoft.ApiManagement/service@2021-01-01-preview' existing = {
      name: apimName
    }
    
    resource test_api_vs_v1 'Microsoft.ApiManagement/service/apiVersionSets@2021-01-01-preview' = {
      parent: devApim_resource 
      name: 'test_api_vs_name'
      ...
    }
    

    Then in your main.bicep, you can call you the chil module like that:

    module test_api_module 'test-api.bicep' = {
      name: 'test_api'
      params: {
        apimName: devApim_resource.name
        api_display_name: api_display_name
        api_description: api_description
        api_versioningScheme: api_versioningScheme     
      }  
    }