Reset the digest of a terraform state in one command

Caveat: This solution only applies on states stored on AWS and relying on DynamoDB, the default, to store the lock/checksum. YMMV on other platforms, but the logic is the same.

Usually, running a terraform command is easy and, even if your plan contains errors, returns everything in a clean state. Sometimes, it fails badly1 and you get the following error:

Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed
        status code: 400, request id: P5T1PGB8VQDI4GKIIT8G5B9K0VVV4KQNSO5AEMVJF66Q9ASUAAJG
Lock Info:
  ID:        c18b397f-817b-b5dc-53cb-cd24ab01f789
  Path:      path/terraform.tfstate
  Operation: OperationTypeApply
  Who:       user@box
  Version:   0.11.7
  Created:   2018-08-03 12:24:03.5267495 +0000 UTC
  Info:

Terraform acquires a state lock to protect the state from being written
by multiple users at the same time. Please resolve the issue above and try
again. For most commands, you can disable locking with the "-lock=false"
flag, but this is not recommended.

This error is easily fixed by running the force-unlock command with the ID given in message.

But sometimes, even after running the force-unlock command, you still get an error:

Error loading state: state data in S3 does not have the expected content.

This may be caused by unusually long delays in S3 processing a previous state
update. Please wait for a minute or two and try again. If this problem
persists, and neither S3 nor DynamoDB are experiencing an outage, you may need
to manually verify the remote state and update the Digest value stored in the
DynamoDB table to the following value: 9355476ad083c709fe8da56ca7b60b73uri

If you're not familiar with DynamoDB, or don't have direct access to table due to IAM restrictions, here is a single aws command to run to reset the digest :

$ aws dynamodb update-item --table-name terraform-states-lock --key '{"LockID": {"S": "<LOCKID_PATH>"}}' --attribute-updates '{"Digest": {"Value": {"S": "<DIGEST>"},"Action": "PUT"}}' --return-values UPDATED_NEW | jq '.Attributes.RuleSetVersion.S'

You need to change the values of <LOCKID_PATH> and <DIGEST> to match your own, of course.


  1. Often, it is due to a Ctrl+C done at the wrong time. Sh** happens. 

Liste chaînée #6

Liste chaînée #6

Une fois n'est pas coutume, je démarre l'année avec quelques outils & liens que j'ai glané depuis mon déménagement1.

  • Parce que j'ai fortement travaillé sur le rendu lors du travail sur le nouveau thème de ce blog, les extensions Markdown sont rapidement rentrées dans la liste des packages python que je garde sous la main.
  • L'ami Frédéric m'a converti à Notion (lien sponsorisé). Il faut le temps de se mettre à l'outil et comprendre ce qui se passe. Je vais certainement quitter Remember The Milk grâce à cela.
  • Au début, on rit. Au fur & à mesure de la lecture, on sourit de moins en moins en se disant que l'on a déjà commis ce genre d'horreur. A la fin, on se promet de ne plus jamais recommencer2. Le guide des anti-patterns en python devrait être enseigné en école tellement il nous renvoie à nos crimes (pas si ) passés.
  • Il est toujours difficile d'écrire des documentations à destination de personnes peu versées sur le sujet. Je redécouvre cela depuis quelques mois en travaillant avec des clients pour qui le mot cloud est encore un gros mot. What make a good runbook est une réflexion ouverte et utile sur la qualité des livrables que l'on fournit.
  • Certainement la liste la plus complète de ressources gratuites pour les développeurs. Clairement à garder en tête à chaque nouveau projet OSS.
  • Un pan méconnu de l'histoire de l'informatique.
  • Les bases de Go, une série d'articles plutôt courts et complets pour tenter, comme moi, de se lancer dans ce langage.
  • Régime minceur pour images Docker. C'est un peu magique, il faut parfois mettre les mains dans le cambouis. Mais parvenir à réduire la taille d'une image docker de 250Mo à seulement 42Mo avec les même fonctionnalités reste un exploit.
  • Pour continuer sur Docker, un runtime alternatif: podman. J'ai rapidement eu l'occasion de le voir fonctionner, j'espère pouvoir y toucher un peu plus en détails.
  • Enfin, pour ceux qui ont encore du mal à comprendre IaaS & PaaS, un article complet et clair sur le sujet.

Sinon, un peu de retape ne faisant jamais de mal, je travaille toujours sur ce projet et devrai avoir un prototype web.

Cover by unsplash-logo Stanislav Kondratiev


  1. Un jour, je terminerai ce billet… Après mon prochain déménagement ? 

  2. Une promesse que l'on doit rompre dès le lendemain. "Pavé de la réalité sur tartelette aux fraises..." 

A personal podcast app

A personal podcast app

I listen to around twenty podcasts each month. Music, videogames, politics, radio shows, I have an eclectic library.

Currently, my listening app is Spotify. Why? A centralized location for files, offline downloading and it keeps a track of what is played and where to restart between devices.

One major drawback is the inability to add podcasts from another source than their catalog. At least one french radio, RTL, did not add their feed to the catalog as they want to be paid (article in french).

Moreover, I'm fully dependant on Spotify goodwill to keep my feeds, it implies my politics ones, mainly, may disappear without any notice.

So I'm thinking to develop my own dedicated podcast listening app. It would be a "simple" webapp, django based, for feeds management and preview associated with a mobile app, Android at first, for listening, offline and/or online.

The idea is not to offer another service which would have to be monetized someday but something anyone could deploy on their own server as long as they have docker deployed on their server.

If you're interested and want to help, leave a comment below or drop me a line at bonjour[chez]pygillier.me. When I'll really start to develop, I'll let you know.

Cover image by unsplash-logo Juja Han

Amazon Linux container on molecule

At Claranet, our clients come with their own requirements, even on clouds like AWS. And, due to my previous experience at The Food Assembly I now have the habit to test my code, always. It includes Ansible with its testing framework called Molecule.

For one client, I had to deliver a complete playbook with several roles covering a quite complex setup. It included several systemd services and had to be run on Amazon Linux EC2 instances.

As this distro is loosely based on redhat, afaik, I began to test on CentOS containers with systemd enabled. It was working but I wasn't quite confident as it wasn't the very same OS as Amazon Linux.

Luckily, AWS provides Docker images for this distro. I could then use them and be more confident in my code at one exception: systemd.

Out of box, these images don't include systemd binaries. Moreover, they follow the release cycle of their VM counterpart by being updated regularly. As my client let the updater run on their EC2 instances, I couldn't build a derivate image with systemd.

Fortunately, Molecule helped me achieve having a "rolling" systemd image for tests. Version 2.0 of molecule changed its inner settings and exposed one interesting file : molecule/default/Dockerfile.j2. As its name implies, this file is used by molecule in the create part to build a usable image for testing by inheriting from provided one, in my case amazonlinux:latest and, by modifying this file, I could install systemd on it.

Here is the content of the file:

# Molecule managed

{% if item.registry is defined %}
FROM {{ item.registry.url }}/{{ item.image }}
{% else %}
FROM {{ item.image }}
{% endif %}

{% if item.env is defined %}
{% for var, value in item.env.items() %}
{% if value %}
ENV {{ var }} {{ value }}
{% endif %}
{% endfor %}
{% endif %}

RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates iproute2 && apt-get clean; \
    elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install python sudo python-devel python*-dnf bash iproute && dnf clean all; \
    elif [ $(command -v yum) ]; then yum makecache fast && yum install -y **systemd** python sudo yum-plugin-ovl bash iproute && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \
    elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml iproute2 && zypper clean -a; \
    elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates; \
    elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates iproute2 && xbps-remove -O; fi

Then, I had to make sure my container was correctly started using systemd by editing the platform section of file molecule/default/molecule.yml:

platforms:
  - name: amazonlinux-2018
    image: amazonlinux:latest
    command: /usr/lib/systemd/systemd
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

And voilà I have a fully usable Amazon Linux docker image with systemd enabled.

Salut Nantes !

Encore quelques jours et je me retrouverai angevin travaillant à Nantes. Même si je suis content de découvrir mes nouveaux collègues nantais, je suis partant pour discuter devops/aws/Paris-Web autour d'une bière avec d'autres personnes dans le domaine.

Donc, si cela vous tente, n'hésitez pas à me contacter ici via les commentaires, via Twitter, voire LinkedIn si vous voulez faire formel, pour qu'on s'organise !

NB: Ce n'est pas réservé à Nantes, habitant à Angers : même combat !

C'est parti !

C'est parti !

Dans ce billet, je vous décrivais le démarrage de ma recherche d'un nouveau travail au mois de mars. Nous sommes en juillet, je suis dans une nouvelle société depuis juin et notre déménagement a lieu ce vendredi. Quel changement !

Cela fera peut-être prétentieux mais suite à ce billet, je ne m'attendais pas à recevoir autant d'offres qualifiées, entendre des offres ne venant pas de robots scannant les CV à la recherche de mots clefs comme cela a déjà été le cas et surtout autant d'offres intéressantes.

Il faut croire qu'après ces trois années passées dans le monde merveilleux des startups, j'ai encore pris de la bouteille et du recul sur mon métier. Cependant, je reconnais avoir bénéficié en diable de l'expérience acquise à LRQDO pour trouver un nouveau travail et réussir ce genre de concours

Cela fait maintenant un mois que je suis en poste chez Claranet, les cartons sont quasiment prêts pour partir dans la nouvelle ville, Geronimo !

Cover photo by Aleksandr Barsukov on Unsplash

Une nouvelle aventure

Une nouvelle aventure

Sans rentrer dans les détails personnels, j'ai le projet de quitter Paris avec la petite famille d'ici fin août. Je pensais pouvoir le faire tout en restant dans ma société (vive le télétravail en 2019) mais cela ne se fera pas.

Je suis donc de retour dans le grand bal des recherches d'emploi mais avec une particularité majeure cette fois : partant dans la belle ville de Angers, je recherche soit un poste en remote (mais pas à 100% car je me connais et serai incapable d'être un ours dans ma caverne) soit un poste basé à Angers ou Nantes.

Bien que j'ai moi-même du mal à suivre toutes les prises de contact, honte à moi, je vous invite, si vous désirez me proposer quelque chose à me contacter via mon profil LinkedIn de préférence au mail.

Mon CV est disponible à cette adresse.

D'avance merci à celles et ceux qui feraient passer le message.

Un soir dans la rue

Déjà en 2002, je m'étais fait la réflexion : il n'y a pas de meilleur moment pour se balader dans Paris que pendant un match de l'équipe de France, surtout en phase finale d'une compétition .

Voyez le tableau, il fait beau et chaud, le soleil est encore haut dans le ciel et les rues sont quasiment vides. Quasiment car toutes les terrasses sont prises d'assaut et les quelques passants flânent.

Regarder le match ? Quel besoin ? Le simple fait d'être à portée d'un bar, et il y en a quelques uns mine de rien à Paris, suffit pour savoir si un but a été marqué et par qui.

Et pendant ce temps, les rues sont vides, les restaurants sans foot sont calmes, même les fast-food sont désertés. Une ambiance de 23h mais à 20h.

Le bonheur.

Allez les bleus !

Liste chaînée #5

Je continue sur ma lancée de ces derniers mois avec les deux sujets importants du moment : ma nouvelle capacité de data engineer et toujours ma certification à passer sur AWS.

  • Ma lecture de chevet du moment : Applying DevOps to Data Science. Une série d'articles sur l'état de l'intégration entre les pratiques DevOps et les spécificités de la Data Science. Pour y être confronté quasi quotidiennement, je lis religieusement tout nouvel article.
  • Cataloguer ses data : c'est toujours bien de générer beaucoup de data dans tous les sens et dans tous les formats. Encore faut-il savoir ce qui est disponible et imaginer quoi en faire.
  • Un rappel toujours utile sur les diverses visualisations et leurs usages respectifs.
  • Chalice, le microframework python qu'il vous faut pour faire du webservice simplement sur AWS Lambda.
  • Quelques réflexions sur Vue.js qui expliquent, entre autres, certains partis pris du framework.
  • Le meilleur comparateur d'instances EC2 que j'ai pu trouver pour le moment. Je suis preneur de mieux si vous connaissez.

Re:start

Re:start

Adieu sites dynamiques en PHP et autres technologies joyeuses, place au statique et à tout ce que cela implique de configuration et de restrictions.

C'est assez paradoxal de revenir à un mode de publication tel que je le pratiquais il y a presque vingt ans sur Le Village et où chaque page était quasiment écrite à la main après être passé par la bonne moitié des CMS en PHP.

C'est tout aussi paradoxal de revenir à un mode de publication statique alors que dans mon quotidien de DevOps/SRE, quasiment tout ce que j'écris est dynamique et déclenche un nombre conséquent de scripts.

Mais j'y vois un avantage certain. Je redeviens totalement maître de mes contenus, pour preuve, j'écris en markdown sous Visual Studio Code sans peur aucune de devoir un jour convertir mes textes dans un autre format.

Je ne cache pas que pour cela j'ai dû passer par l'étape du convertisseur à partir de mon dernier outil de publication, mais cela m'a permis de repasser sur la grande majorité de mes textes et de corriger le nombre conséquent de fautes en tout genre que j'avais laissé traîner.

Il reste encore pas mal de coups de peinture à mettre, de boulons et d'écrous à visser. Je changerai probablement de thème encore une ou deux fois mais je me sens bien cette fois et j'espère que cela vous plaira autant qu'à moi.