<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Massimo Bonanni</title>
    <description>The latest articles on DEV Community by Massimo Bonanni (@massimobonanni).</description>
    <link>https://dev.to/massimobonanni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F142623%2Fc3a24a75-0621-46fc-ab78-5d35971029d3.jpg</url>
      <title>DEV Community: Massimo Bonanni</title>
      <link>https://dev.to/massimobonanni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/massimobonanni"/>
    <language>en</language>
    <item>
      <title>Book Review: Azure or Developers (third edition)</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Mon, 02 Mar 2026 09:30:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-azure-or-developers-third-edition-2d85</link>
      <guid>https://dev.to/massimobonanni/book-review-azure-or-developers-third-edition-2d85</guid>
      <description>&lt;p&gt;&lt;strong&gt;Azure for Developers – Third Edition&lt;/strong&gt; by Kamil Mrzygłód is a mature, well-structured guide that targets a very real need in the Azure ecosystem: helping developers build, integrate, and operate modern cloud applications without turning them into full-time infrastructure specialists .&lt;/p&gt;

&lt;p&gt;Unlike many Azure books that either remain too high-level or dive deeply into isolated services, this book succeeds in maintaining a &lt;strong&gt;developer-centric perspective&lt;/strong&gt; across a wide range of Azure application services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6idqj1cpdiz1zjynub9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6idqj1cpdiz1zjynub9l.png" alt=" " width="800" height="985"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall Assessment
&lt;/h3&gt;

&lt;p&gt;This third edition reflects both the &lt;strong&gt;evolution of Azure&lt;/strong&gt; and the &lt;strong&gt;author’s practical experience&lt;/strong&gt;. The content feels current, intentional, and aligned with how Azure is actually used in real-world projects today—especially in environments where developers are expected to care about deployment, security, and operational concerns alongside application code.&lt;/p&gt;

&lt;p&gt;The book is not trying to be an encyclopedic reference. Instead, it acts as a &lt;strong&gt;guided learning path&lt;/strong&gt;, which is a conscious and effective design choice.&lt;/p&gt;




&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Clear developer-oriented scope
&lt;/h4&gt;

&lt;p&gt;The book consistently focuses on &lt;strong&gt;application-oriented Azure services&lt;/strong&gt;: App Service, Azure Functions, Logic Apps, Container Apps, Storage, messaging services, and monitoring. This clarity makes it especially valuable for developers who want to stay productive without being overwhelmed by infrastructure-heavy topics.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Strong CLI and automation mindset
&lt;/h4&gt;

&lt;p&gt;A notable strength is the emphasis on &lt;strong&gt;Azure CLI, Azure PowerShell, and GitHub Actions&lt;/strong&gt;. This reinforces modern Azure practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeatability over portal-driven workflows&lt;/li&gt;
&lt;li&gt;Automation-first thinking&lt;/li&gt;
&lt;li&gt;Easy transition from local development to CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach makes the book particularly suitable for teams adopting DevOps practices incrementally.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Practical progression and learning flow
&lt;/h4&gt;

&lt;p&gt;Chapters are logically ordered, starting from environment setup and identity fundamentals, moving through hosting models, serverless and containers, and finally addressing AI, ML, and DevOps automation. Each section builds on previous knowledge without unnecessary repetition.&lt;/p&gt;

&lt;p&gt;The frequent inclusion of &lt;strong&gt;use cases and design considerations&lt;/strong&gt; helps readers understand &lt;em&gt;why&lt;/em&gt; a service should be chosen—not just &lt;em&gt;how&lt;/em&gt; to configure it.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Modern Azure coverage
&lt;/h4&gt;

&lt;p&gt;The inclusion of &lt;strong&gt;Azure OpenAI Service&lt;/strong&gt;, &lt;strong&gt;Azure Machine Learning&lt;/strong&gt;, and &lt;strong&gt;GitHub Actions&lt;/strong&gt; is handled pragmatically. These chapters avoid hype and instead focus on realistic integration scenarios, which is refreshing in a rapidly evolving AI landscape.&lt;/p&gt;




&lt;h3&gt;
  
  
  Areas for Improvement (Constructive Feedback)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Architecture-level context could be expanded
&lt;/h4&gt;

&lt;p&gt;While individual services are well explained, readers with a solutions-architecture mindset may occasionally wish for &lt;strong&gt;more cross-service architectural diagrams or decision matrices&lt;/strong&gt;, especially when comparing overlapping services (e.g., Logic Apps vs Durable Functions, Container Apps vs App Service).&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Cost and governance considerations are implicit rather than explicit
&lt;/h4&gt;

&lt;p&gt;Cost management, naming conventions, and governance practices are present indirectly, but a &lt;strong&gt;dedicated section or recurring callouts&lt;/strong&gt; could further strengthen the enterprise-readiness of the material.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Advanced enterprise scenarios
&lt;/h4&gt;

&lt;p&gt;The book intentionally avoids deep dives into topics such as large-scale multi-tenant architectures, complex networking, or advanced security patterns. This is not a flaw, but readers should be aware that it is &lt;strong&gt;not aimed at senior cloud architects designing global platforms&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Audience Fit
&lt;/h3&gt;

&lt;p&gt;This book is particularly well suited for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers building or modernizing applications on Azure&lt;/li&gt;
&lt;li&gt;Teams transitioning from local or on-premises development to the cloud&lt;/li&gt;
&lt;li&gt;Trainers and educators looking for structured, hands-on material&lt;/li&gt;
&lt;li&gt;Developers who want to understand &lt;em&gt;how Azure services fit together&lt;/em&gt;, not just how to deploy them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Readers expecting deep coverage of low-level infrastructure or exhaustive service catalogs should consider complementary resources.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Verdict
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Azure for Developers (Third Edition)&lt;/strong&gt; is a &lt;strong&gt;strong, reliable, and modern guide&lt;/strong&gt; for developers working with Azure. It balances theory and practice well, promotes healthy cloud habits, and reflects real-world usage rather than idealized scenarios.&lt;/p&gt;

&lt;p&gt;Its greatest strength lies in its &lt;strong&gt;pragmatic clarity&lt;/strong&gt;: it teaches readers how to be effective Azure developers today, without unnecessary complexity or outdated patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definitive outcome:&lt;/strong&gt;&lt;br&gt;
This is a &lt;em&gt;good book&lt;/em&gt;—and a trustworthy one. It deserves a place on the shelf of any developer serious about building applications on Azure in 2025 and beyond.&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>books</category>
      <category>azure</category>
      <category>development</category>
    </item>
    <item>
      <title>Book Review: Microsoft Copilot in Azure: AI-powered cloud automation and optimization</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 24 Sep 2025 09:00:01 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-microsoft-copilot-in-azure-ai-powered-cloud-automation-and-optimization-3613</link>
      <guid>https://dev.to/massimobonanni/book-review-microsoft-copilot-in-azure-ai-powered-cloud-automation-and-optimization-3613</guid>
      <description>&lt;p&gt;&lt;strong&gt;Microsoft Copilot in Azure&lt;/strong&gt; by David Rendón and Steve Miles is a comprehensive and hands-on guide to one of the most exciting evolutions in cloud computing: bringing generative AI directly into the heart of Azure operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41odilcmhpxs1mi6xdim.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41odilcmhpxs1mi6xdim.jpg" alt="Book Cover" width="549" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The book begins by laying a clear foundation of how large language models (LLMs) and Microsoft’s Copilot architecture fit into modern cloud environments. From there, it quickly moves into practical, real-world use cases. Readers learn how to set up and configure Copilot in the Azure portal, manage access securely with RBAC, and deploy infrastructure ranging from virtual machines to Azure Kubernetes Service (AKS) clusters and App Services—all through Copilot’s natural language interface.&lt;/p&gt;

&lt;p&gt;What makes this book stand out is its breadth of coverage. It doesn’t stop at deployments. The authors dive into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating Copilot with Azure Functions, Blob Storage, and SQL databases&lt;/li&gt;
&lt;li&gt;Real-time monitoring, diagnostics, and troubleshooting with AI-powered insights&lt;/li&gt;
&lt;li&gt;Cost optimization strategies that use Copilot’s recommendations&lt;/li&gt;
&lt;li&gt;Security posture management with Microsoft Defender for Cloud and compliance policies&lt;/li&gt;
&lt;li&gt;Advanced prompt engineering techniques to maximize accuracy and results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The style is approachable yet precise, with step-by-step examples and scenarios that cloud architects, DevOps engineers, and administrators can immediately apply to their environments. By aligning Copilot’s capabilities with the Azure Well-Architected Framework, the book ensures readers not only understand the “how,” but also the “why” behind AI-driven cloud practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why you’ll want this book:&lt;/strong&gt; If you’re responsible for deploying, securing, or optimizing workloads in Azure, this guide shows how Copilot can save time, improve reliability, and reduce costs—without sacrificing governance or security.&lt;/p&gt;

&lt;p&gt;In short, Microsoft Copilot in Azure is more than just a manual. It’s a roadmap for embracing AI as a true collaborator in Azure. Highly recommended for professionals who want to stay ahead of the curve in the AI-driven cloud era.&lt;/p&gt;

&lt;p&gt;In conclusion, I would like to highlight a series of points for and against the book.&lt;/p&gt;

&lt;p&gt;✅ Good Points&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comprehensive coverage: From fundamentals of LLMs and Copilot architecture to advanced use cases like scaling, troubleshooting, and cost optimization.&lt;/li&gt;
&lt;li&gt;Hands-on approach: Includes step-by-step examples, scenarios, and code snippets that can be applied directly in real Azure environments.&lt;/li&gt;
&lt;li&gt;Wide scope across Azure services: Covers VMs, AKS, App Service, Functions, SQL/MySQL, storage, monitoring, and security.&lt;/li&gt;
&lt;li&gt;Strong focus on governance and security: Explains how Copilot respects RBAC, integrates with Defender for Cloud, and aligns with compliance policies.&lt;/li&gt;
&lt;li&gt;Clear explanations of AI concepts: Demystifies prompts, tokens, completions, and how LLMs integrate with Azure.&lt;/li&gt;
&lt;li&gt;Future-looking perspective: Discusses potential enhancements, multi-cloud adoption, and agentic solutions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Possible Limitations&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not for complete beginners: Requires prior knowledge of Azure fundamentals (VMs, App Service, networking, RBAC, etc.).&lt;/li&gt;
&lt;li&gt;Focus is on Copilot: Doesn’t aim to be a general-purpose Azure manual, so readers new to the platform may need additional resources.&lt;/li&gt;
&lt;li&gt;AI-generated code caveats: The book itself notes that Copilot’s outputs may need manual review or adjustment to be production-ready.&lt;/li&gt;
&lt;li&gt;Fast-evolving field: As Azure Copilot and AI services evolve rapidly, some details may change over time.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>microsoft</category>
      <category>githubcopilot</category>
      <category>azure</category>
      <category>ai</category>
    </item>
    <item>
      <title>Book Review: Cloud Solution Architect's Career Master Plan</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Mon, 25 Mar 2024 08:00:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-cloud-solution-architects-career-master-plan-1gfo</link>
      <guid>https://dev.to/massimobonanni/book-review-cloud-solution-architects-career-master-plan-1gfo</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lvhjqmxiy7ps44c5460.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lvhjqmxiy7ps44c5460.png" alt="The book cover"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As someone who's been in the tech industry for a while, I was curious to see what 'Cloud Solution Architect's Career Master Plan' had to offer, and I must say, it doesn't disappoint. The author has done a commendable job in creating a resource that is not just informative but also practical for individuals looking to forge a career in cloud solution architecture.  &lt;/p&gt;

&lt;p&gt;What stands out is the book's structured approach, starting with the fundamentals in Chapter 1, where it lays down the responsibilities of a Cloud Solution Architect (CSA). It's particularly insightful as it goes beyond the basics, delving into core concepts and the pros and cons of the role.  &lt;/p&gt;

&lt;p&gt;The subsequent chapters are equally valuable, with Chapter 2 discussing the various CSA roles and Chapter 3 advising on educational paths. For those like me, who value hands-on experience, Chapter 4's focus on gaining real-world experience is golden. It's refreshing to see a technical book emphasize the importance of practical knowledge.  &lt;/p&gt;

&lt;p&gt;Chapter 5's strategic approach to seizing opportunities and Chapter 6's guide on the job hunt process, including optimizing online presence, are timely in today's digital age. Chapter 7 provides an in-depth look at the interview process, which is a great tool for preparation.  &lt;/p&gt;

&lt;p&gt;Lastly, the book's call to 'give back' in Chapter 8 resonates with me personally, as it aligns with the ethos of contributing to the community and the broader tech society.  &lt;/p&gt;

&lt;p&gt;The text conventions used, such as code in text and bold for new terms, make the content accessible and the tips provided throughout are like having a mentor guiding you through the pages.  &lt;/p&gt;

&lt;p&gt;I appreciate that the author has made example code files available for download, which complements the theoretical knowledge with practical examples.  &lt;/p&gt;

&lt;p&gt;In conclusion, 'Cloud Solution Architect's Career Master Plan' is a thorough and insightful read for anyone serious about a career in cloud solution architecture, regardless of their experience level. It's a book that not only educates but also inspires action. Highly recommend it to any tech enthusiast looking to elevate their career.  &lt;/p&gt;

</description>
      <category>books</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Book Review: Azure Architecture Explained</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Mon, 13 Nov 2023 07:00:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-azure-architecture-explained-14oh</link>
      <guid>https://dev.to/massimobonanni/book-review-azure-architecture-explained-14oh</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bByolIUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7f0zhuutxj12fkrmlzsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bByolIUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7f0zhuutxj12fkrmlzsm.png" alt="The book cover" width="800" height="987"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The book is an excellent material for those who create solutions in Azure. &lt;/p&gt;

&lt;p&gt;It is a collection of the necessary information, service by service, to better create one's own solutions. &lt;br&gt;
Particular attention is paid to the aspect of security and compliance (which I think is rightly so) and I want to mention the chapter on Azure DevOps (increasingly important from an enterprise perspective) and the chapter on 'tips from the field'. &lt;br&gt;
The latter is not very extensive, but still useful. &lt;/p&gt;

&lt;p&gt;The book does not go into too much detail on the topics covered (but I think that's right) as it is a book intended for Azure solution architects and not for those who manage the resources, but there are practical parts that allow for a better understanding of the theoretical part. &lt;/p&gt;

&lt;p&gt;The book can also be useful for those who have to take the Azure Architecture certification exam.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>architecture</category>
      <category>books</category>
    </item>
    <item>
      <title>Book Review: Azure Cloud Adoption Framework Handbook</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Mon, 25 Sep 2023 11:00:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-azure-cloud-adoption-framework-handbook-25hb</link>
      <guid>https://dev.to/massimobonanni/book-review-azure-cloud-adoption-framework-handbook-25hb</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Cloud Adoption Framework (CAF)&lt;/strong&gt; provides a structured approach for organizations moving to Azure, ensuring alignment with business objectives, offering best practices, governance models and actionable guidance when adopting Azure. &lt;br&gt;
Using CAF minimizes risk, optimizes costs, and lays the foundation for successful cloud adoption and management. But it is important to know it well and understand the concepts proposed in it in depth. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ni412wg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0fediaj6qjcjmrmjyxdc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ni412wg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0fediaj6qjcjmrmjyxdc.png" alt="The cover of the book" width="800" height="979"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book is an excellent manual for understanding what CAF is and how to use it.&lt;br&gt;
The importance of the cloud and its correct adoption are the contents of the first section of the book, very useful for those who need to understand "why" to use the CAF. In particular, I found the scenarios in chapter 2, relating to the strategy for using the CAF, useful.&lt;/p&gt;

&lt;p&gt;The strategy, when you decide to "adopt" a cloud solution, is fundamental and a strategy without a plan is useless.&lt;br&gt;
The second part of the book is precisely focused on this: planning the move to the cloud, migrating your solutions and innovating by becoming "cloud native". In my opinion, chapters 4 and 5 are among the most important of the book because they are the essence of the cloud approach strategy: moving towards the cloud is a journey and migration is only the first step, not the target. All this is very clear in these chapters.&lt;/p&gt;

&lt;p&gt;Finally, in the third part of the book, we find excellent references to Well-Architected Framework, as it rightly must be when we arrive at a "cloud native" approach and need to manage our environments.&lt;br&gt;
I really liked the closing chapter which contains a summary of the various topics previously addressed, a sort of very well done summary of the book.&lt;/p&gt;

&lt;p&gt;The book has less than 200 pages and is a smooth read. It is a handbook, and as such it should be considered: it explains the concepts precisely so that they are clear, then it is up to the reader, if he wants, to use the official documentation to go and split the bit on the specific aspect.&lt;/p&gt;

&lt;p&gt;For me very well done and worth reading if your role is to make decisions on Azure adoption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.packtpub.com/product/azure-cloud-adoption-framework-handbook/9781803244525"&gt;The page of the book on Packt website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>caf</category>
      <category>books</category>
    </item>
    <item>
      <title>Book Review: FinOps Handbook for Microsoft Azure</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 28 Jun 2023 09:44:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/book-review-finops-handbook-for-microsoft-azure-51jd</link>
      <guid>https://dev.to/massimobonanni/book-review-finops-handbook-for-microsoft-azure-51jd</guid>
      <description>&lt;p&gt;"FinOps Handbook for Microsoft Azure" by Maulik Soni is an invaluable resource for anyone wishing to understand and master the art of financial management in the cloud. Structured in three parts and encompassing 13 chapters, this manual offers a comprehensive and accessible coverage of the FinOps discipline, particularly as applied to the Microsoft Azure environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b1iwaMy8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kmlqx2gzsznci3bz5rnp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b1iwaMy8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kmlqx2gzsznci3bz5rnp.jpg" alt="The book cover" width="800" height="986"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first section of the book is dedicated to an overview of the tools and guidelines for cost management in Azure. Particularly noteworthy is the attention given to the cost assessment of the Well-Architected Framework, an analysis that readers will certainly find beneficial.&lt;/p&gt;

&lt;p&gt;The second part, focused on cost optimization, stands out thanks to a detailed analysis of the top 10 targets for optimization. Soni tackles the subject with a very practical and useful approach, providing the reader with a valuable set of operational tools.&lt;/p&gt;

&lt;p&gt;The third section of the book deals with cost optimization based on monitoring metrics, a concept known as Metric Driven Cost Optimization. This operational approach contributes to enriching the panorama of the FinOps discipline.&lt;/p&gt;

&lt;p&gt;Each part concludes with a case study. Despite their simplicity, these case studies prove to be extremely useful for concretizing the previously discussed theoretical concepts, providing a helpful example of practical application.&lt;/p&gt;

&lt;p&gt;Even though the subject matter may seem complex, "FinOps Handbook for Microsoft Azure" by Soni is surprisingly light and readable. It is an extremely useful text for both newcomers and seasoned FinOps professionals, who can consolidate and enrich their knowledge. The author's ability to simplify complex concepts without losing their essence is a strength of this manual, making Soni's work an essential reference in the field of cloud financial management.&lt;/p&gt;

&lt;p&gt;When you work with Cloud technologies (no matter what cloud you are using), the cost is one of the thing you need to take care! Managing costs in the right way can be the winner weapon!!&lt;/p&gt;

</description>
      <category>books</category>
      <category>azure</category>
      <category>finops</category>
    </item>
    <item>
      <title>Azure Functions Tips: override the host.json settings!!</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Thu, 01 Jun 2023 13:28:35 +0000</pubDate>
      <link>https://dev.to/massimobonanni/azure-functions-tips-override-the-hostjson-settings-21mi</link>
      <guid>https://dev.to/massimobonanni/azure-functions-tips-override-the-hostjson-settings-21mi</guid>
      <description>&lt;p&gt;The &lt;code&gt;host.json&lt;/code&gt; file in Azure Functions is a configuration file that provides runtime-specific settings for your function app. &lt;br&gt;
This file is located at the root of a function app project. &lt;br&gt;
Some of the settings that can be configured in the &lt;code&gt;host.json&lt;/code&gt; file include the version of the Azure Functions runtime, logging settings, function timeout duration, and settings for bindings and triggers. &lt;br&gt;
The settings in the &lt;code&gt;host.json&lt;/code&gt; file apply to all functions within a function app.&lt;/p&gt;

&lt;p&gt;Every time you need to change some settings inside it, you need to redeploy the entire Functions App (I know that you can access to the  files in the deploy directly from the portal, but it isn't a good idea!!). Fortunately, you can override the values you have in the &lt;code&gt;host.json&lt;/code&gt; thought the &lt;code&gt;appsettigs.json&lt;/code&gt; file (or using the configuration blade in the portal).  &lt;/p&gt;

&lt;p&gt;In particular, you can set the configuration value similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AzureFunctionsJobHost__&amp;lt;HOST-CONFIG-VALUE&amp;gt; = value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;&amp;lt;HOST-CONFIG-VALUE&amp;gt;&lt;/code&gt; is the &lt;code&gt;host.json&lt;/code&gt; value you want to override.&lt;br&gt;
For example, suppose you have the following host.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"applicationInsights"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"samplingSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"isEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"excludedTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Request"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functionTimeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00:05:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;....&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In that file, you set the timeout for your functions to 5 minutes. If you want to override that value to have 3 minutes of timeout, you can add the following setting in the &lt;code&gt;appsetting.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"IsEncrypted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"AzureFunctionsJobHost__functionTimeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00:03:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In that case &lt;code&gt;&amp;lt;HOST-CONFIG-VALUE&amp;gt;&lt;/code&gt; is &lt;code&gt;functionTimeout&lt;/code&gt;.&lt;br&gt;
If the value you want to override is a property of a section in the &lt;code&gt;host.json&lt;/code&gt; config, you need to use the &lt;code&gt;__&lt;/code&gt; string to describe the hierarchy.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azurefunctions</category>
      <category>serverless</category>
    </item>
    <item>
      <title>ERROR_USER_UNAUTHORIZED error using publish profile in App Service</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Fri, 26 May 2023 09:43:15 +0000</pubDate>
      <link>https://dev.to/massimobonanni/erroruserunauthorized-error-using-publish-profile-in-app-service-232h</link>
      <guid>https://dev.to/massimobonanni/erroruserunauthorized-error-using-publish-profile-in-app-service-232h</guid>
      <description>&lt;p&gt;If you try to publish an App Service using the Publish Profile and you receive the &lt;code&gt;ERROR_USER_UNAUTHORIZED&lt;/code&gt; error, you need to enable the Basic Authentication on App Service to solve it.&lt;/p&gt;

&lt;p&gt;You can receive this error, for example, if you are deploying your App Service using Visual Studio. &lt;br&gt;
You create the Publish Profile in Visual Studio with the Publish menu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslmvp0ebihm6kpgo2dk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslmvp0ebihm6kpgo2dk0.png" alt="The Publish menu in Visual Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Visual Studio feature, behind the scene, use the Publish Profile of the App Service to deploy your code.&lt;br&gt;
Up until a couple of weeks ago, the Basic authentication in App Service was active by default and this always allowed this option to be used without errors. For a couple of weeks now, if you create an App Service from the Azure portal and try to do this type of publication, you get the following error:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3kd153mncbr3c8957a9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3kd153mncbr3c8957a9.png" alt="The publish error in Visual Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This happens because the Basic Authentication is, now, disable by default.&lt;br&gt;
If you want to continue to deploy your app using this way, you need to open the &lt;strong&gt;Configuration&lt;/strong&gt; blade of your App Service, click on the &lt;strong&gt;General settings&lt;/strong&gt; tab and enable the &lt;strong&gt;Basic Authentication&lt;/strong&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4nrhex70odpls368tie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4nrhex70odpls368tie.png" alt="The Basic Authentication option in the App Service configuration blade"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This configuration should solve your problem.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>appservice</category>
    </item>
    <item>
      <title>Read secrets from Azure Key Vault in your GitHub Action</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 24 May 2023 08:40:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/read-secrets-from-azure-key-vault-in-your-github-action-3d8l</link>
      <guid>https://dev.to/massimobonanni/read-secrets-from-azure-key-vault-in-your-github-action-3d8l</guid>
      <description>&lt;p&gt;GitHub allows you to use secrets in your Actions and manage them directly in the repo using the feature you can find in &lt;strong&gt;Settings--&amp;gt;Secrets and variables--&amp;gt;Actions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvhkqut0w5f9w4xuv04k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvhkqut0w5f9w4xuv04k.png" alt="The secrets management page in GitHub repo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, often, you need to manage your secrets outside the repo (for example because the people who manage the secrets are different from the people who manage the Actions) and, in those scenarios, using Azure Key Vault is a good idea.&lt;br&gt;
Let's imagine we have a Key Vault called &lt;code&gt;GitHubKeyVault&lt;/code&gt;in which we have stored a secret called &lt;code&gt;GitHubSecret&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dligtxyj61i1p0nik43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dligtxyj61i1p0nik43.png" alt="The secrets blade of our Key Vault in the portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting credentials and role
&lt;/h2&gt;

&lt;p&gt;Before you can access and use the secret in the Key Vault, you must define a service principal you want to use in the GitHub Action and set the right role (or access policies) in the Key Vault.&lt;br&gt;
To understand how you can create a Service principal for the Action and set the credentials in GitHub, look at my previous &lt;a href="https://dev.to/massimobonanni/azure-workload-identity-federation-and-github-actions-pf7"&gt;post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's suppose that the Service Principal is called &lt;code&gt;GitHubWorkflowDemo&lt;/code&gt;. To set the right permission for the Service Principal in the Key Vault, you can use or RBAC approach or the Key Vault access policies.&lt;br&gt;
We use Access Policies in this post, but using RBAC is very similar.&lt;br&gt;
Open the Key Vault page and select the &lt;em&gt;Access policies&lt;/em&gt; blade and click on &lt;em&gt;"+ Create"&lt;/em&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wv9mgbqsrctgr3j6c89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wv9mgbqsrctgr3j6c89.png" alt="The Access policies blade"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the permission step, we need to configure the permissions we want to assign to our Action. Because, it only needs to read secrets, we can select &lt;code&gt;Get&lt;/code&gt; options in &lt;code&gt;Secret permissions&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctydm6cu9f09thiuqyfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctydm6cu9f09thiuqyfd.png" alt="The permissions tab in the Access Policy wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next step, you need to select the Service Principal created earlier (the Service Principal we use in the Action):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkmcvp2helbyw93ev6wz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkmcvp2helbyw93ev6wz.png" alt="The principal tab in the Access Policy wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can skip the next step (Application), because setting the principal you already set an application for the access policy and you can continue creating the policy.&lt;/p&gt;

&lt;p&gt;Now you are ready to read and use the secret in the Action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the &lt;code&gt;Azure/get-keyvault-secrets&lt;/code&gt; action
&lt;/h2&gt;

&lt;p&gt;One of the way you can achieve your goal is using the &lt;code&gt;Azure/get-keyvault-secrets&lt;/code&gt; action in your GitHub workflow.&lt;br&gt;
You can write something like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret from KeyVault&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="s"&gt;workflow_dispatch&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;SECRETVALUE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;retrieveWithAction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Azure/login@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;creds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AZURE_CREDENTIALS }}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Azure/get-keyvault-secrets@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
        &lt;span class="na"&gt;keyvault&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GitHubKeyVault'&lt;/span&gt;
        &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GitHubSecret'&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mySecrets&lt;/span&gt;
    &lt;span class="c1"&gt;# Starting from here you can use the secret using the &lt;/span&gt;
    &lt;span class="c1"&gt;# steps.mySecrets.outputs.GitHubSecret variable &lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The first step of the &lt;code&gt;retrieveWithAction&lt;/code&gt; job of the Action creates a session in Azure using the Service Principal credentials stored in the  &lt;code&gt;AZURE_CREDENTIALS&lt;/code&gt; secret.&lt;br&gt;
The second step uses the &lt;code&gt;Azure/get-keyvault-secrets&lt;/code&gt; action to access the Key Vault whose name is contained in the &lt;code&gt;keyvault&lt;/code&gt; parameter to read the secrets listed in the &lt;code&gt;secrets&lt;/code&gt; parameter. The secret will be available in the &lt;code&gt;steps&lt;/code&gt; variables and, in particular, in &lt;code&gt;outputs&lt;/code&gt; collection of the variable whose name is contained in the &lt;code&gt;id&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You can find more info about this action in its &lt;a href="https://github.com/Azure/get-keyvault-secrets" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;br&gt;
Unfortunately this action is no longer maintained (the repository is archived) and is considered deprecated. It works, but it will not be evolved or supported in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Azure CLI
&lt;/h2&gt;

&lt;p&gt;Another way you have to read secret from Key Vault is using the &lt;code&gt;az keyvault secret show&lt;/code&gt; command (more info on it &lt;a href="https://learn.microsoft.com/en-us/cli/azure/keyvault/secret?view=azure-cli-latest#az-keyvault-secret-show" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You can write something similar to this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret from KeyVault&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="s"&gt;workflow_dispatch&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;SECRETVALUE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;retrieveWithCLI&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Azure/login@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;creds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AZURE_CREDENTIALS }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Retrieve secret from KV&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azure/CLI@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;inlineScript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;secretValue=$(az keyvault secret show --name "GitHubSecret" --vault-name "GitHubKeyVault" --query "value")&lt;/span&gt;
            &lt;span class="s"&gt;echo "SECRETVALUE="$secretValue &amp;gt;&amp;gt; $GITHUB_ENV&lt;/span&gt;
      &lt;span class="c1"&gt;# Starting from here you can use the secret using the &lt;/span&gt;
      &lt;span class="c1"&gt;# SECRETVALUE variable&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Similar to the previous approach, you create a session in Azure using the &lt;code&gt;Azure/login&lt;/code&gt; action, but in the second step you use the &lt;code&gt;Azure/CLI&lt;/code&gt; action to retrieve the secret from the Key Vault with the previous CLI command and save it in the &lt;code&gt;SECRETVALUE&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;In this approach you need to have a call for each secret and differently from the first approach in which the secrets remain secrets within the action, in this second approach the secrets end up in common variables.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>github</category>
      <category>azurekeyvault</category>
    </item>
    <item>
      <title>Azure Functions Tips: how to store the Functions App keys into KeyVault</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 17 May 2023 09:28:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/azure-functions-tips-how-to-store-the-functions-app-keys-into-keyvault-4nij</link>
      <guid>https://dev.to/massimobonanni/azure-functions-tips-how-to-store-the-functions-app-keys-into-keyvault-4nij</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In a &lt;a href="https://dev.to/massimobonanni/azure-functions-tips-where-are-our-function-app-keys-ii0"&gt;previous post&lt;/a&gt;, we talked about Function App keys and the default store.&lt;br&gt;
The default store for all the keys in your Function app is a Storage Account. You can change it, you can have two different Storage Accounts for the keys and for other stuff of your Function App, but it is a Storage Account.&lt;br&gt;
One of the best practices about secrets management in Azure is to store them in a Key Vault and the Function App keys are, at the end, secrets.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Vault as keys store
&lt;/h2&gt;

&lt;p&gt;You can change the service you use to store the Function App keys using the &lt;code&gt;AzureWebJobsSecretStorageType&lt;/code&gt; config value.&lt;br&gt;
Setting this value in the Function App configuration, you che choose the following services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;blob&lt;/code&gt;: this is the default value and allows you to use Storage Account as secret store (as show in the previous &lt;a href="https://dev.to/massimobonanni/azure-functions-tips-where-are-our-function-app-keys-ii0"&gt;post&lt;/a&gt;);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;files&lt;/code&gt;: use the file system to persist the secrets. This is the default for the function runtime v.1.x;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;keyvault&lt;/code&gt;: using this value, you can store the keys into a Key Vault;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;kubernetes&lt;/code&gt;: this is supported only if your functions run in Kubernetes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our case, we set the value on &lt;code&gt;keyvault&lt;/code&gt; and we use &lt;code&gt;AzureWebJobsSecretStorageKeyVaultUri&lt;/code&gt; key to store the Key Vault reference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2o47w0fl7zix94wnkrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2o47w0fl7zix94wnkrz.png" alt="The Function App configuration to use Key Vault as a secret store"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  It's just identity
&lt;/h2&gt;

&lt;p&gt;Now you set the Key Vault as secret store, but all this is useless if the function app doesn't have privileges to access the Key Vault itself.&lt;/p&gt;

&lt;p&gt;You can use both Managed Identity or Service Principal (App Registration) to provide permission on the Key Vault site.&lt;/p&gt;
&lt;h3&gt;
  
  
  Managed Identity
&lt;/h3&gt;

&lt;p&gt;In this scenario we can either use a System-assigned or a User-assigned Managed Identity.&lt;br&gt;
In the first case, we don't need to do anything except configure the access credentials on the Key Vault service (we'll see later).&lt;br&gt;
If, on the other hand, we have defined our Function App as a User-assigned Managed Identity, we need to retrieve the client id of the identity and use it in the &lt;code&gt;AzureWebJobsSecretStorageKeyVaultClientId&lt;/code&gt; configuration.&lt;br&gt;
To retrieve the Client ID, you can use the portal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv53xahinyaap0mt6qv4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv53xahinyaap0mt6qv4.png" alt="The client id location in the Managed Identity page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;or you can use the CLI command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az identity show &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;identity name&amp;gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;resource group name&amp;gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"{ClientID:clientId}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the client id, you add it to the Function App configuration:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5lf8yqf251o459mx487.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5lf8yqf251o459mx487.png" alt="Client ID configuration in the Azure Portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  App Registration
&lt;/h3&gt;

&lt;p&gt;If you need, you can also use a Service Principal (App Registration).&lt;br&gt;
In this scenario, you need to have Client ID, Tenant ID and Client Secret (as usual) from the portal and, then add the following settings in the Function App configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AzureWebJobsSecretStorageKeyVaultClientId&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AzureWebJobsSecretStorageKeyVaultClientSecret&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AzureWebJobsSecretStorageKeyVaultTenantId&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: System-assigned Managed Identiy works perfectly with runtime version 3.x and 4.x, while the other two (User-assigned and App Registration) work only with runtime 4.x.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set the right credential
&lt;/h3&gt;

&lt;p&gt;Once you have an identity for your Function App you need to set the right credential into the Key Vault.&lt;br&gt;
The Function App needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieve the list of the keys (it shows you the keys in the portal);&lt;/li&gt;
&lt;li&gt;read a key (it need to check the single key every time you make a call);&lt;/li&gt;
&lt;li&gt;add/update a key (you can add or change an existing key from the portal);&lt;/li&gt;
&lt;li&gt;delete a key (you can remove a key).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can configure these permission using RBAC or access policy.&lt;br&gt;
If you use RBAC, the right role for the Function App need to have, at least, the following DataActions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Microsoft.KeyVault/vaults/secrets/delete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.KeyVault/vaults/secrets/getSecret/action&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.KeyVault/vaults/secrets/setSecret/action&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Microsoft.KeyVault/vaults/secrets/readMetadata/action&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use the built-in role "Key Vault Secrets Officer" even it has more operations than you need. &lt;/p&gt;

&lt;p&gt;If you use the Key Vault Access policy approach, the following picture shows you the right settings:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faibfydq5etvmhb1bo9zc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faibfydq5etvmhb1bo9zc.png" alt="The Key Vault Access Policy for the Function App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How the keys are stored
&lt;/h2&gt;

&lt;p&gt;The Function App creates a secret for each keys you have in the host part (for example the master key) and for each key you create in each function inside the Function App.&lt;br&gt;
For example, if you have the following keys:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98wj71utr5iijbipi8hw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98wj71utr5iijbipi8hw.png" alt="Two keys in your function in the Azure portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;you have the following secret definitions in the Key Vault secrets page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio1yktm9xobxhp6mlt3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio1yktm9xobxhp6mlt3c.png" alt="The secret definitions for the function app keys in the portal"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azurefunctions</category>
    </item>
    <item>
      <title>Azure Functions Tips: where are our Function App keys?</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 10 May 2023 09:15:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/azure-functions-tips-where-are-our-function-app-keys-ii0</link>
      <guid>https://dev.to/massimobonanni/azure-functions-tips-where-are-our-function-app-keys-ii0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Azure Functions give you a built-in way to secure the calls for Http trigger functions. If you look at the following simple Azure Functions:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Echo"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Echo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"echo"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C# HTTP trigger function processed a request."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can notice the argument &lt;code&gt;AuthorizationLevel.Function&lt;/code&gt; of the &lt;code&gt;HttpTrigger&lt;/code&gt; attribute. According to the official documentation (&lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?pivots=programming-language-csharp&amp;amp;tabs=python-v2%2Cin-process%2Cfunctionsv2#attributes" rel="noopener noreferrer"&gt;here for more info&lt;/a&gt;), that value:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;is a string value that indicates the kind of authorization key that's required to access the function endpoint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It means that, if you enable that feature, you need to invoke the Http endpoint with an URL like the following:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://myfunctionapp.azurewebsites.net/api/echo?code=&amp;lt;API_KEY&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If you prefer, you can send the key using the header &lt;code&gt;x-functions-key&lt;/code&gt; instead the query string. &lt;br&gt;
The possible values for the &lt;code&gt;AuthorizationLevel&lt;/code&gt;enumeration are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;anonymous&lt;/td&gt;
&lt;td&gt;No API key is required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;function&lt;/td&gt;
&lt;td&gt;A function-specific API key is required. This is the default value when a level isn't specifically set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;admin&lt;/td&gt;
&lt;td&gt;The master key is required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Azure portal gives you the capability to manage both function-specific keys and master keys:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz9j3onee1gugwbnob0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz9j3onee1gugwbnob0t.png" alt="The Azure portal admin keys management"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqngjgoxi4ppz3y19ocd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqngjgoxi4ppz3y19ocd.png" alt="The Azure portal specific function keys management"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Default keys store
&lt;/h2&gt;

&lt;p&gt;As you can see from the previous images, you can add more than one key both in the system group than for each single function.&lt;br&gt;
But the question is: &lt;strong&gt;where are stored these keys?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By default, the Function App retrieves (and saves, of course) all the keys you create in a Storage Account.&lt;br&gt;
The connection string of the Storage Account is stored in the &lt;code&gt;AzureWebJobsStorage&lt;/code&gt; configuration.&lt;br&gt;
The Function App uses this Storage Account for the timer triggers info, the Event Hub checkpoint and, also, as store for the different Keys you have in it.&lt;br&gt;
If you open the Storage Account page, you can find a container called &lt;code&gt;azure-webjobs-secrets&lt;/code&gt; as shown in the following picture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffddxa4wtee0atleggwbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffddxa4wtee0atleggwbl.png" alt="The secret container in the Storage Account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this container you find a folder for each Function App that uses it as store and inside folders you can see the JSON blobs that contain the secrets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0lgjahnloivi3q3jlsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0lgjahnloivi3q3jlsx.png" alt="The secret blobs in the Function App folder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the previous image, you have one blob for each function (in our sample, we have only the &lt;code&gt;echo.json&lt;/code&gt; blob for the &lt;code&gt;echo&lt;/code&gt; function) and one blob (&lt;code&gt;host.json&lt;/code&gt;) for the system keys.&lt;br&gt;
The echo.json has the following schema:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CfDJ.........HaTQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encrypted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hostName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keyvaultkeysfuncapp.azurewebsites.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instanceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1cb21680e4253c2794483f9b01c5c800"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decryptionKeyId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MACHINEKEY_DecryptionKey=Qzlp8wEKnbM33X1gHAREIGNJee8Ii6e6GEmnt5jT4j8=;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You have the array &lt;code&gt;keys&lt;/code&gt; that contains all the keys you create for the specific function.&lt;br&gt;
The key is a JSON Web Key (JWK) key (&lt;a href="https://www.rfc-editor.org/rfc/rfc7517" rel="noopener noreferrer"&gt;rfc definition&lt;/a&gt;) and you can add, remove or modify a key changing the JSON blob (I suggest to use the Azure portal or the CLI command, but if you want you can change directly in the blob).&lt;/p&gt;

&lt;p&gt;To generate a JWK kay you can use the following C# snippet (or you can find a lot of on-line tools):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Security.Cryptography&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Create a new RSA key pair&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rsa&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Export the public key as a JWK&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;jwk&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Base64UrlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExportRSAPublicKey&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jwk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;Base64UrlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If you set a key with wrong format, the Azure portal doesn't show it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Change the default storage
&lt;/h2&gt;

&lt;p&gt;You can use a secondary storage for the secrets.&lt;br&gt;
To do that, you can set the setting called &lt;code&gt;AzureWebJobsSecretStorageSas&lt;/code&gt; with the Shared Access Signature of the secondary storage. &lt;/p&gt;

&lt;p&gt;So, imagine you create the storage account called &lt;code&gt;myfunckeysstorage&lt;/code&gt;.&lt;br&gt;
You need a container inside it (to store the JSON blobs) as shown in the following picture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw9g0f7w3dca289i3in2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw9g0f7w3dca289i3in2.png" alt="The container to store our secrets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, you can call it as you want.&lt;br&gt;
Now you need to generate the Shared Access Token to use in the Function App setting. To generate the SAS, you can open the container and use the option "Shared access tokens" as shown in the following picture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea6eb1sllqlx8ucs39b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea6eb1sllqlx8ucs39b9.png" alt="Create the SAS in the Azure portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To set the new storage as secret store for the Function App, you need to add the setting &lt;code&gt;AzureWebJobsSecretStorageSas&lt;/code&gt; with the value of the URL with SAS you generate in the previous step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jbio1ehk73jue6jzdhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jbio1ehk73jue6jzdhg.png" alt="The new secret store in the Function App configurations"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azurefunctions</category>
    </item>
    <item>
      <title>Azure Functions Tips: change the limit for the size of body in a function</title>
      <dc:creator>Massimo Bonanni</dc:creator>
      <pubDate>Wed, 03 May 2023 09:31:00 +0000</pubDate>
      <link>https://dev.to/massimobonanni/azure-functions-tips-change-the-limit-for-the-size-of-a-body-in-a-function-4hf9</link>
      <guid>https://dev.to/massimobonanni/azure-functions-tips-change-the-limit-for-the-size-of-a-body-in-a-function-4hf9</guid>
      <description>&lt;p&gt;When you implement an Http Trigger Function that manages a request with a body, you have a size limit for the body itself. The default value for this limit is 100Mb (actually 104857600 bytes and you can read it in the &lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python-v2%2Cin-process%2Cfunctionsv2&amp;amp;pivots=programming-language-csharp#limits" rel="noopener noreferrer"&gt;Http Trigger documentation&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You can manage this limit using the Function App configuration. In particular, you can add the setting &lt;code&gt;FUNCTIONS_REQUEST_BODY_SIZE_LIMIT&lt;/code&gt; to set the maximum number of bytes you support in a single Http request.&lt;/p&gt;

&lt;p&gt;Just to test how this setting works, use the following simple function:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PostSomething"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;PostSomething&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C# HTTP trigger function processed a request."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkResult&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can do it also in your machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the config to your local setting file of the Function project:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"IsEncrypted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UseDevelopmentStorage=true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dotnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"FUNCTIONS_REQUEST_BODY_SIZE_LIMIT"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Run the project:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymfeqqk3ygwgpoj9bm9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymfeqqk3ygwgpoj9bm9e.png" alt="The log of the function runtime"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a POST Http request (for example using &lt;code&gt;curl&lt;/code&gt;):&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:7077/api/post &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s2"&gt;"This is the payload of the request and its size is more than 100 bytes. The function should throw an exception!!"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The function's log should display the error related to the size of the body:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdav6tceqt1x84h5bct7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdav6tceqt1x84h5bct7h.png" alt="The Request Body Too Large error throws by the function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can have the same behavior if you set the application setting value in a Function App on Azure:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhtbl9z0a9h5whu25mrq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhtbl9z0a9h5whu25mrq.png" alt="The application settings of the Azure Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and then you can test the function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc635lgbot07ufc97pxmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc635lgbot07ufc97pxmq.png" alt="The test UI of the Azure Portal for an Azure Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;having the error:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg5cd1n2alwdzwjnyv9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg5cd1n2alwdzwjnyv9x.png" alt="The "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>azurefunctions</category>
    </item>
  </channel>
</rss>
