<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Aws on Puppeteers Oy</title>
		<link>https://www.puppeteers.net/tags/aws/</link>
		<description>Recent content in Aws on Puppeteers Oy</description>
		<generator>Hugo</generator>
		<language>en-US</language>
		
		
		
		
			<lastBuildDate>Thu, 10 Aug 2023 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://www.puppeteers.net/tags/aws/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>How to reduce RDS storage size in an automated way</title>
				<link>https://www.puppeteers.net/blog/how-to-reduce-rds-storage-size-in-an-automated-way/</link>
				<pubDate>Thu, 10 Aug 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/how-to-reduce-rds-storage-size-in-an-automated-way/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/pexels-jakub-zerdzicki-16978372.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Amazon RDS is a relational database service available on Amazon Web Services. It is essentially a managed database server with a volume for the data. Both cost money. Having a large dataset is not the only reason have big volume: the volume size determines the number of I/O operations (IOPS) the volume can do. If you have high load on your RDS instance you may very well run out of IOPS which can result in a disaster. Scaling up the volume size is easy to avoid such disasters, but it is much more difficult to reduce RDS storage size. This is because downsizing RDS storage size &lt;a href=&#34;https://repost.aws/knowledge-center/rds-db-storage-size&#34;&gt;is not officially supported by AWS&lt;/a&gt;. If the load on your RDS instance goes down (e.g. due to refactoring), you may end up having a database with an oversized volume that costs lots of money for no reason.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Downsize AWS RDS Volume</title>
				<link>https://www.puppeteers.net/blog/downsize-aws-rds-volume/</link>
				<pubDate>Mon, 08 May 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/downsize-aws-rds-volume/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/pexels-pixabay-359641.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;It is trivial to downsize an AWS RDS &lt;em&gt;instance&lt;/em&gt;. It is equally trivial to upsize AWS RDS volumes. However, to downsize AWS RDS volume you need to jump through lots of hoops.&lt;/p&gt;&#xA;&lt;p&gt;So, why would you ever want to downsize an AWS RDS volume? One reason might be that you increased the volume size simply to get more burst credits for the &lt;em&gt;volume&lt;/em&gt;. Then you did refactoring that reduced the need to have that many credits and want to save money. Or maybe you genuinely had a huge amount of data on your RDS instance volume, removed some of it but got stuck with a huge volume.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Let&#39;s Encrypt on AWS: when, where and why</title>
				<link>https://www.puppeteers.net/blog/lets-encrypt-on-aws-when-where-and-why/</link>
				<pubDate>Wed, 15 Mar 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/lets-encrypt-on-aws-when-where-and-why/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/Canofworms1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s Encrypt on AWS can be a can of worms if you don&amp;rsquo;t know what you&amp;rsquo;re doing. &lt;a href=&#34;https://commons.wikimedia.org/wiki/File:Canofworms1.png&#34;&gt;Photo credit&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/how-it-works/&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; and the ACME protocol enable getting free (as in beer) TLS/SSL certificates. The main use for Let&amp;rsquo;s Encrypt is to enable HTTPS on web servers. Let&amp;rsquo;s Encrypt TLS certificates expire pretty quickly, in 3 months, but the idea is that renewal is automated so that you don&amp;rsquo;t ever really have to worry about expiration, unlike with commercial TLS certificates, which you typically need to manually renew every 12 months. Using Let&amp;rsquo;s Encrypt on &lt;a href=&#34;https://aws.amazon.com&#34;&gt;AWS&lt;/a&gt; is in &lt;em&gt;some cases&lt;/em&gt; a very viable option, but not so much in others. In many cases trying to use Let&amp;rsquo;s Encrypt certificates leads you down the path of Lovecraftian horrors and madness. Because &amp;ldquo;it all depends&amp;rdquo; I&amp;rsquo;ll try to explain when using Let&amp;rsquo;s Encrypt is viable in the AWS context and when you really should &lt;em&gt;just give up&lt;/em&gt; an use certificates generated by the Amazon Certificate Manager (&amp;ldquo;ACM&amp;rdquo;) instead.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wrong Route53 domain contact details</title>
				<link>https://www.puppeteers.net/blog/wrong-route53-domain-contact-details/</link>
				<pubDate>Thu, 02 Mar 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/wrong-route53-domain-contact-details/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/pexels-pixabay-4169741.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-symptoms&#34;&gt;The symptoms&lt;/h2&gt;&#xA;&lt;p&gt;I recently received and email from Amazon Route53 asking me to verify the contact details for one of our registered DNS domains (replaced here with example.org). And sure enough, I saw wrong Route53 domain contact details in the email:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block&#34;&gt;&#xA;    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;&#xA;    &lt;/button&gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Subject: Confirm that contact information for example.org is correct.&#xA;Message body:&#xA;&#xA;Dear AWS customer,&#xA;&#xA;This message is a reminder to help you keep the contact information for your domain registration up to date. WHOIS records include the following information:&#xA;&#xA;  Domains:&#xA;  example.org&#xA;&#xA;  Registrant:&#xA;  Name: On behalf of example.org owner&#xA;  Organization Name: Identity Protection Service&#xA;  Address: PO Box 786&#xA;  City: Hayes&#xA;  State/Province: Middlesex&#xA;  Country: GB&#xA;  Postal Code: UB3 9TR&#xA;&#xA;  Administrative Contact:&#xA;  Name: On behalf of example.org owner&#xA;  Organization Name: Identity Protection Service&#xA;  Address: PO Box 786&#xA;  City: Hayes&#xA;  State/Province: Middlesex&#xA;  Country: GB&#xA;  Postal Code: UB3 9TR&#xA;  Phone: +44.1483307527&#xA;  Fax: +44.1483304031&#xA;  Email: e793d865-97ab-42ab-805c-50cc36fd9202@identity-protect.org&#xA;&#xA;  Technical Contact:&#xA;  Name: On behalf of example.org owner&#xA;  Organization Name: Identity Protection Service&#xA;  Address: PO Box 786&#xA;  City: Hayes&#xA;  State/Province: Middlesex&#xA;  Country: GB&#xA;  Postal Code: UB3 9TR&#xA;  Phone: +44.1483307527&#xA;  Fax: +44.1483304031&#xA;  Email: e793d865-97ab-42ab-805c-50cc36fd9202@identity-protect.org&#xA;&#xA;The contact information provided above is what is shown in the public WHOIS. If your domain is privacy protected, the information will be different than the contact data you have submitted. To verify your contact information, please open the Amazon Route 53 console to view your current contact information and make any necessary corrections:&#xA;https://console.aws.amazon.com/route53/home#DomainDetail:example.org&#xA;&#xA;If your information is accurate, you do not need to take any action.&#xA;&#xA;Important&#xA;Under the terms of your registration agreement, providing false contact data can be grounds for the cancellation of your domain name registration.&#xA;&#xA;Regards,&#xA;Amazon Route 53 &lt;/code&gt;&lt;/pre&gt;&#xA;  &lt;/div&gt;&lt;p&gt;These wrong Route53 domain contact details originate from &lt;a href=&#34;https://en.wikipedia.org/wiki/WHOIS&#34;&gt;whois data&lt;/a&gt; for the registered domain. One might reasonably expect the whois data to match the contact details for AWS Route53 domain. However, in this case the Route 53 contact details were correct, but whois data &lt;em&gt;seemed&lt;/em&gt; to be out of sync with those.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Debugging Terraform AWS UnauthorizedOperation errors</title>
				<link>https://www.puppeteers.net/blog/debugging-terraform-aws-unauthorizedoperation-errors/</link>
				<pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/debugging-terraform-aws-unauthorizedoperation-errors/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/pexels-jake-young-732894.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;causes-for-the-terraform-aws-unauthorizedoperation-errors&#34;&gt;Causes for the Terraform AWS UnauthorizedOperation errors&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.puppeteers.net/learn/what-is-terraform-and-how-does-it-work/&#34;&gt;Terraform&lt;/a&gt; is an &lt;a href=&#34;https://www.puppeteers.net/learn/understanding-infrastructure-as-code-iac/&#34;&gt;infrastructure as code&lt;/a&gt; tool you can use to configure Cloud resources in AWS. When using &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/aws/latest/docs&#34;&gt;Terraform AWS provider&lt;/a&gt; you frequently run into various UnauthorizedOperation errors when creating, modifying or deleting resources. That happens unless you do what you should &lt;em&gt;not&lt;/em&gt; do and let Terraform use an AWS API key tied to an IAM user with full admin privileges. In almost all cases Terraform UnauthorizedOperation errors are caused by missing IAM permissions. It can sometimes be a bit tedious to get to the root cause, because Terraform may not show it in its normal output.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to disable S3 bucket ACLs</title>
				<link>https://www.puppeteers.net/blog/how-to-disable-s3-bucket-acls/</link>
				<pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/how-to-disable-s3-bucket-acls/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://puppeteers-public.hel1.your-objectstorage.com/pexels-david-riano-cortes-975771.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;AWS recommends that you disable S3 bucket ACLs for all new buckets. To understand why some background information is needed.&lt;/p&gt;&#xA;&lt;p&gt;AWS S3 providers two ways to manage access to S3 buckets and objects:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Access policies:&lt;/strong&gt; these are standard IAM policies that you attach to users (&amp;ldquo;user policies&amp;rdquo;) or resources (&amp;ldquo;resource-based policies&amp;rdquo;). IAM policies are the recommended method for managing access to Amazon S3 nowadays.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Access Control Lists (ACLs)&lt;/strong&gt;: ACLs are an older access control method for AWS S3. ACL &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html&#34;&gt;map to IAM permissions&lt;/a&gt;. ACLs works on the bucket and object (file) file.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Terraform, AWS Cloudfront and CNAMEAlreadyExists error</title>
				<link>https://www.puppeteers.net/blog/terraform-aws-cloudfront-and-cnamealreadyexists-error/</link>
				<pubDate>Sat, 17 Sep 2022 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/terraform-aws-cloudfront-and-cnamealreadyexists-error/</guid>
				<description>&lt;p&gt;When you create a distribution, AWS creates several DNS A records with the same name (e.g. &lt;em&gt;d25gma2ea3ckma.cloudfront.net&lt;/em&gt;) which point to IPs the distribution is using. Then, typically, you would define CNAME(s) pointing to that cloudfront.net address in your own DNS. Each Cloudfront distribution has a list of aliases, similar to Subject Alternative Names (&amp;ldquo;SAN&amp;rdquo;) in SSL certificates. The aliases should match the CNAME(s) you&amp;rsquo;ve set in DNS.&lt;/p&gt;&#xA;&lt;p&gt;Now, this is all good until you need to migrate those Cloudfront distributions to, say, a new AWS account. If you attempt to create a new distribution (here with Terraform) with the same alias you will get this error:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Terraform: converting an  aws_instance network interface into an explicitly managed interface</title>
				<link>https://www.puppeteers.net/blog/terraform-converting-an-aws_instance-network-interface-into-an-explicitly-managed-interface/</link>
				<pubDate>Tue, 23 Aug 2022 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/terraform-converting-an-aws_instance-network-interface-into-an-explicitly-managed-interface/</guid>
				<description>&lt;p&gt;The &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance&#34;&gt;aws_instance resource&lt;/a&gt; in Terraform can automatically create the default network interface for you. There are cases, however, when you notice that the default network interface is not enough anymore, and modifying it via the limited aws_instance parameters is not sufficient. In these cases you &lt;em&gt;can&lt;/em&gt; convert the interface into an &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/network_interface&#34;&gt;aws_network_interface resource&lt;/a&gt;, but the process is far from straightforward.&lt;/p&gt;&#xA;&lt;p&gt;The first step is to create a Terraform resource for the network interface:&lt;/p&gt;</description>
			</item>
			<item>
				<title>AWS: creating AMIs from EBS snapshots shared with you</title>
				<link>https://www.puppeteers.net/blog/aws-creating-amis-from-ebs-snapshots-shared-with-you/</link>
				<pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/aws-creating-amis-from-ebs-snapshots-shared-with-you/</guid>
				<description>&lt;p&gt;In AWS &lt;a href=&#34;https://aws.amazon.com/ebs/&#34;&gt;EBS&lt;/a&gt; (&amp;ldquo;Elastic Block Storage&amp;rdquo;) is the underlying technology that (virtual) hard disks of your instances (virtual machines) use. You can take snapshots of those virtual hard disks and use those snapshots to, for example:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Debugging issues with unbootable virtual machines: attach and then mount the snapshot on another virtual machine and investigate what is wrong.&lt;/li&gt;&#xA;&lt;li&gt;Creating AMI images from which you can launch new instances&lt;/li&gt;&#xA;&lt;li&gt;Sharing EBS volumes (between regions and AWS accounts), e.g. for purposes of migrating VMs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here we&amp;rsquo;ll focus on the last use-case: being able to create copies of virtual machines on another AWS account. The reason why I even bothered writing this blog post is that most of the articles on the Internet do not cover this use-case: they assume you&amp;rsquo;re working within one AWS account and/or one region. The use-case covered here requires a few extra steps:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Dealing with multiple AWS accounts with one Keycloak client for Single-Sign On</title>
				<link>https://www.puppeteers.net/blog/dealing-with-multiple-aws-accounts-with-one-keycloak-client-for-single-sign-on/</link>
				<pubDate>Thu, 18 Nov 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/dealing-with-multiple-aws-accounts-with-one-keycloak-client-for-single-sign-on/</guid>
				<description>&lt;p&gt;This article assumes that the user backend for Keycloak is &lt;a href=&#34;https://www.freeipa.org/page/Main_Page&#34;&gt;FreeIPA&lt;/a&gt;. Regardless of that the instructions will apply to any other setup with minor modifications. Here we use two different AWS accounts renamed to 123412341234 and 567856785678 to protect the personal information of the innocent. The Keycloak staging cluster on which this integration was done is called &lt;em&gt;id-staging.example.org&lt;/em&gt; and the production cluster is called &lt;em&gt;id.example.org&lt;/em&gt;. The Keycloak realm is EXAMPLE.ORG. Replace those with the values correct for your environment.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Enabling AWS EC2 instance automatic recovery with Terraform</title>
				<link>https://www.puppeteers.net/blog/enabling-aws-ec2-instance-automatic-recovery-with-terraform/</link>
				<pubDate>Thu, 28 Oct 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/enabling-aws-ec2-instance-automatic-recovery-with-terraform/</guid>
				<description>&lt;p&gt;AWS EC2 instances are subject to two types of status checks (&lt;a href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html&#34;&gt;AWS docs&lt;/a&gt;):&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;System status check (issues with the underlying hardware/networking: &amp;ldquo;the AWS side&amp;rdquo;)&lt;/li&gt;&#xA;&lt;li&gt;Instance status check (issues with the OS, e.g. OOM, file system corruption, broken networking, etc: &amp;ldquo;our side&amp;rdquo;)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://aws.amazon.com/premiumsupport/knowledge-center/automatic-recovery-ec2-cloudwatch/&#34;&gt;official AWS EC2 instance recovery documentation&lt;/a&gt; claims that automatically recovering from an EC2 instance failure is only possible for system status checks, but the AWS documentation &lt;a href=&#34;https://www.percona.com/blog/2021/04/29/improving-percona-monitoring-and-management-ec2-instance-resilience-using-cloudwatch-alarm-actions/&#34;&gt;&lt;/a&gt;is outdated: Cloudwatch metrics are available for both types of check failures and people have set up &lt;a href=&#34;https://www.percona.com/blog/2021/04/29/improving-percona-monitoring-and-management-ec2-instance-resilience-using-cloudwatch-alarm-actions/&#34;&gt;&lt;/a&gt;recovery for both types of failures &lt;a href=&#34;https://www.percona.com/blog/2021/04/29/improving-percona-monitoring-and-management-ec2-instance-resilience-using-cloudwatch-alarm-actions/&#34;&gt;using AWS CLI&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Creating Puppet Bolt groups based on AWS tags</title>
				<link>https://www.puppeteers.net/blog/creating-puppet-bolt-groups-based-on-aws-tags/</link>
				<pubDate>Thu, 01 Jul 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/creating-puppet-bolt-groups-based-on-aws-tags/</guid>
				<description>&lt;p&gt;The &lt;a href=&#34;https://www.puppeteers.net/blog/using-tags-in-puppet-bolt-aws_inventory-target_mapping/&#34;&gt;Using tags in Puppet Bolt aws_inventory target_mapping&lt;/a&gt; showed how to use AWS &amp;ldquo;Name&amp;rdquo; tag as the target name for Puppet Bolt. Use of tags can be extended to creating Bolt target groups:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block&#34;&gt;&#xA;    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;&#xA;    &lt;/button&gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;groups:&#xA;  - name: webservers&#xA;    targets:&#xA;     - _plugin: aws_inventory&#xA;       region:&#xA;         _plugin: env_var&#xA;         var: AWS_DEFAULT_REGION&#xA;       filters:&#xA;         - name: tag:Type&#xA;           values: [webserver]&#xA;       target_mapping:&#xA;         name: tags.Name&#xA;         uri: public_ip_address&lt;/code&gt;&lt;/pre&gt;&#xA;  &lt;/div&gt;&lt;p&gt;All you need to do is add a &amp;ldquo;filter&amp;rdquo; section with one filter. The &amp;ldquo;name&amp;rdquo; parameter tells Bolt that the filter is based on tags and what tag to look for. The &amp;ldquo;Type&amp;rdquo; that follows &amp;ldquo;tag&amp;rdquo; is the name of the tag you want to filter by. The &amp;ldquo;values&amp;rdquo; array lists acceptable values for that tag. Any nodes that don&amp;rsquo;t have the tag (here: &amp;ldquo;Type&amp;rdquo;) or where tag value is not acceptable (e.g. &amp;ldquo;db&amp;rdquo;) will not be shown in the group.&lt;/p&gt;</description>
			</item>
			<item>
				<title>To containerize in AWS or not: the cost perspective</title>
				<link>https://www.puppeteers.net/blog/to-containerize-in-aws-or-not-the-cost-perspective/</link>
				<pubDate>Tue, 15 Jun 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/to-containerize-in-aws-or-not-the-cost-perspective/</guid>
				<description>&lt;p&gt;I recently checked the pricing model for &lt;a href=&#34;https://aws.amazon.com/fargate/?nc=sn&amp;amp;loc=1&amp;amp;whats-new-cards.sort-by=item.additionalFields.postDateTime&amp;amp;whats-new-cards.sort-order=desc&amp;amp;fargate-blogs.sort-by=item.additionalFields.createdDate&amp;amp;fargate-blogs.sort-order=desc&#34;&gt;Amazon Fargate&lt;/a&gt; to see if migrating a fair number of EC2 instance-based workloads to containers would save money. In theory this should have been the case, as a container has less &amp;ldquo;fat&amp;rdquo; compared to a full virtual machine. In this case the workload itself was perfectly suited for a container: a single process with single configuration file that was mostly network-bound running on t3.micro instances.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using tags in Puppet Bolt aws_inventory target_mapping</title>
				<link>https://www.puppeteers.net/blog/using-tags-in-puppet-bolt-aws_inventory-target_mapping/</link>
				<pubDate>Sat, 05 Jun 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/using-tags-in-puppet-bolt-aws_inventory-target_mapping/</guid>
				<description>&lt;p&gt;We&amp;rsquo;re migrating away from Ansible to Puppet Bolt and the fact that Ansible updates broke the old &lt;a href=&#34;https://github.com/ansible/ansible/blob/stable-2.9/contrib/inventory/ec2.py&#34;&gt;ec2.py inventory script&lt;/a&gt; expedited that process. While that inventory script was quite rudimentary, it was able to automatically add human-readable names to the EC2 instance names. So, for example, you could target a node using &amp;ldquo;server_example_org&amp;rdquo; if the Name tag was set to &amp;ldquo;server.example.org&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Puppet Bolt&amp;rsquo;s &lt;a href=&#34;https://github.com/puppetlabs/puppetlabs-aws_inventory&#34;&gt;aws_inventory&lt;/a&gt; &lt;em&gt;seemed&lt;/em&gt; to lack that feature, but after taking a good look at its code this was just a case of missing documentation, which I fixed in &lt;a href=&#34;https://github.com/puppetlabs/puppetlabs-aws_inventory/pull/19&#34;&gt;this PR&lt;/a&gt;. Here&amp;rsquo;s an example of &lt;em&gt;inventory.yaml&lt;/em&gt; for Bolt that maps the value of the &amp;ldquo;Name&amp;rdquo; tag to the name of the Bolt target:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Delegating external parties access to AWS</title>
				<link>https://www.puppeteers.net/blog/delegating-external-parties-access-to-aws/</link>
				<pubDate>Fri, 14 May 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/delegating-external-parties-access-to-aws/</guid>
				<description>&lt;p&gt;This blog post shows how to grant access to an AWS account for some external party. For simplicity we will call this external party a &amp;ldquo;contractor&amp;rdquo;. If you want to do the same for Microsoft Azure look at &lt;a href=&#34;https://www.puppeteers.net/blog/delegating-external-parties-access-to-azure/&#34;&gt;this blog post&lt;/a&gt; instead.&lt;/p&gt;&#xA;&lt;p&gt;This method requires the contractor to have its own AWS account, but it has several benefits:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No need to create AWS user accounts for every single person working for the contractor&lt;/li&gt;&#xA;&lt;li&gt;You can force the contractor&amp;rsquo;s personnel to use two-factor authentication (2FA)&lt;/li&gt;&#xA;&lt;li&gt;You can force the contractor to use an additional password (shared secret)&lt;/li&gt;&#xA;&lt;li&gt;You can disable contractor&amp;rsquo;s access completely by just removing the IAM role&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This approach works equally well for AWS Console access, AWS CLI and tools like Terraform. Some tools may not like the extra security measures required here or be able to assume a role out of the box.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Terraform stalls when recreating security groups</title>
				<link>https://www.puppeteers.net/blog/terraform-stalls-when-recreating-security-groups/</link>
				<pubDate>Tue, 23 Mar 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/terraform-stalls-when-recreating-security-groups/</guid>
				<description>&lt;p&gt;Sometimes Terraform stalls when trying to remove AWS EC2 security groups and Terraform does no give any hint as to what is wrong. The problem is caused by that security group being attached to an EC2 instance or network interface.&lt;/p&gt;&#xA;&lt;p&gt;Interestingly Terraform messes up the order of the AWS API calls even when it (attempts to) remove the security group &lt;em&gt;and&lt;/em&gt; detach it from all EC2 instances that use it. In other words, Terraform tries to remove the security group before it has been detached from the EC2 instances, which results in the stall:&lt;/p&gt;</description>
			</item>
			<item>
				<title>AWS to Azure resource translation table</title>
				<link>https://www.puppeteers.net/blog/aws-to-azure-resource-translation-table/</link>
				<pubDate>Sun, 17 Jan 2021 00:00:00 +0000</pubDate>
				<guid>https://www.puppeteers.net/blog/aws-to-azure-resource-translation-table/</guid>
				<description>&lt;p&gt;We use Terraform for managing our Cloud infrastructure. Our customers typically use AWS and that&amp;rsquo;s what we&amp;rsquo;re most familiar with. Each public Cloud has its own terminology, so this page is a translation table between Terraform resource names in the AWS and Azure providers:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_instance&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_linux_virtual_machine&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_network_interface&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_network_interface&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_security_group&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_network_security_group&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_security_group_rule&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_network_security_rule&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_vpc&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_virtual_network&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_subnet&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_subnet&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;inapplicable&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_resource_group&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;aws_s3_bucket&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;azurerm_storage_account&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;region&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;location&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Mapping of Terraform AWS resource names to Azure resource names&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
