There is a problem when you want to call an API hosted in an Azure API management (APIm) instance if it is a consumption SKU.
Getting around it is easy.
Lets say you need to call a service you have made. That service has to be hosted behind an Azure API management instance. There might be many reasons, but the main one is that the service need to be protected using APIm.
You create a new Logic App and you want use the built in connector for APIm.
You find the consumption instance and select it. The API you created shows up in the Logic App.
In my case the API is simply calling a dummy Logic App.
You fill what you need in order to connect to the API. In my case I only need a SubscriptionID.
You click save and you will get this error:
Failed to save Logic App <your name here>. The API Management service hosting the API <pointing to your APIm instance> could not be found
I think this is due to how the connector works in Logic Apps. The connector gets its configuration in a different way than how it saves that configuration. An APIm consumption SKU is different from a regular one. It does not have any external IP-address, since it is a shared service. Several consumption instances are probably hosted on the same servers which makes me think that is why the Logic App cannot find it when it saves.
I would consider this a bug, rather than not supported.
You have to work around the problem and use the ever useful HTTP action. You can always call the API using its DNS name (or address of you prefer).
We got a
very strange error message when calling an on-prem service using the ServiceBus
Relay connected to an Azure Function.
The scenario was setup according to the official documentation. The relay can be used as an alternative to the OnPremise Data gateway in scenarios where you don’t need the adapter connectivity. You have a limited subset or can do your own coding if you need something specific.
Executed 'Send' (Failed, Id=GUID_HERE) An attempt was made to access a socket in a way forbidden by its access permissions.
are some security issues.
One of these
errors makes you visit Mr Google. He turned up a lot of answers, all related to
a local firewall and people having built their own socket services. None of the
answers applied to us.
regenerating keys and re-registering the connection but that did not work.
developer had provided us with an IP-address as a host address. When we did a
DNS lookup, we found the name of the server. We simply updated the host address
in the relay connection, and it worked!
Azure Relay, don’t use the service IP-address.
When exposing an API in APIM you typically put it in a Product. You then create a subscription for that product, making it possible for consumers to use your Product, and for you to keep track of that usage.Sometimes, you might need to use a custom key, and not the key assigned by API manager.
You know that you typically do not need to generate keys for a subscription, keys are generated automatically when you create the subscription.
If you choose to, you can view the keys by clicking the three dots at the end of the row.
The key usually looks something like “1f9400c493e4403a807c3002dfc5cbb9”, and if you want to you can regenerate the primary or secondary keys.
What if you needed to set that key instead? There might be reasons for it. For me, I needed to make sure the key had the same value between two environments (don’t ask).
In order to assign keys, you need to use the APIM Management API (still the worst name since ever), but using that, it is very easy actually.
Enable the Management API
In order how to enable the API and learn how to generate access tokens, visit this page. In the end you should have an access token that looks something like
This can be used as an authentication header in Postman to call the APIs. Note that the access token key will only work if you target the specific management API. More information below.
Another thing to know is that the Management API is not supported for the consumption model of APIm.
Find the right API to use
There are a lot of APIs connected to APIm. The complete list can be found here. The one we are looking for is called Subscription Update.
The subscription update API
one is a little special as it uses the http verb PATCH. This means that only fields sent in the body will be updated. The brother of this verb is PUT that usually wants an entire data object and updates everything, always.
The easiest way to use this is by using the access token generated above. This means that the URI used in the documentation is incorrect. If you want to use that API you need to access it using a Bearer Token. The path pointed out by the documentation is:
The one you need to use (the original access model) is:
I used postman to update the keys. You can actually do this from the API documentation portal, by clicking the “Try it” button in the documentation page and signing in, but I used postman and the original access model. I setup postman using a environment variables and that resulted in this URL:
Relating to my other post on Get unix epoch from DateTime in Logic Apps, there is a much simpler way to calculate UtcNow from a Unix timestamp. There is even no real math involved. All you do is make use of the built in function addToTime.
Here is the expression: addToTime('1970-01-01', 1508852960,'second')
So if you receive a JSON body with a tag called UnixTimeStamp, containing the Unix timestamp it will look like addToTime('1970-01-01', int(triggerBody()?['UnixTimeStamp']),'second')
This was posted as a question on the forums a while back. I thought this was a very interesting question as dates, math and the combination of the two intrigues me.
There is a very easy way to achieve this using c# and Azure Functions:
But I wanted to solve it using only Logic Apps functionality or at least see if it was possible.
How to get the value (math)
To make it work we need to use the functionality called ticks. Ticks are part the Windows OS and is a large number that means the number of 100 nanoseconds that has passed since Jan 1st year 0 UTC (western Christian calendar). Unix time is the same but is the number of seconds that has passed since Jan 1st 1970 UTC. These constants in time, and their relation to each other, can be used to calculate the value we need.
One second is 10 000 000 ticks.
TTN is the number of ticks from start until now. TT1970 is the number of ticks that passed from start until 1970. This constant is 621355968000000000.
The calculation looks like (TTN-TT1970) / 10 000 000.
Calculating the Unix value for “Now” (October 24th 2017 13:28) looks like