A Refresher on GitHub Pages

I moved my blog from WordPress to GitLab Pages in... 2016. I'm happy with the solution. However, I used GitHub Pages when I was teaching for both the courses and the exercises, e.g., Java EE. At the time, there was no GitHub Actions: I used Travis CI to build and deploy.

Recently, I had to use GitHub Pages to publish my Apache APISIX workshop. Travis is no longer free. GitHub Actions are a thing. I used the now nominal path and faced a few hurdles; here are my findings.

Even More OpenTelemetry!

I continue to work on my OpeneTelemetry demo. Its main idea is to showcase traces across various technology stacks, including asynchronous communication via an MQTT queue. This week, I added a couple of components and changed the architecture. Here are some noteworthy learnings; note that some of them might not be entirely connected to OpenTelemetry.

Here's an updated diagram. New components appear in violet, and updated components appear in green.

From Kotlin Scripting to Python

GitHub offers a way to customize one's profile by allowing one to create a README in a specific repository, named as your profile, e.g., nfrankel/nfrankel. A couple of years ago, I automated the update of my GitHub profile with up-to-date info: my latest blog posts, my upcoming talks, and the last recorded YouTube talk. I took the time to document how to do it on this blog.

At the time, I chose Kotlin scripting because I was proficient enough in Kotlin, but I wanted to learn the scripting part. Over the years, I became more and more dissatisfied with the solution. I recently moved away from Kotlin Scripting to Python. In this post, I want to explain my reasons and document the migration.

Secure Your API With These 16 Practices With Apache APISIX (Part 2)

Last week, we listed 16 practices to help secure one's APIs and described how to implement them with Apache APISIX.

  1. Authentication: Verifies the identity of users accessing APIs.
  2. Authorization: Determines permissions of authenticated users.
  3. Data Redaction: Obscures sensitive data for protection.
  4. Encryption: Encodes data so only authorized parties can decode it.
  5. Error Handling: Manages responses when things go wrong, avoiding revealing sensitive info.
  6. Input Validation and Data Sanitization: Checks input data and removes harmful parts.
  7. Intrusion Detection Systems: Monitor networks for suspicious activities.
  8. IP Whitelisting: Permits API access only from trusted IP addresses.
  9. Logging and Monitoring: Keeps detailed logs and regularly monitors APIs.
  10. Rate Limiting: Limits user requests to prevent overload.
  11. Secure Dependencies: Ensures third-party code is free from vulnerabilities.
  12. Security Headers: Enhances site security against types of attacks like XSS.
  13. Token Expiry: Regularly expiring and renewing tokens prevents unauthorized access.
  14. Use of Security Standards and Frameworks: Guides your API security strategy.
  15. Web Application Firewall: Protects your site from HTTP-specific attacks.
  16. API Versioning: Maintains different versions of your API for seamless updates.

This week, we will look at the remaining practices.

Secure Your API With These 16 Practices With Apache APISIX (Part 1)

A couple of months ago, I stumbled upon this list of 16 practices to secure your API:

  1. Authentication: Verifies the identity of users accessing APIs.
  2. Authorization: Determines permissions of authenticated users.
  3. Data redaction: Obscures sensitive data for protection.
  4. Encryption: Encodes data so only authorized parties can decode it.
  5. Error handling: Manages responses when things go wrong, avoiding revealing sensitive info.
  6. Input validation and data sanitization: Checks input data and removes harmful parts.
  7. Intrusion detection systems: Monitor networks for suspicious activities.
  8. IP Whitelisting: Permits API access only from trusted IP addresses.
  9. Logging and monitoring: Keeps detailed logs and regularly monitors APIs.
  10. Rate limiting: Limits user requests to prevent overload.
  11. Secure dependencies: Ensures third-party code is free from vulnerabilities.
  12. Security headers: Enhances site security against types of attacks like XSS.
  13. Token expiry: Regularly expiring and renewing tokens prevents unauthorized access.
  14. Use of security standards and frameworks: Guides your API security strategy.
  15. Web application firewall: Protects your site from HTTP-specific attacks.
  16. API versioning: Maintains different versions of your API for seamless updates.

While it's debatable whether some points relate to security, e.g., versioning, the list is a good starting point anyway. In this two-post series, I'd like to describe how we can implement each point with Apache APISIX (or not).

Hardening Apache APISIX With the OWASP’s Coraza and Core Ruleset

The Open Worldwide Application Security Project is an online community that produces freely available articles, methodologies, documentation, tools, and technologies in the fields of IoT, system software and web application security. The OWASP provides free and open resources. It is led by a non-profit called The OWASP Foundation. The OWASP Top 10 - 2021 is the published result of recent research based on comprehensive data compiled from over 40 partner organizations.

OWASP website

Improving Upon My OpenTelemetry Tracing Demo

Last year, I wrote a post on OpenTelemetry Tracing to understand more about the subject. I also created a demo around it, which featured the following components:

  • The Apache APISIX API Gateway
  • A Kotlin/Spring Boot service
  • A Python/Flask service
  • And a Rust/Axum service

I've recently improved the demo to deepen my understanding and want to share my learning.

2023 in Retrospective

Last year, I wrote my first yearly retrospective. I liked the experience, so I'm trying one more time. Let the future decide if it will become a trend or not.

Before diving into our safe technological world, my thoughts go to Ukraine, to my friends who had to flee their own country, to other friends who fought on the front to defend it from imperial power, and to all victims of an old kleptocrat who clings to power despite the cost to others. The free world needs to support Ukraine more. I hope 2024 will be the year of Ukrainian victory.

Apache APISIX Plugin Priority, a Leaky Abstraction?

Apache APISIX is an API Gateway that builds upon the OpenResty reverse proxy to offer a plugin-based architecture. The main benefit of such an architecture is that it brings structure to the configuration of routes. It's a help at scale when managing hundreds or thousands of routes.

In this post, I'd like to describe how plugins, priority, and phases play together and what pitfalls you must be aware of.

Canary Releases With Apache APISIX

In a few words, the idea of canary releases is to deliver a new software version to only a fraction of the users, analyze the results, and decide whether to proceed further or not. If results are not aligned with expectations, roll back; if they are, increase the number of users exposed until all users benefit from the new version.

In this post, I'd like to detail this introduction briefly, explain different ways to define the fraction, and show how to execute it with Apache APISIX.

Chopping the Monolith in a Smarter Way

In my previous post Chopping the Monolith, I explained that some parts of a monolith are pretty stable and only the fast-changing parts are worth being "chopped." I turned the post into a talk and presented it at several conferences. I think it's pretty well received; I believe it's because most developers understand, or have direct experience, that microservices are not a good fit for traditional organizations, as per Conway's Law.

In the talk, I use an e-commerce web app as an example.

Exploring the OpenTelemetry Collector

The OpenTelemetry Collector sits at the center of the OpenTelemetry architecture but is unrelated to the W3C Trace Context. In my tracing demo, I use Jaeger instead of the Collector. Yet, it's ubiquitous, as in every OpenTelemetry-related post. I wanted to explore it further.

In this post, I explore the different aspects of the Collector:

Python “Magic” Methods (Part 2)

Let's continue our exploration of Python's magic methods in this second part of the series. This part will focus on numbers and containers, i.e., collections. You can read the first part here.

Container-Related Methods

Python provides the usual containers, e.g., lists, sets, and dictionaries. You can use the following methods when you want to implement your own.