<?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: Nick Triantafillou</title>
    <description>The latest articles on DEV Community by Nick Triantafillou (@xelfer).</description>
    <link>https://dev.to/xelfer</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%2F701335%2Fd86a2482-072d-4006-b3ae-8cfab6cfe722.jpeg</url>
      <title>DEV Community: Nick Triantafillou</title>
      <link>https://dev.to/xelfer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xelfer"/>
    <language>en</language>
    <item>
      <title>Failed to trigger build: set either CLOUD_LOGGING_ONLY / NONE logging options</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Mon, 14 Apr 2025 05:31:06 +0000</pubDate>
      <link>https://dev.to/xelfer/failed-to-trigger-build-set-either-cloudloggingonly-none-logging-options-47fh</link>
      <guid>https://dev.to/xelfer/failed-to-trigger-build-set-either-cloudloggingonly-none-logging-options-47fh</guid>
      <description>&lt;p&gt;I'm usually very AWS but sometimes we have to deal with unfamiliar clouds. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Failed to trigger build: if 'build.service_account' is specified, the build must either (a) specify 'build.logs_bucket', (b) use the REGIONAL_USER_OWNED_BUCKET build.options.default_logs_bucket_behavior option, or (c) use either CLOUD_LOGGING_ONLY / NONE logging options: invalid argument&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Are you hitting this error straight from creating a GCP Cloud Build trigger with absolutely no way to enable CLOUD_LOGGING_ONLY because it's not actually in the UI anywhere for you to edit? &lt;/p&gt;

&lt;p&gt;Well I just spent the last two hours trying to figure this out too. Hopefully I can help you. &lt;/p&gt;

&lt;p&gt;Firstly &lt;a href="https://cloud.google.com/sdk/docs/install" rel="noopener noreferrer"&gt;install the gcloud cli tool&lt;/a&gt; - Apologies but I could not find a way to fix this in the browser. &lt;/p&gt;

&lt;p&gt;Next, dump your configuration to a yaml file&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gcloud beta builds triggers export your-trigger-name --destination=trigger-config.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When I look at my trigger-config.yaml, I have an empty options field:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build:
  images:
  - gcr.io/your-repo:$COMMIT_SHA
  options: {}
  steps:
  - args:
    - build
 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we need to is add &lt;code&gt;logging: CLOUD_LOGGING_ONLY&lt;/code&gt; to this and remove the curly braces. &lt;/p&gt;

&lt;p&gt;It should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build:
  images:
  - gcr.io/your-repo:$COMMIT_SHA
  options:
    logging: CLOUD_LOGGING_ONLY
  steps:
  - args:
    - build
 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the new settings back to the trigger&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cloud beta builds triggers import --source=trigger-config.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you can manually trigger your... trigger and it should succeed. &lt;/p&gt;

</description>
      <category>gcp</category>
      <category>cloud</category>
      <category>build</category>
    </item>
    <item>
      <title>The runtime parameter of nodejs14.x is no longer supported for creating or updating AWS Lambda functions</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Wed, 28 Feb 2024 12:12:46 +0000</pubDate>
      <link>https://dev.to/xelfer/the-runtime-parameter-of-nodejs14x-is-no-longer-supported-for-creating-or-updating-aws-lambda-functions-5db3</link>
      <guid>https://dev.to/xelfer/the-runtime-parameter-of-nodejs14x-is-no-longer-supported-for-creating-or-updating-aws-lambda-functions-5db3</guid>
      <description>&lt;p&gt;On the 25th of February, 2024, AWS made a change:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Starting January 25, 2024, you will no longer be able to update existing functions using the Node.js 14 runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and if you attempt to do so, you hit this error:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;InvalidParameterValueException: The runtime parameter of nodejs14.x is no longer supported for creating or updating AWS Lambda functions&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But I'm not using nodejs14.x to create or update lambda functions. &lt;/p&gt;

&lt;p&gt;Or am I?&lt;/p&gt;

&lt;p&gt;I didn't think I was, my runtimes in AWS CodeBuild and Serverless Framework were all set to 16.. but I was using an extra component with serverless framework.. that component was &lt;a href="https://www.npmjs.com/package/@sls-next/serverless-component" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@sls-next/serverless-component&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and internally somewhere.. this component uses lambda. And those Lambda functions were trying to be created with nodejs 14. &lt;/p&gt;

&lt;p&gt;Thanks to an awesome comment I found on &lt;a href="https://github.com/serverless-nextjs/serverless-next.js/issues/2600#issuecomment-1947781835" rel="noopener noreferrer"&gt;github&lt;/a&gt; I learned you can simply change your internal serverless-component runtime to nodejs20.x and it should fix your issues. It did for me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blah:
  component: "@sls-next/serverless-component"
  stage: dev
  inputs:
    bucketName: ${env.AWS_S3_BUCKET}
    bucketRegion: ap-southeast-2
    cloudfront:
      distributionId: ${env.AWS_CFID}
    runtime:
      defaultLambda: 'nodejs20.x'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy, and the problem goes away. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Test your mySQL / Aurora database with Lambda</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Thu, 22 Feb 2024 23:15:17 +0000</pubDate>
      <link>https://dev.to/aws-heroes/test-your-mysql-aurora-database-with-lambda-4370</link>
      <guid>https://dev.to/aws-heroes/test-your-mysql-aurora-database-with-lambda-4370</guid>
      <description>&lt;p&gt;I couldn't find a completely straight forward lambda function, using NodeJS and AWS SDK v3 to test RDS. &lt;/p&gt;

&lt;p&gt;So here's the one I cobbled together. It logs in and runs 'show tables'. &lt;/p&gt;

&lt;p&gt;It requires a &lt;a href="https://medium.com/@anuragchitti1103/creating-lambda-layer-with-node-js-6a5ecd7c7553" rel="noopener noreferrer"&gt;lambda layer&lt;/a&gt; with the mysql nodejs library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import mysql from 'mysql';

var connection = mysql.createConnection({
    host: "blah.amazonaws.com",
    user: "userName",
    password: "password",
    database: "dbName",
    timezone: 'utc'
});

connection.connect();

export function handler(event, context, callback)  {

    connection.query('show tables', function (error, results, fields) {
        if (error) {
            connection.destroy();
            throw error;
        } else {
            // connected!
            console.log(results);
            callback(error, results);
            connection.end(function (err) { callback(err, results); });
        }
    });
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>lambda</category>
      <category>aws</category>
      <category>aurora</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Allowing an AWS account to delegate DNS subdomains to another account in two simple CDK stacks</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Wed, 12 Jul 2023 10:35:59 +0000</pubDate>
      <link>https://dev.to/aws-builders/allowing-an-aws-account-to-delegate-dns-subdomains-to-another-account-in-two-simple-cdk-stacks-1pcm</link>
      <guid>https://dev.to/aws-builders/allowing-an-aws-account-to-delegate-dns-subdomains-to-another-account-in-two-simple-cdk-stacks-1pcm</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I had an issue this week. I was initializing AWS accounts for our developers and they required a subdomain per account. Think user.blah.com. &lt;/p&gt;

&lt;p&gt;I wanted the developer account to be able to manage all records inside this subdomain, so they could create api.user.blah.com, staging.user.blah.com and so on. And if you manage your own subdomain, you can also generate SSL certificates for them as well. &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%2Fetp2x1tzd7ojk55hs763.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%2Fetp2x1tzd7ojk55hs763.png" alt="Route 53 Logo" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To achieve this with AWS, you simply need to create the hosted zone for the subdomain in Route53, find out which AWS nameservers it was allocated, and then add a 'NS' record for your subdomain using those nameservers in the DNS zone for the parent domain, ie blah.com. &lt;/p&gt;

&lt;p&gt;Now, it sounds simple, but I don't want to do this every time I onboard a new developer. I want it to happen automatically when I deploy the developers initialization stack. Fortunately, it's possible, and not very difficult to implement! &lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;The solution here requires you to be using &lt;a href="https://aws.amazon.com/organizations/" rel="noopener noreferrer"&gt;AWS Organizations&lt;/a&gt; to create AWS accounts for your developers. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Parent Account
&lt;/h3&gt;

&lt;p&gt;Firstly, we create a new CDK project and start editing our lib/stack.ts file. &lt;/p&gt;

&lt;p&gt;I use a parameter I can pass in to my CDK stack to define the domain that will be created in Route53, eg. "blah.com". Lets capture that with CDK first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Get the domain from the user. &lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CfnParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;domain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;String&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The domain to be created. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we're going to create the Route53 Hosted Zone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Create the Route53 zone&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostedZone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;r53&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PublicHostedZone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;zoneName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;domain&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;Now, this is where the magic happens. We're going to create a role that allows every other account which is part of your AWS organization to be able to add a NS record to the hosted zone we just created. Then, we grant the delegation access to the role. Be sure to change the o-xxxxxxx's to your Organization ID, of course.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Create the role&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RootZoneOrganizationRole&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;assumedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrganizationPrincipal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;o-xxxxxxxxxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;roleName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HostedZoneDelegationRole&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Grant the delegation&lt;/span&gt;
    &lt;span class="nx"&gt;hostedZone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grantDelegation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CDK is doing a lot of heavy lifting under the hood here, it creates a role with correct permissions and a trust relationship that allows all the other accounts to do what we need it to do. Anyway, that's all we need for our parent account CDK stack! Save it and deploy it, probably something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cdk deploy &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user.blah.com &lt;span class="nt"&gt;--profile&lt;/span&gt; parent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Child Account
&lt;/h3&gt;

&lt;p&gt;Now we're going to create a stack for the child account, do your cdk init and so on to create another new stack project and get ready to add some code. &lt;/p&gt;

&lt;p&gt;Lets capture the child account domain, in this case it we'll expect user.blah.com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Get the subdomain from the user&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CfnParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;domain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;String&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The subdomain to be created. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the hosted zone in Route53&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Create the Route53 zone&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostedZone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;r53&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PublicHostedZone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;zoneName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;domain&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;Generate the delegation role ARN, specifying the parent account which hosts the blah.com domain&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delegationRoleArn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;formatArn&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1234567890&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;role&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;resourceName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HostedZoneDelegationRole&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iam&lt;/span&gt;&lt;span class="dl"&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;Create the delegation role from this ARN&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delegationRole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromRoleArn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DelegationRole&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delegationRoleArn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now we can add the zone as a delegation record to the parent account Route53:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;r53&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CrossAccountZoneDelegationRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DelegationRecord&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;delegationRole&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;delegatedZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hostedZone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parentHostedZoneName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blah.com&lt;/span&gt;&lt;span class="dl"&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;and that's it! that's all you need! any records added to the hostedZone from this point on will be completely valid, because the parent account now recognizes the child account's route53 configuration as the authority for that subdomain. &lt;/p&gt;

&lt;p&gt;Huge shoutout to AWS Community Builder &lt;a href="https://awscommunity.social/@serverlesscultist" rel="noopener noreferrer"&gt;Matt Morgan&lt;/a&gt; who has created an awesome &lt;a href="https://github.com/aws-community-projects/aws-organization-for-devs" rel="noopener noreferrer"&gt;AWS Organizations for devs&lt;/a&gt; GitHub repository where you can learn about deploying full AWS Organizations! &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using an event-based serverless architecture to run your Christmas lights</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Thu, 02 Feb 2023 06:13:43 +0000</pubDate>
      <link>https://dev.to/aws-builders/using-an-event-based-serverless-architecture-to-run-your-christmas-lights-2lnf</link>
      <guid>https://dev.to/aws-builders/using-an-event-based-serverless-architecture-to-run-your-christmas-lights-2lnf</guid>
      <description>&lt;p&gt;I do &lt;a href="https://twitter.com/AWSCloudANZ/status/1599629849798316035" rel="noopener noreferrer"&gt;insane things with Christmas Lights&lt;/a&gt;, and I'd like to talk about how I used an event-based serverless architecture to implement my voting system. &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%2Fy8pqrw7wi3vt7kfarw2d.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%2Fy8pqrw7wi3vt7kfarw2d.png" alt="Image description" width="451" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  xlights
&lt;/h3&gt;

&lt;p&gt;But first we have to understand how the lights work. Firstly, I use &lt;a href="https://xlights.org" rel="noopener noreferrer"&gt;xlights&lt;/a&gt; to import or make the song/light sequences for my house. It's the most amazing piece of open source software, and completely free. &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%2Feorkmwjr5il4d2m5m19b.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%2Feorkmwjr5il4d2m5m19b.png" alt="Image description" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Falcon Player (FPP)
&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="https://github.com/FalconChristmas/fpp" rel="noopener noreferrer"&gt;Falcon Player&lt;/a&gt; to run my show. This is software running on a Raspberry Pi that I upload my songs and light sequences to from xlights. FPP is configured to know where each light is plugged into on which &lt;a href="https://pixelcontroller.com/store/products/70-f16v4.html" rel="noopener noreferrer"&gt;pixel controller&lt;/a&gt; (small lighting computer). These controllers sit on my network and FPP pushes the data to them to play the songs/light sequences. &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%2Fzwrmugs6uc5vk7eihqiu.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%2Fzwrmugs6uc5vk7eihqiu.png" alt="Image description" width="800" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last year my christmas lights were a free-for-all, it used a timer (based on knowing how long each sequence ran for), and the very first person to tap on a sequence name on my website once the previous timer had finished, got to pick the next song that played. So I'd have 50 people out the front of my house all mashing their phones trying to 'win' selecting the next song. Myself included. It wasn't very fair. So I decided to build a voting system.&lt;/p&gt;

&lt;h3&gt;
  
  
  FPP Command Presets
&lt;/h3&gt;

&lt;p&gt;FPP has one very important function which has enabled the ability to use an event-based architecture. It's a feature called "command presets", where it will run commands when certain events fire. I found one called SEQUENCE_STOPPED which runs whenever a sequence stops, whether it's me clicking stop or it just finishes playing a song, and the commands it can run includes shell scripts. &lt;/p&gt;

&lt;p&gt;So I wrote a shell script called "songfinished.sh", and that's triggered whenever a song finishes. &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%2F91d6j1urdcqp04lkxmjm.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%2F91d6j1urdcqp04lkxmjm.png" alt="Image description" width="800" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No longer am I at the whim of a timer that may or may not be accurate, if a song finishes playing on my house by FPP, it immediately runs my script. &lt;/p&gt;

&lt;p&gt;The contents of my script are simple, it's a single line. A POST to my API Gateway, which triggers an AWS Lambda function:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -X POST https://blah.execute-api.ap-southeast-2.amazonaws.com/songfinished&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The AWS Lambda function being triggered means a song just finished playing on my house. There's no other possible way for it to be triggered. And so, it becomes the brains of my application. &lt;/p&gt;

&lt;p&gt;My song finished AWS lambda function does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;As a double-check, it ensures there's nothing in my status table that thinks it's playing on my house. &lt;/li&gt;
&lt;li&gt;It then ensures no sequences were triggered less than 5 seconds ago. This was due to a race condition I once had during development where things were being triggered multiple times in succession and causing infinite loops. It's not used anymore, but I'm happy to keep it in there just in case. &lt;/li&gt;
&lt;li&gt;It checks my "administrator" table. This is an override where 
I, and only I, am able to choose the next song that's played on my house, no matter what the users vote on. It leaves their votes in the voting table however, so they aren't lost, just delayed by a few minutes.&lt;/li&gt;
&lt;li&gt;It clears the voter IP table, allowing people to vote again due to the current song finishing. &lt;/li&gt;
&lt;li&gt;If there are votes, it tallies them, determines what has the most and triggers the next sequence on my house, and then clears the votes table.&lt;/li&gt;
&lt;li&gt;If there are no votes, it plays my background sequence. &lt;/li&gt;
&lt;/ol&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%2Fyiomfsdoqquy50dzntfe.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%2Fyiomfsdoqquy50dzntfe.png" alt="Image description" width="700" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, it's quite a busy function, but split into these smaller steps it wasn't too difficult to implement. &lt;/p&gt;

&lt;p&gt;At the time of writing it's currently the 21st of December and my event based system is working flawlessly each night as hundreds of people visit my house. &lt;/p&gt;

&lt;p&gt;Here's the current vote tally, with the theme to &lt;a href="https://www.bluey.tv/" rel="noopener noreferrer"&gt;Bluey&lt;/a&gt; coming in at over 100 requests already! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.imgur.com/5Gu9fVc.png" rel="noopener noreferrer"&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%2Fxbp5hwb28fncgo5i2lqk.png" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait up... I mentioned I did this &lt;em&gt;serverlessly&lt;/em&gt;.. which bit is serverless? well, all of it. I implemented it all using &lt;a href="https://sst.dev/" rel="noopener noreferrer"&gt;Serverless Stack&lt;/a&gt; and &lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt;. Both are amazing pieces of technology to build a web app with, even for a newbie developer like me. Check out their tutorials, I literally built my entire app starting from &lt;a href="https://sst.dev/examples/how-to-create-a-svelte-app-with-serverless.html" rel="noopener noreferrer"&gt;this simple example&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Want to see the results in action? check out my &lt;a href="https://twitter.com/AWSCloudANZ/status/1599629849798316035" rel="noopener noreferrer"&gt;dev:Ember video&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;A final call to all my readers: is there a better way to do this? I'm always interested in learning about features or better ways to implement something. It's all part of my learning process! Please reach out on &lt;a href="https://twitter.com/xelfer" rel="noopener noreferrer"&gt;twitter&lt;/a&gt; or leave a comment here if you have any suggestions on how to improve my workflow!&lt;/p&gt;

&lt;p&gt;Two things I'm already aware of that I'd like to improve: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Auto expiring records&lt;/li&gt;
&lt;li&gt;Using step functions instead of a fat lambda function&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Merry Christmas!&lt;br&gt;
Nick&lt;/p&gt;

</description>
    </item>
    <item>
      <title>re:Invent Swag guide</title>
      <dc:creator>Nick Triantafillou</dc:creator>
      <pubDate>Mon, 21 Nov 2022 04:59:17 +0000</pubDate>
      <link>https://dev.to/aws-builders/reinvent-swag-guide-3j3p</link>
      <guid>https://dev.to/aws-builders/reinvent-swag-guide-3j3p</guid>
      <description>&lt;p&gt;In &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2024-swag-review-5251b998e109" rel="noopener noreferrer"&gt;2024&lt;/a&gt;, &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2023-swag-review-0dfb3e6f9fcf" rel="noopener noreferrer"&gt;!2023&lt;/a&gt;, &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2022-swag-review-b9f908028e9c" rel="noopener noreferrer"&gt;2022&lt;/a&gt;, &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2019-swag-review-177f8f7ce58e" rel="noopener noreferrer"&gt;2019&lt;/a&gt;, &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2018-swag-review-f3ff2e00ef4c" rel="noopener noreferrer"&gt;2018&lt;/a&gt;, &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2017-swag-review-4adbdbb86ffb" rel="noopener noreferrer"&gt;2017&lt;/a&gt; and &lt;a href="https://medium.com/@ntriantafillou/aws-re-invent-2016-swag-review-ed1403d8b4f4" rel="noopener noreferrer"&gt;2016&lt;/a&gt; I attended (or didn't) the largest cloud conference in the world, AWS re:Invent. And while some people love the networking, the tech sessions, the keynotes and the parties.. I come for the swag. I love to see what's on offer, what's new, what's exciting and what everyone is lining up hours for. So each year, I write my swag review posts (linked above for each year) to showcase what's available. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is swag?
&lt;/h2&gt;

&lt;p&gt;Put simply: swag is free stuff companies give out, to thank you for giving them your email address and phone number they'll pass on to their sales team, to make you remember they exist, to reward you for listening to their sales pitch, or they just want to get rid of so stuff they don't have to ship 36 boxes of fidget spinners back to the office.&lt;/p&gt;

&lt;p&gt;But how does one go about obtaining all this swag? Well, I thought it would be a good idea to give a little tutorial on how it works and how to actually obtain it all. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade Hall
&lt;/h2&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%2Fkxfw3zitzvxkm24ll3ul.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%2Fkxfw3zitzvxkm24ll3ul.jpg" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The re:Invent Expo, or Trade Hall, is ground zero of swag. It's where all of the companies are setup, in a single massive room, ready to talk to you about their product, ready to give out swag and ready to scan your badge. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Pro tip: Change your re:Invent badge email address from &lt;a href="mailto:yourname@domain.com"&gt;yourname@domain.com&lt;/a&gt; to &lt;a href="mailto:yourname+reinvent@domain.com"&gt;yourname+reinvent@domain.com&lt;/a&gt; (assuming your email server supports + tagging). It makes filtering out the hundreds of emails you're about to get super easy. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's located in the Sands Expo and Convention Center, which is the second to bottom level of the Venetian. Follow the signs to the Sands Expo and you'll find it in no time. Especially when you have these banners all over the place. &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%2Fqlwjp43yabbiuyw0ktni.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%2Fqlwjp43yabbiuyw0ktni.jpg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Before you start
&lt;/h3&gt;

&lt;p&gt;Make sure you can get the items home! Some things are big! Light sabers, massive Lego kits. You don't want to be that guy blocking everyone at airport security with your light saber that will end up in a bin. Think first before grabbing and you won't have issues later. &lt;/p&gt;

&lt;h3&gt;
  
  
  Where to start?
&lt;/h3&gt;

&lt;p&gt;So, where do you start in the Trade Hall? well, it's really up to you. Some might visit it methodically, row by row, company by company, and some might just go wherever something catches their eye. It can be really easy to get lost amongst the shiny display stands that these companies are throwing thousands of dollars at, to attract your attention and to get you to use their product. &lt;/p&gt;

&lt;p&gt;If you don't want to miss anything, go row by row. If a large booth has put you out of the row you should be on, make sure you go back to it or you'll start wandering aimlessly. &lt;/p&gt;

&lt;p&gt;If you want to plan your visits around raffles and such, here's a &lt;a href="https://conferenceparties.com/reinvent2023/vendors/" rel="noopener noreferrer"&gt;huge list of sponsors&lt;/a&gt; who will be exhibiting in the hall. &lt;/p&gt;

&lt;h3&gt;
  
  
  What to talk about?
&lt;/h3&gt;

&lt;p&gt;If you want swag, it's polite to at least talk to the people at the booths. They're at this event just like you, excited to be around a lot of people and promote what they've spent their years working on. I've seen people grab (or steal) swag right off the booth shelves and just walk away immediately. It leaves a horrible impression and no one likes that. So, have a chat, be nice, and it's likely you'll be offered or begged to take whatever swag you have your eye on! And if they don't offer, it never hurts to ask! &lt;/p&gt;

&lt;h3&gt;
  
  
  What can I get?
&lt;/h3&gt;

&lt;p&gt;If you haven't clicked on my previous years links I recommend you do, but some of the whackiest and coolest things I've seen are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coffee beans&lt;/li&gt;
&lt;li&gt;A hammock&lt;/li&gt;
&lt;li&gt;VR Goggles&lt;/li&gt;
&lt;li&gt;Custom screen-printed shirts&lt;/li&gt;
&lt;li&gt;Cutlery! I have a Serverless Spoon and Fork from the AWS Stand&lt;/li&gt;
&lt;li&gt;Xbox/PS4/PS5/Nintendo Switch/other gaming consoles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Competitions
&lt;/h3&gt;

&lt;p&gt;There are LOADS of booths with competitions that run throughout the week. Some give away Nintendo Switches on the hour, every hour. Some, Apple watches, Drones, Lego sets, VR headsets and even guitars! The list goes on and on. If you enter these by scanning your badge or by taking a number from the booth, set a reminder or alarm on your phone so you remember to go back to the booth, because if you aren't there to respond in 10 seconds, they'll go to the next person until a winner is present. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Swag Bar
&lt;/h3&gt;

&lt;p&gt;Just outside the trade hall is usually a swag bar that looks like this: &lt;br&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%2Fakrj8y47b1xayxdbjtb8.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%2Fakrj8y47b1xayxdbjtb8.jpg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one of the places you can get your badge and your hoodie, and some years a refillable drink bottle. &lt;/p&gt;

&lt;p&gt;Usually if you attend a talk/session and give feedback in the AWS Events app, you'll get some swag bar credits where they'll give you t-shirts and other cool things. One year they gave out lots of pins (seriously I got about 200). So visit the nice ladies and gents at the swag bar and you'll be sure to get some cool stuff!&lt;/p&gt;

&lt;h3&gt;
  
  
  Tokens
&lt;/h3&gt;

&lt;p&gt;In the trade hall there as a gigantic section dedicated to AWS itself, full of helpful AWS staff members ready to answer questions about anything. They sometimes give out tokens that you can bring to the swag bar to receive even more swag!&lt;/p&gt;

&lt;h3&gt;
  
  
  The last day
&lt;/h3&gt;

&lt;p&gt;On the last day of the trade hall session, the vendors kind of hate having to ship any leftovers back to their office. So they start being a lot more lenient in giving away stuff. Be sure to be around on Thursday afternoon to snap up everything you had your eyes on during the week but couldn't get! &lt;/p&gt;

&lt;h3&gt;
  
  
  Donation Points
&lt;/h3&gt;

&lt;p&gt;There are donation points to drop off swag that you may have collected, but changed your mind on. I believe these items may be donated instead of dumped into landfill, so be sure not to just throw things out if you no longer want them. &lt;/p&gt;

&lt;h2&gt;
  
  
  Events
&lt;/h2&gt;

&lt;h3&gt;
  
  
  After hours Parties/Receptions
&lt;/h3&gt;

&lt;p&gt;There are other events running throughout the week which will have swag too. Each bar hosting an event will be sponsored by a company, and those companies will give away swag. Be sure to attend as many as possible to get cool stuff! &lt;a href="https://conferenceparties.com/reinvent2024/" rel="noopener noreferrer"&gt;https://conferenceparties.com/reinvent2024/&lt;/a&gt; has a massive list of what you can sign up for each year.&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%2Ff8wmx2vgfpl484z2umdh.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%2Ff8wmx2vgfpl484z2umdh.jpg" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The 5k
&lt;/h3&gt;

&lt;p&gt;In previous years the re:Invent 5K charity run has come with a free t-shirt as part of the entry cost. I am unsure if that's still a reward this year, as the charity run is now free to enter. Check your re:Invent registration portal for more information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Certification
&lt;/h3&gt;

&lt;p&gt;Are you AWS Certified? Find the AWS certification lounge, they usually have some awesome swag! previously there has been a photo booth and a lego minifig you could create of yourself. &lt;/p&gt;

&lt;h3&gt;
  
  
  re:Play
&lt;/h3&gt;

&lt;p&gt;re:Play is the end of conference party, held on Thursday night. There's always giveaways in the form of one to three different shirt designs. Get in early, as sizes go quick!&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%2Floenetci13g2i728a0ad.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%2Floenetci13g2i728a0ad.jpg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Alexa Stands
&lt;/h3&gt;

&lt;p&gt;Not as much of a flagship product anymore,  but in the past the Alexa stands have had some awesome giveaways, be sure to look around and see if they're there this year with goodies to collect!&lt;/p&gt;

&lt;h2&gt;
  
  
  Workshops
&lt;/h2&gt;

&lt;p&gt;In certain workshops, sometimes the devices used in the workshop are given away for free. In the past I have received a DeepLens and a DeepRacer. It is very difficult to get into these workshops, but see what you can do!&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Merch Store
&lt;/h2&gt;

&lt;p&gt;Technically not swag if you have to pay for it, but AWS have some cool stuff in their new &lt;a href="https://www.awsgearshop.com/" rel="noopener noreferrer"&gt;merch store&lt;/a&gt;, which will have a stand set up in the expo hall! &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%2F00w5paf45fjvim3lp59e.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%2F00w5paf45fjvim3lp59e.png" alt=" " width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Have I missed anything?
&lt;/h2&gt;

&lt;p&gt;Are you also crazy about swag? Did I miss a swagful event I should have mentioned? Please let me know and I'll add it to my list!&lt;/p&gt;

&lt;h2&gt;
  
  
  Are you a vendor and want to be in my swag review?
&lt;/h2&gt;

&lt;p&gt;Please &lt;a href="https://twitter.com/xelfer" rel="noopener noreferrer"&gt;reach out&lt;/a&gt; and let me know if you want me to visit your booth and add you to my swag review! Chances are I will anyway, but it's nice to be invited instead of looked upon strangely as I take photos of your wares. ;-) &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, if it's your first visit or you've been there before, there is likely a whole load of swag waiting for you to collect. Try to contain yourself, as of 2019 I only take the really awesome stuff, as I still have roughly 50 pairs of socks and 30 t-shirts I haven't yet got to from my past few re:Invent visits. &lt;/p&gt;

&lt;p&gt;If you're bored around the trade hall, be sure to &lt;a href="https://twitter.com/xelfer" rel="noopener noreferrer"&gt;find me&lt;/a&gt; and say hi! I'll be the guy at all the booths. &lt;/p&gt;

</description>
      <category>aws</category>
      <category>reinvent</category>
      <category>swag</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
