<?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: michal salanci</title>
    <description>The latest articles on DEV Community by michal salanci (@michalsalanci).</description>
    <link>https://dev.to/michalsalanci</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%2F1237383%2F7c9520d5-3db3-45d2-a6ac-1cf921b9609b.jpg</url>
      <title>DEV Community: michal salanci</title>
      <link>https://dev.to/michalsalanci</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michalsalanci"/>
    <language>en</language>
    <item>
      <title>A small guide how to start AWS Community Day from scratch</title>
      <dc:creator>michal salanci</dc:creator>
      <pubDate>Tue, 10 Jun 2025 18:51:02 +0000</pubDate>
      <link>https://dev.to/aws-builders/a-small-guide-how-to-start-aws-community-day-from-scratch-3ehk</link>
      <guid>https://dev.to/aws-builders/a-small-guide-how-to-start-aws-community-day-from-scratch-3ehk</guid>
      <description>&lt;p&gt;AWS Community Day is a one day, community led conference, totally organized by AWS community. It is a great way to bringing AWS conference into your town or country...&lt;/p&gt;

&lt;p&gt;This type of event is organized by AWS Community, from the biggest one as &lt;a href="https://www.aws-community.de/" rel="noopener noreferrer"&gt;AWS Community Day DACH&lt;/a&gt;, organized by multiple AWS User Groups from multiple countries, to the smallest one organized by a single AWS User Group like &lt;a href="https://www.awscommunityday.sk/" rel="noopener noreferrer"&gt;AWS Community Day Slovakia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I created this article is based on how we prepared the &lt;a href="https://www.awscommunityday.sk/" rel="noopener noreferrer"&gt;AWS Community Day Slovakia&lt;/a&gt; for the first time, what we have to deal with and how it did go at the end.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Web page
&lt;/h2&gt;

&lt;p&gt;This is one of the first things you are going to need. It's up to you whether you create your own or use some template. We used a &lt;a href="https://github.com/awsugnl/hugo-theme-aws-community-day" rel="noopener noreferrer"&gt;hugo template&lt;/a&gt;, which was created by &lt;a href="https://awsug.nl/" rel="noopener noreferrer"&gt;AWS User Group Nederland&lt;/a&gt; and is available for other AWS Community Day organizers. 🙏👏&lt;br&gt;
This is our &lt;a href="https://2025.awscommunityday.sk/" rel="noopener noreferrer"&gt;page&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registation&lt;/strong&gt;&lt;br&gt;
There are plenty of tools you can use for registration, such as: &lt;a href="https://www.eventbrite.com/" rel="noopener noreferrer"&gt;Eventbrite&lt;/a&gt;, &lt;a href="https://konfhub.com/" rel="noopener noreferrer"&gt;Konfhub&lt;/a&gt;, &lt;a href="https://docs.google.com/forms/u/0/" rel="noopener noreferrer"&gt;Google forms&lt;/a&gt; and  many of others. We decided to go with Eventbrite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Call for speakers&lt;/strong&gt;&lt;br&gt;
This is same as with meetups, most people use &lt;a href="https://sessionize.com/" rel="noopener noreferrer"&gt;Sessionize&lt;/a&gt;, or &lt;a href="https://docs.google.com/forms/u/0/" rel="noopener noreferrer"&gt;Google forms&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS support
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Community Day page&lt;/strong&gt;&lt;br&gt;
Make sure to to over this &lt;a href="https://aws.amazon.com/events/community-day/?developer-center-activities-cards.sort-by=item.additionalFields.startDateTime&amp;amp;developer-center-activities-cards.sort-order=asc" rel="noopener noreferrer"&gt;page&lt;/a&gt;, where you can find basic information about AWS Community Day concept, FAQs, etc...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Downloadable content&lt;/strong&gt;&lt;br&gt;
AWS provide some downloadable content, which can be very helpful with planing and organizing your community day:&lt;br&gt;
&lt;a href="https://files.slack.com/files-pri/T04DP7TRJ-F077YCRBX8F/download/ug_toolkit.zip?origin_team=T04DP7TRJ" rel="noopener noreferrer"&gt;UG_toolkit.zip&lt;/a&gt; is very handy content of files containing templates, fonts, etc..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack channel&lt;/strong&gt;&lt;br&gt;
Make sure to follow the Slack channel &lt;a href="https://aws-usergroup-leaders.slack.com/archives/CPTLW2V2N" rel="noopener noreferrer"&gt;community-day-organizers&lt;/a&gt;, where above many other stuff you can find a list of other community days, so you all got coordinated like not to schedule the community day in the same region on the same day, etc...&lt;/p&gt;

&lt;p&gt;Also, in the same channel you can find information how to ask for funding - yes, AWS can provide some 💵 for you.😉&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The event
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Attendees estimation&lt;/strong&gt;&lt;br&gt;
This is pretty tricky, especially if you are doing it for the first time.&lt;/p&gt;

&lt;p&gt;Try to look at:&lt;/p&gt;

&lt;h5&gt;
  
  
  - How big your community(s) is.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - How many people attend the meetup(s).
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - How are much and how far are people willing to travel.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - How good your marketing was (will talk about that later).
&lt;/h5&gt;

&lt;p&gt;Please be realistic and rather expect less and be surprised, than expect "summit style attendance" and be disappointed. &lt;/p&gt;

&lt;p&gt;An example from us: Our Community Day was organized only by a single &lt;a href="https://www.meetup.com/aws-user-group-kosice/" rel="noopener noreferrer"&gt;User Group&lt;/a&gt; having 200+ members and the meetups attendance is between 40 and 80.&lt;br&gt;
The willing to travel is not that high.&lt;/p&gt;

&lt;p&gt;So we started low, and thought that if highest meetup attendance was 80 out of 200, for a community day we can aim for 120 - 150 attendees (at the end we got 166).&lt;/p&gt;

&lt;p&gt;This is almost pure alchemy 🤯 as there are other variables that comes into play like weather (during the storm you should expect less, during the super nice sunny weather probably as well, etc...), but some guesses can be done.&lt;/p&gt;

&lt;p&gt;...and don't be surprised, if you see a registration boom on the last day(s) before the event starts. 😀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The venue&lt;/strong&gt;&lt;br&gt;
The venue should be selected based on the number of attendees you expect and have to choose the venue that can dynamically work with number of attendees.Let's say you estimated it to 150, so they (or you) must be capable to adapt the venue for 100 people and same for 200 people, by different type of seating.&lt;/p&gt;

&lt;p&gt;Count at least +2 rooms more. You gonna need one room for storage which can be also used as your '3 minutes quiet&amp;amp;chill out room' (thank me later), another room should be reserved for the speakers.&lt;/p&gt;

&lt;p&gt;Also make sure the &lt;strong&gt;expo&lt;/strong&gt; won't be isolated too much from where people are gathered. This is not what you want - You want the people to interact with the sponsors. That said, it's not the best idea to have expo on the other floor than the sessions are. Ideally when people get out of the session, or going from one room to another they should cross the expo area. Good plan is to get the food and drink tables directly to the expo as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catering&lt;/strong&gt;&lt;br&gt;
This is a full day conference, where people expect some refreshment but don't overthink it. Of course it depends on the eating habits in particular country, we did snack, lunch, snack.&lt;br&gt;
Make sure to also put some refreshment to speakers room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tracks&lt;/strong&gt;&lt;br&gt;
Don't be the overthinker here - less is more. The more tracks or rooms you create, the less people you have in each. It's tempting to have 4-5 tracks in the same time, but really think about it before you do.&lt;br&gt;
I must admit, we did a bad job in that. Expecting 150 people, we created 4 tracks which was not the best idea. Yes, venue can make them look that even with 40 people the 100-chair room looks almost full, but the people were complaining they had to do a hard decision to choose between the sessions they really wanted to attend.&lt;/p&gt;

&lt;p&gt;This may lead you to another double edged sword - to stream or record the sessions. We decided not to do it, even if recording seems like a good idea for those who had to choose between the sessions. Maybe I am wrong, but if the sessions are recorded, what would make people to  come?&lt;/p&gt;

&lt;p&gt;What about the track format? It's up to you, but usually what I saw on previous community days or summits I attended, we choose &lt;strong&gt;1 hour format&lt;/strong&gt; per speaker&lt;/p&gt;

&lt;h5&gt;
  
  
  - 30 minutes session
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - 15 minutes for Q/A after session
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - 15 minutes break for another speaker to prepare and for attendees to walk the expo and have something to drink
&lt;/h5&gt;

&lt;p&gt;It may seem like too generous time, but don't forget you have the &lt;strong&gt;sponsors&lt;/strong&gt; out there at the expo, and they are expecting people to come.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
With all the snack and lunch breaks, this is how our whole day looked  like:&lt;/p&gt;

&lt;h5&gt;
  
  
  08:00: Start of the registrations
&lt;/h5&gt;

&lt;h5&gt;
  
  
  09:00 - 09:15: Organizers intro speech
&lt;/h5&gt;

&lt;h5&gt;
  
  
  09:15 - 10:00: Keynote
&lt;/h5&gt;

&lt;h5&gt;
  
  
  10:00 - 10:30: Snack break at the expo
&lt;/h5&gt;

&lt;h5&gt;
  
  
  10:30 - 11:15: Sessions slot 1
&lt;/h5&gt;

&lt;h5&gt;
  
  
  11:30 - 12:15: Sessions slot 2
&lt;/h5&gt;

&lt;h5&gt;
  
  
  12:15 - 13:00: Lunch at the Expo
&lt;/h5&gt;

&lt;h5&gt;
  
  
  13:00 - 13:45: Sessions slot 3
&lt;/h5&gt;

&lt;h5&gt;
  
  
  14:00 - 14:45: Sessions slot 4
&lt;/h5&gt;

&lt;h5&gt;
  
  
  14:45 - 15:15: Snack break at the expo
&lt;/h5&gt;

&lt;h5&gt;
  
  
  15:15 - 16:00: Sessions slot 5
&lt;/h5&gt;

&lt;h5&gt;
  
  
  16:20 - 16:30: Thank you from organizers
&lt;/h5&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Planned start&lt;/strong&gt;&lt;br&gt;
This is very much dependent on when people used to start to work and how punctual they are. In Slovakia people usually start to work between 8am and 9am, and we are pretty punctual. But I can imagine in  some countries 9am is pretty soon, so I would not plan keynote there.  &lt;/p&gt;

&lt;p&gt;We opened a registration at 8:00am, at 9:00 started a short welcome speech from the organizers, followed by the keynote at 9:15am When keynote started, more than 2/3 of the attendees were already there. Having a different habits, I would think about starting with one or two sessions, and then kick a keynote.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Speakers&lt;/strong&gt;&lt;br&gt;
We believe in equal opportunities, so we tried to create a good mix between AWS employees, kickass experienced speakers from community and new speakers (everyone started somehow, and this is good opportunity). Also we tried to find balance between international and domestic speakers.&lt;br&gt;
Make sure to communicate with speakers about their preferred time of their presentation (morning/afternoon).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free or paid&lt;/strong&gt;&lt;br&gt;
The community day organizers are always dealing with this one... and there is no right or wrong way. Both have pros and cons.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paid Event&lt;/em&gt; - Even symbolic price can reduce the no-shows (ratio between registered and the ones that actually showed-up) and increase the budget you get. But there is a chance you have to pay taxes, as you are creating the profit.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Free Event&lt;/em&gt; - Prepare yourself for a no-shows... 😬 It's frustrating, but it is what is is. &lt;/p&gt;

&lt;p&gt;We decided to go free and we experienced about 40% no-shows.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Marketing
&lt;/h2&gt;

&lt;p&gt;This is probably something we underestimated a lot. I think having proper marketing, would end up in more attendees. We received a lot of feedback that people knew about the even only by coincidence or from 'friend of a friend...'&lt;br&gt;
Creating a &lt;a href="https://www.linkedin.com/company/aws-community-day-slovakia/about/?viewAsMember=true" rel="noopener noreferrer"&gt;linkedin group&lt;/a&gt; and &lt;a href="https://www.meetup.com/aws-user-group-kosice/events/306752911/?eventOrigin=your_events" rel="noopener noreferrer"&gt;meetup.com page&lt;/a&gt; is apparently not enough. Next year we will get more focus on that topic.&lt;/p&gt;

&lt;p&gt;This is also something you can ask your sponsors to help you with.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsors
&lt;/h2&gt;

&lt;p&gt;Speaking of sponsors, they are the one filling your budget, so make sure to:&lt;/p&gt;

&lt;h5&gt;
  
  
  - Contact local companies and big players as well.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - Prepare nice introduction email.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - Prepare a contract and signing method, like &lt;a href="https://www.docusign.com/" rel="noopener noreferrer"&gt;docusign&lt;/a&gt;, or others.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - Create a venue plan and send it to them so they know what to expect.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  - Some of the sponsors are eligible for &lt;em&gt;MDF funding&lt;/em&gt; - a special budget they can claim from AWS. More information can be found in this &lt;a href="https://aws-communitybuilders.slack.com/archives/CPTLW2V2N/p1737545664434789" rel="noopener noreferrer"&gt;slack thread&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;Be creative and come up with some sponsor packages with multiple benefits, so sponsors have some options to choose from.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Things you thought you never deal with, but you will 😂
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How to get the money&lt;/strong&gt;&lt;br&gt;
You can't get the sponsorship money just like this (I wish I could🤣). For that you need some &lt;strong&gt;company&lt;/strong&gt;, or &lt;strong&gt;civic association&lt;/strong&gt;, or something similar. It's up to you, everything have pros and cons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organization team&lt;/strong&gt;&lt;br&gt;
It's up to you, but I would say for small community day 2-3 people may be enough. We started 2 people team, then we asked another friend to join us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volunteers&lt;/strong&gt;&lt;br&gt;
Volunteers are very helpful, at least for registering and other stuff too. Try to ask the sponsors if they can allocate some people for you, maybe for additional benefit or so. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event manager&lt;/strong&gt;&lt;br&gt;
Same goes for event manager. If you can afford event manager, or sponsor is able to allocate one for you, by all means take it. Having an event manager, you don't have to deal with things like (which we had to deal with):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Badges: pre-printed or stickers?&lt;/strong&gt;&lt;br&gt;
We did not want to go the way to pre-print the badges with names. We rather ordered empty badges, and printed the stickers ourselves. The reason for that was that we were expecting some no-shows and also the emopty badges can be used next year. So we ordered the empty ones and  just pre-printed the stickers with names of the attendees.&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%2Fkj40omz7v1yyw7kn8pf5.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%2Fkj40omz7v1yyw7kn8pf5.jpg" alt="Image description" width="800" height="1420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Printers&lt;/strong&gt;&lt;br&gt;
We had many discussions if to buy or borrow and at the end we decided to  buy one, which we can use next years. The one that we voted for was &lt;strong&gt;Brother QL-820NWBc&lt;/strong&gt;, because this is the one multiple computers can share.&lt;/p&gt;

&lt;p&gt;Earlier I mentioned the speakers' room. Having a printer can solve the problem who should be allowed into the speakers' room. Marking speakers and organizers on their badges will make it easier, as on picture above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lanyards&lt;/strong&gt;&lt;br&gt;
This is also something you can get from the sponsor, but we didn't want to go that way. We wanted to distinguish between Speakers, Sponsors, Attendees and Organizers - and we did it with different lanyard colors: Red for organizers, Orange for Sponsors, Black for attendees and speakers. Same lanyards can be used next year if you have some left.&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%2Fxtcv8v15uhofceo7c68q.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%2Fxtcv8v15uhofceo7c68q.jpg" alt="Image description" width="800" height="1523"&gt;&lt;/a&gt;&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%2F6hrsmlp16r780qs6vmqr.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%2F6hrsmlp16r780qs6vmqr.jpg" alt="Image description" width="800" height="1066"&gt;&lt;/a&gt;&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%2Fntb79sa4el2nd47um5sp.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%2Fntb79sa4el2nd47um5sp.jpg" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&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%2F8hvqjij13nth9oiv8jn7.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%2F8hvqjij13nth9oiv8jn7.jpg" alt="Image description" width="800" height="926"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some more advices at the end
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Communication channel&lt;/strong&gt;&lt;br&gt;
This is a must have. For official announcements before the event, we used Slack with closed channel only for speakers and organizers.&lt;/p&gt;

&lt;p&gt;We also created WhatsApp channel between speakers and organizers for quick updates during the day.&lt;/p&gt;

&lt;p&gt;Sepparate WhatsApp channel between organizers and volunteers is also good idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speakers' slides&lt;/strong&gt;&lt;br&gt;
Surprisingly (or maybe not 🤣), many of the attendees asked for a slides. Communicate that with speakers, and if they are ok with providing them, put them on the website after the event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speakers' dinner&lt;/strong&gt;&lt;br&gt;
Either sponsored, or paid by your budget - I definitely vote for yes. This is a great way to know your speakers, also they can meet each other before and have some food, drinks and a good time.&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%2F7dl51r42py425otz26ym.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%2F7dl51r42py425otz26ym.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;People being people 🫣&lt;/strong&gt;&lt;br&gt;
There is always someone not ok with something, requesting something, need something... Prepare for that. Even is you think you prepared everything, there is always something.😅&lt;br&gt;
&lt;br&gt;&lt;br&gt;
All being said, organizing AWS Community Day is a lot of fun, but also a hard work to do. It took us 6 months of work, from idea that we are doing that, to the actual event.&lt;/p&gt;

&lt;p&gt;If you are still thinking if to do it or not - by all means we say &lt;strong&gt;Yes, go for it!&lt;/strong&gt; 😉&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscommunity</category>
      <category>awscommunityday</category>
      <category>community</category>
    </item>
    <item>
      <title>I migrated my private Github repo to AWS CodeCommit</title>
      <dc:creator>michal salanci</dc:creator>
      <pubDate>Sun, 25 Feb 2024 15:42:09 +0000</pubDate>
      <link>https://dev.to/aws-builders/i-migrated-my-private-github-repo-to-aws-codecommit-2l6b</link>
      <guid>https://dev.to/aws-builders/i-migrated-my-private-github-repo-to-aws-codecommit-2l6b</guid>
      <description>&lt;p&gt;I am using GitHub a lot as my private and public repositories. Especially those private ones are used only as an "archive" of my files, with version control. So why not have it in AWS CodeCommit?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS CodeCommit&lt;/strong&gt;&lt;br&gt;
AWS CodeCommit is fully managed, highly available source control service that hosts private git repositories. Just like Github, data is encrypted in transit using SSH or HTTPS. There is also encryption at rest using AWS Key Management Service (AWS KMS). There is an option to use an AWS managed key for this encryption (by default), or to create and use your own customer managed key.&lt;br&gt;
Behind the scene, AWS CodeCommit stores your repositories in Amazon S3 and Amazon DynamoDB and the data data is redundantly stored across multiple facilities.&lt;br&gt;
To migrate the data from Github (or any other git service) to AWS CodeCommit, all you need is AWS Account.&lt;br&gt;
Migrating to AWS CodeCommit keeps all your previous commits and branches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 1 - GitHub repository&lt;/strong&gt;&lt;br&gt;
In this section, I will create the Github repo from scratch.&lt;br&gt;
If you already have a GitHub repo, just skip this section and continue to &lt;strong&gt;Part 2&lt;/strong&gt;.&lt;br&gt;
Let's create some GitHub repo, do some commits and a new branch.&lt;/p&gt;

&lt;p&gt;In your GitHUb account, navigate to &lt;em&gt;Repositories&lt;/em&gt; and hit &lt;em&gt;New&lt;/em&gt;.&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%2F0agqfhtw8o75131rt2wv.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%2F0agqfhtw8o75131rt2wv.png" alt="Image description" width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose a name whatever you like, I chose 'myfilesbackup' and make sure the repo is private.&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%2F4nqhjqc6kdf4wefntzza.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%2F4nqhjqc6kdf4wefntzza.png" alt="Image description" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the Github repo is created, we can push our files there.&lt;br&gt;
For start I created this simple file structure:&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%2Ff3958wk4hhqs2ohw3w9t.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%2Ff3958wk4hhqs2ohw3w9t.png" alt="Image description" width="704" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's &lt;em&gt;initialize&lt;/em&gt; git:&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%2Fonhvaxpfaioxv6ulzyl8.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%2Fonhvaxpfaioxv6ulzyl8.png" alt="Image description" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the Github repository as a remote to your local repository.&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%2F27gx9iywbgkubobud2il.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%2F27gx9iywbgkubobud2il.png" alt="Image description" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you should finally &lt;em&gt;add&lt;/em&gt;, &lt;em&gt;commit&lt;/em&gt; and &lt;em&gt;push&lt;/em&gt; your files to &lt;strong&gt;master&lt;/strong&gt; branch.&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%2Fuxnmeanw2buj0zdolbln.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%2Fuxnmeanw2buj0zdolbln.png" alt="Image description" width="800" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's do some more commits. For start create another folder with some dummy file.&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%2Fly07usegifssi7hr7t6k.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%2Fly07usegifssi7hr7t6k.png" alt="Image description" width="708" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another commit and push will do the job.&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%2Fl7qkaslqxiorux09so98.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%2Fl7qkaslqxiorux09so98.png" alt="Image description" width="800" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's make it more fun and create another branch, called &lt;em&gt;development&lt;/em&gt; and switch to it.&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%2Fw9ap5mmuhtwrl1kawnyu.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%2Fw9ap5mmuhtwrl1kawnyu.png" alt="Image description" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's create another file&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%2Fe70ks720wx01v2gumru5.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%2Fe70ks720wx01v2gumru5.png" alt="Image description" width="696" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want this file to be pushed to branch &lt;em&gt;development&lt;/em&gt;&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%2F7icywo513kri54ekodt7.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%2F7icywo513kri54ekodt7.png" alt="Image description" width="800" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So to summarize, we did 3 commits and 1 additional branch. &lt;br&gt;
This is how it looks like in the Github repo:&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%2F5hhrc0qrzuiiwr90jgpu.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%2F5hhrc0qrzuiiwr90jgpu.png" alt="Image description" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2 - AWS CodeCommit repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You have to have an AWS account. If you don't, create one&lt;br&gt;
&lt;a href="https://aws.amazon.com/resources/create-account/" rel="noopener noreferrer"&gt;https://aws.amazon.com/resources/create-account/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have an AWS account, you need to create 2 (3) things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS CodeCommit repo&lt;/li&gt;
&lt;li&gt;AWS IAM user with CodeCommit credentials (or access key)&lt;/li&gt;
&lt;li&gt;This is optional, but once you create AWS account, you can sign in as a root user. That approach is not the best way, thus you should creatale an IAM User with admin rights you can use to sign in to the console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's presume you already have AWS account and can log in either as root or IAM User (this is more suggested), so let's create AWS CodeCommit repo and IAM User with CodeCommit credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create AWS CodeCommit repo&lt;/strong&gt;&lt;br&gt;
In the AWS account navigate to &lt;em&gt;Developer Tools &amp;gt; CodeCommit &amp;gt; Repositories&lt;/em&gt; and hit &lt;em&gt;Create repository&lt;/em&gt;&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%2Fn63oc0iqjkynipldmwrc.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%2Fn63oc0iqjkynipldmwrc.png" alt="Image description" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt; of the repo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; (optional)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose &lt;strong&gt;AWS KMS key&lt;/strong&gt; for encryption (AWS managed, or your own if you have it and want to use it). If you with to create your own AWS KMS key, this comes with additional cost. AWS Managed KMS key is provided for free.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optinaly you can also enable &lt;strong&gt;Amazon CodeGuru reviewer for Java and Python&lt;/strong&gt;, which is machine learning powered code reviewer. This may also come with additional cost.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fuedh2vao5mpjj60hs1bm.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%2Fuedh2vao5mpjj60hs1bm.png" alt="Image description" width="800" height="1002"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the repository is created, you have 2 options how to clone it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTTPS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fzmy5efp4texzefko7pau.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%2Fzmy5efp4texzefko7pau.png" alt="Image description" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are signed as a root user, you only can use HTTPS, not SSH. Me personally prefer HTTPS, so I will choose this one.&lt;/p&gt;

&lt;p&gt;Before we clone this repo, we need IAM user we will use to connect to AWS CodeCommit.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;em&gt;IAM &amp;gt; Users &amp;gt; Create user&lt;/em&gt; and let's create IAM User we will use exclusively to connect to AWS CodeCommit.&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%2Fhvy9z1s6tlqhjqxmhrbo.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%2Fhvy9z1s6tlqhjqxmhrbo.png" alt="Image description" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give it a name, click Next and then choose &lt;em&gt;Attach policies directly&lt;/em&gt;.&lt;br&gt;
From the filter menu, find &lt;em&gt;AWSCodeCommitPowerUser&lt;/em&gt; policy, mark it and click Next &amp;gt; Creat User&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%2Fv2sb0ng8zfeaplm29wd9.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%2Fv2sb0ng8zfeaplm29wd9.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will give the IAM User enough permissions to pull, push, etc...&lt;/p&gt;

&lt;p&gt;Once the user is created, we need to assign a credentials. Go inside the user, tab &lt;em&gt;Security Credentials&lt;/em&gt;, where you have 2 options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can assign &lt;em&gt;SSH key&lt;/em&gt; or &lt;em&gt;HTTPS credentials&lt;/em&gt; valid only for AWS CodeCommit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can assign &lt;em&gt;Security Credentials&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is, that with AWS CodeCommit &lt;em&gt;SSH key&lt;/em&gt; or &lt;em&gt;HTTPS credentials&lt;/em&gt;, the user is only able to connect to AWS CodeCommit service, while user with &lt;em&gt;Security Credentials&lt;/em&gt; can potentially connect to the AWS console, or CLI. &lt;br&gt;
The less priviledge the better I say, so I choose AWS CodeCommit credentials.&lt;br&gt;
As mentioned before, I personally prefer HTTPS over SSH, therefore I scroll down to &lt;em&gt;HTTPS Git credentials for AWS CodeCommit&lt;/em&gt; and hit &lt;em&gt;Generate credentials&lt;/em&gt;&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%2Fvgn1yapopozpjr3hsz3o.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%2Fvgn1yapopozpjr3hsz3o.png" alt="Image description" width="800" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This wil transfer you to a new window, where you can see those credentials.&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%2F6epjvnk9a29arfxurtv8.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%2F6epjvnk9a29arfxurtv8.png" alt="Image description" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I suggest you download them and store securely, because this is the only time you can see your password. Of course if you loose it, you can generate it again, or just reset the password.&lt;/p&gt;

&lt;p&gt;Ok, so now that we have everything set up, let's push the repo to AWS CodeCommit cloned by HTTPS.&lt;/p&gt;

&lt;p&gt;As first, pull the repo to make sure you are up to date.&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%2Fewow3dxm24fl2vi2hu3q.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%2Fewow3dxm24fl2vi2hu3q.png" alt="Image description" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the repo link from HTTPS tab,:&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%2F3cuxi61onibn5xn6rlc2.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%2F3cuxi61onibn5xn6rlc2.png" alt="Image description" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and modify the git origin to that value:&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%2Fhymnl83ty7yo8cz913jc.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%2Fhymnl83ty7yo8cz913jc.png" alt="Image description" width="800" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be asked for username and password - that's the AWS CodeCommit HTTPS credentials you set up in AWS Console.&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%2Fcs25ew0kjqlha7uav3kk.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%2Fcs25ew0kjqlha7uav3kk.png" alt="Image description" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you add the credentials, the value of remote repo is modified to AWS CodeCommit.&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%2F2sacx6rfdaqij743itkg.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%2F2sacx6rfdaqij743itkg.png" alt="Image description" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are now ready to push everything into AWS CodeComit repo.&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%2Fs7rfz20jwwbelo6nl86l.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%2Fs7rfz20jwwbelo6nl86l.png" alt="Image description" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All my previous commits and branches are now part of AWS CodeCommit repo&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%2Fr0agwwywu2o1i6b42ytk.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%2Fr0agwwywu2o1i6b42ytk.png" alt="Image description" width="800" height="209"&gt;&lt;/a&gt;&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%2Fstgoa3e8nq2gf3qpbi4h.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%2Fstgoa3e8nq2gf3qpbi4h.png" alt="Image description" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For some reason it made &lt;em&gt;development&lt;/em&gt; branch the default, so I will change the default branch back to master.&lt;/p&gt;

&lt;p&gt;In repository, navigate to Settings,&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%2Fcad4e3nae11faqhhjtwq.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%2Fcad4e3nae11faqhhjtwq.png" alt="Image description" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and scroll to &lt;em&gt;Default branch&lt;/em&gt;, where you can change it to &lt;em&gt;master&lt;/em&gt;.&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%2Fh20pabtf3pky4tng0mkk.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%2Fh20pabtf3pky4tng0mkk.png" alt="Image description" width="800" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we are fully migrated from Github to AWS CodeCommid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's summarize the benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a challenge between Github and AWS CodeCommit, as each offers different benefits, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;By defining the IAM user with CodeCommit credentials, you have full controll who can access the repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The data is in your account and cannot be accessed from another account or another user, if you don't specifically allow it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The data is encrypted at rest with KMS key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The repo can be easily integrated with other AWS services like EventBridge and SNS (can come with addional cost), so you are notified about every change to your repo (commit, pull, etc...).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can have unlimited number of repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No Size Limits on Repositories, aw AWS CodeCommit does not impose hard limits on repository sizes (unlike GitHub).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free tier is available (see below).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;br&gt;
Up to 5 active users, 50 GB-month of storage, and 10,000 Git requests per month is for free. So in most cases, your repo will be free all the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Creating and migrating the repo to the AWS CodeCommit is very easy. Migrating a GitHub repo to AWS CodeCommit can offer numerous benefits, especially for those already running the AWS ecosystem for its ability of integration with AWS services, scalability, and security features present a compelling case for teams looking to streamline their development workflows within AWS. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Running forward proxy in AWS</title>
      <dc:creator>michal salanci</dc:creator>
      <pubDate>Sun, 24 Dec 2023 16:05:22 +0000</pubDate>
      <link>https://dev.to/aws-builders/serverless-forward-proxy-in-aws-587p</link>
      <guid>https://dev.to/aws-builders/serverless-forward-proxy-in-aws-587p</guid>
      <description>&lt;p&gt;Hello friends, let me introduce you to our serverless forward proxy concept in AWS, which runs on AWS Network Firewall and Squid proxy in ECS container.&lt;/p&gt;

&lt;p&gt;There will be upcoming articles soon, where I will dive deeper into setup of the AWS NFW and Squid in ECS, Cloudwatch logs, DNS setup with Dnsmasq, testing the network performance with K9, monitoring with Telegraf, etc...&lt;/p&gt;

&lt;p&gt;Now let's see how the basic setup of forward proxy in AWS may look like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to forward proxy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is forward proxy and why we need it
&lt;/h3&gt;

&lt;p&gt;Imagine you are in a corporate datacenter, or at home and you want to connect to a website in the internet. You send HTTP or HTTPS request to a website. Webserver process the request and responds with the payload. &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%2F972uqbmo3qsl635yrqf8.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%2F972uqbmo3qsl635yrqf8.png" alt="Image description" width="539" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how it should look like in the ideal world. However, you can unintentionally access a harmful website, risking exposure to malware or other security threats? To mitigate those risks, organizations often use an outbound filtering system known as a forward proxy.&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%2Fgzdpni2ecge32k64ipp8.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%2Fgzdpni2ecge32k64ipp8.png" alt="Image description" width="539" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A forward proxy acts as an intermediary solution between a user's device and the internet. It helps manage and control internet traffic, ensuring security and compliance. &lt;/p&gt;

&lt;p&gt;It examines outgoing requests and filters the traffic based on pre-set rules. This could include checking the destination URL, IP address, or type of requested content. By doing so, the proxy ensures that only safe and compliant requests reach the internet, thereby enhancing security and privacy.&lt;/p&gt;

&lt;p&gt;For instance, in a corporate environment, a forward proxy might block access to non-work-related websites, ensuring both network security and employee productivity.&lt;/p&gt;

&lt;p&gt;When user creates a request, if the request complies with the rules, the proxy allows it to pass through to the internet. If not, it blocks the request, effectively preventing access to potentially harmful or non-compliant content.&lt;/p&gt;

&lt;p&gt;Forward proxies can also anonymize web requests, hiding the user's IP address from external web servers. This adds a layer of privacy and security, protecting users from potential tracking or hacking.&lt;/p&gt;

&lt;p&gt;Some forward proxies cache frequently accessed content. This means that if multiple users request the same resource, the proxy can serve it from its cache, reducing load times and saving bandwidth.&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%2Fjg2vumf7p3c0xp8ihd9s.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%2Fjg2vumf7p3c0xp8ihd9s.png" alt="Image description" width="521" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicit and Transparent proxy
&lt;/h3&gt;

&lt;p&gt;Proxy can handle the traffic in two ways – as an explicit proxy or transparent proxy.&lt;/p&gt;

&lt;p&gt;Below is the brief comparison of both:&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%2Fozxnckuncddso0y3bal7.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%2Fozxnckuncddso0y3bal7.png" alt="Image description" width="665" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Transparent proxy being invisible to users is actually a great security advantage, because explicit proxy can be bypassed simply by not specifying its address in the request, however user can’t bypass the transparent, as the requests are routed there by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless forward proxy in AWS
&lt;/h2&gt;

&lt;p&gt;Let’s imagine that customers managing their own VPC and are connecting to the internet via Outbound VPC, as a central point of internet access. &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%2Fr88dryfs9rcwc098w4b0.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%2Fr88dryfs9rcwc098w4b0.png" alt="Image description" width="525" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outbound VPC is the place where egress connections can be secured and controlled and this is also the place where forward proxy operates.&lt;/p&gt;

&lt;p&gt;The initial design is modified by introducing an inspection subnet, where all the magic happens.&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%2Fzubtbuu44t63l5raq5ce.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%2Fzubtbuu44t63l5raq5ce.png" alt="Image description" width="525" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS offers a native solution for transparent proxy – AWS Network Firewall. &lt;/p&gt;

&lt;p&gt;Since there is no native solution for explicit proxy, 3rd party solution, such as Squid proxy can be used. It can be placed into the container and managed by AWS Fargate.&lt;br&gt;
Let’s examine the components of the Inspection subnet in more detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicit forward proxy on Squid
&lt;/h3&gt;

&lt;p&gt;As mentioned before, since there is no native AWS solution for explicit proxy, it is necessary to use some of the 3rd party solutions. This article aims to use of Squid Proxy.&lt;/p&gt;

&lt;p&gt;Squid Proxy is widely used open source proxy solution. It can terminate the TCP and that makes it a perfect candidate for explicit proxy. It can run on EC2 instance, or in ECS container.&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%2Ftace5g0hw7xz8xq4sbbk.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%2Ftace5g0hw7xz8xq4sbbk.png" alt="Image description" width="166" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this architecture, Squid runs in an ECS container, managed by AWS Fargate.&lt;/p&gt;

&lt;p&gt;AWS Fargate is a compute engine for Amazon ECS, which allows you to run containers without having to manage servers or clusters. Fargate abstracts the underlying infrastructure management tasks such as provisioning, scaling, and maintaining servers, enabling you to focus on designing and building your applications.&lt;/p&gt;

&lt;p&gt;When creating a Docker image for squid proxy, we used 3 main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;urlwhitelist.txt&lt;/code&gt; – list of allowed URLs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ipwhitelist.txt&lt;/code&gt; – list of allowed IP addresses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;squid.conf&lt;/code&gt; – configuration file of the Squid - this is where all the behavior (what is denied, what is allowed, caching, etc..) is defined.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this particular scenario squid proxy configured like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Listens for HTTP and HTTPS traffic on port 3128 and enable SSL bumping for HTTPS traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocks access to all destinations (URLs and/or IPs), except for what is allowed in the whitelist files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caches the content.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When user establish a HTTP/HTTPS request via explicit proxy this is what happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Since Squid is configured to operate as a proxy and is listening for incoming requests on port 3128.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request is evaluated against the rules which determine if the requested URL is permitted. This decision is based on whether the URL is listed in the &lt;code&gt;whitelist_URL.txt&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the requested URL is not whitelisted in &lt;code&gt;urlwhitelist.txt&lt;/code&gt; file, the request is denied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the requested URL is whitelisted it is allowed further.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For allowed requests, Squid checks its cache. If a cached version of the requested resource is available, Squid will serve this content directly to the client. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the requested content is not in the cache, Squid fetches the content from the destination web server and forwards it to the original client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To the client, it appears as if it received the response directly from the web server, even though it was routed through Squid.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Combo with AWS Network Loadbalancer
&lt;/h3&gt;

&lt;p&gt;For users to be able to successfully send HTTP/HTTPS request to the Squid container, another AWS component is necessary – &lt;strong&gt;AWS Network Load Balancer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ECS Tasks with Squid running inside as a container are part of NLB’s target group.&lt;/p&gt;

&lt;p&gt;The purpose of AWS Network Loadbalancer is to listen to the traffic in front of the Squid and then redistribute the traffic to its targets – ECS Tasks running Squid.&lt;/p&gt;

&lt;p&gt;This setup has several advantages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: NLB is designed to handle millions of requests per second while maintaining low latencies. It operates at Transport Layer (L4) of the OSI model, which allows them to efficiently route TCP traffic. This is particularly beneficial for a proxy server like Squid that handles a significant amount of TCP traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High Availability and Reliability&lt;/strong&gt;: The use of a Network Load Balancer ensures that traffic is distributed efficiently across available ECS Tasks. If one instance becomes unhealthy or fails, the NLB can redirect traffic to the remaining healthy instances, maintaining service availability. With that setup, we can have as many ECS containers as we need.&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%2Fa7i0aog28d4dwrq8g7ll.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%2Fa7i0aog28d4dwrq8g7ll.png" alt="Image description" width="516" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Running with sidecar
&lt;/h3&gt;

&lt;p&gt;Putting the Squid container into an ECS Task, has another advantage – possibility of using a sidecar container.&lt;/p&gt;

&lt;p&gt;A sidecar container is a design pattern where a secondary container is deployed alongside a primary application container, sharing the same lifecycle and resources, but performing a supporting function that's essential to the operation or management of the primary container.&lt;/p&gt;

&lt;p&gt;As it turned out, logs created by Squid are not visible in the Cloud Watch, so some kind of a log processor is needed to parse the logs from Squid and send them to the Cloudwatch.&lt;/p&gt;

&lt;p&gt;There are plenty of log processors available, however AWS supports and provides the Docker image of FluentBit log processor. Except for others, it includes plugins and configurations that are optimized for sending logs to CloudWatch.&lt;/p&gt;

&lt;p&gt;Because ECS Task allows us to run multiple containers inside, FluentBit can now run as sidecar container, to gather the logs from Squid container and to send them to CloudWatch.&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%2Fuoaqiuizkc7rpons5prk.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%2Fuoaqiuizkc7rpons5prk.png" alt="Image description" width="525" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But how exactly Fluentbit gets the logs created by Squid?&lt;/p&gt;

&lt;p&gt;Let’s examine the ECS topology in more detail:&lt;/p&gt;

&lt;p&gt;Squid container and Fluentbit as a sidecar container are both part of same ECS Task.&lt;/p&gt;

&lt;p&gt;ECS Tasks are part of ECS service, which is part of ECS Cluster. ECS Cluster spans through multiple Fargate instances.&lt;/p&gt;

&lt;p&gt;For squid to be able to exchange the logs with fluentbit, some kind of a storage is needed. There are multiple options here, such as using EFS, or instance store. We decided to use instance store of particular Fargate instance, as it seems to be the simplest and most cost effective solution. &lt;/p&gt;

&lt;p&gt;When squid created the log, it sends it immediately to the instane store of the Fargate instance it runs on. Fluentbit then reads the logs from the store, parse it to the appropriate format and forwards to Cloudwatch.&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%2Fx27zaz3vywf5954i0818.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%2Fx27zaz3vywf5954i0818.png" alt="Image description" width="341" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please beware, that instance store is temporary&lt;/strong&gt; – once the container dies and is redeployed in new Fargate instance, you loose all your data. However, this should not be a big concern, because once the logs are sent to the Cloudwatch, they stay there even if the instance store is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transparent forward proxy on AWS network firewall
&lt;/h2&gt;

&lt;p&gt;Transparent proxy is also necessary, in case the users do not specify any proxy in the request. AWS provides a native solution for that – AWS Network Firewall.&lt;/p&gt;

&lt;p&gt;AWS Network Firewall, introduced in 2020, is a managed firewall that primarily provides firewall protection for VPC resources in AWS. It's designed to provide stateful inspection of network traffic, intrusion detection and prevention, and web filtering. &lt;/p&gt;

&lt;p&gt;AWS Network Firewall is able to inspect both ingress and egress traffic.&lt;/p&gt;

&lt;p&gt;All its features are behind the scope of this article, but let’s just focus on some which are important for transparent proxy capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stateful Inspection:&lt;/strong&gt; AWS Network Firewall tracks the state of active connections and makes decisions based on the context of the traffic (not just the individual packets). It is able to inspect both inbound and outbound traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Filtering:&lt;/strong&gt; It can also block or allow access to specific websites or categories of websites.&lt;/p&gt;

&lt;p&gt;Those 2 features are exactly what we need for AWS Network Firewall to act as a transparent proxy.&lt;/p&gt;

&lt;p&gt;AWS Network Firewall consists of 3 main components&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firewall rule&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Basic building component of network inspection behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It defines the criteria to inspect and control the traffic, such as IP addresses, ports, protocols, etc…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rules are grouped in the Rule Group&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Firewall rule group&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Collection of rules, organized into single manageable unit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can be stateful or stateless. Stateful rule groups can track the state of network connections, while stateless Rule groups treat each packet individually and independently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rule groups can be applied to Firewall policy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Firewall Policy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Collection of one or more rule groups, organized into single manageable unit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Organizes the order in which the rule groups are being evaluated and defines a default action (what happens if no rule is hit).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More on AW Network Firewall concepts can be found here:&lt;br&gt;
&lt;a href="https://aws.amazon.com/blogs/aws/aws-network-firewall-new-managed-firewall-service-in-vpc/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/aws/aws-network-firewall-new-managed-firewall-service-in-vpc/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/de/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/" rel="noopener noreferrer"&gt;https://aws.amazon.com/de/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up AWS Network Firewall for transparent proxy
&lt;/h2&gt;

&lt;p&gt;In Firewall policy, the default order in the stateful rule group is &lt;code&gt;Strict&lt;/code&gt;, and the default action is &lt;code&gt;Alert established&lt;/code&gt; + &lt;code&gt;Drop all&lt;/code&gt;&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%2Fhmpyh8fsa8hpn5iibknz.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%2Fhmpyh8fsa8hpn5iibknz.png" alt="Image description" width="525" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s break it down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drop all + Alert established:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drop all:&lt;/strong&gt; Any traffic that doesn't match any of the rules in the stateful rule group, will be dropped. This is kind of implicit deny at the end of the ruleset.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alert established:&lt;/strong&gt; While network firewall drops traffic not matching the allow rules, it will specifically log (alert) the traffic that is part of an already established connection. An established connection is part of already ongoing session, when 3-way TCP handshake is done. It does not log the TCP 3-way handshake itself, instead it logs traffic that occurs after the TCP is correctly established.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strict rule ordering&lt;/strong&gt; – when firewall finds a match in the rule of the rulegroup, no further evaluation is done and the action defined in the rule is taken&lt;/p&gt;

&lt;p&gt;When user creates a HTTP/HTTPS request via transparent proxy this is what happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Request is evaluated against rules in the rulegroups. The decision is based on whether it finds a match in any of the rules or not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If request matches any of the rules, appropriate action defined in that rule is taken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If request does not match any of the rules, the default action is taken (Drop all) and request is dropped.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are no caching possibilities in network firewall.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Routing and network flow
&lt;/h2&gt;

&lt;p&gt;Once everything is set up, let’s check the routing and network flow of explicit and transparent proxy&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicit proxy network flow
&lt;/h3&gt;

&lt;p&gt;When user wants to reach &lt;a href="http://www.amazon.com" rel="noopener noreferrer"&gt;www.amazon.com&lt;/a&gt; while usage explicit proxy is required, the proxy address must be specified in the request. In this case, the network loadbalancer DNS acts as a proxy address.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User creates request to &lt;a href="http://www.amazon.com" rel="noopener noreferrer"&gt;www.amazon.com&lt;/a&gt;, from EC2 &lt;code&gt;10.0.1.130&lt;/code&gt;, while specifying network loadnalncer DNS name in the request - &lt;code&gt;internal-fwdproxynlb-1234567890-eu-central-1.elb.amazonaws.com&lt;/code&gt; and port 3128.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS name of the loadbalancer is translated to its IP address &lt;code&gt;192.168.3.10&lt;/code&gt; – which is now the destination IP address of the packet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Based on the default route in the user’s VPC, traffic is sent to AWS transit gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In transit gateway, there is a route to &lt;code&gt;192.168.0.0/16&lt;/code&gt;, towards transit gateway attachment in private subnet of Outbound VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From Outbound VPC private subnet, the traffic gets to network loadbalancer, based on a local route.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Network loadbalancer makes a loadbalancing decision and picks up one of the members of its target group, to send packets to. This is actually an ECS Task. NLB preserves the client's source IP, so the Squid inside the ECS Task sees the original source IP - &lt;code&gt;10.0.1.130&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In ECS Task, the packet is evaluated against the &lt;code&gt;urlwhitelist.txt&lt;/code&gt;, and if allowed, squid terminates the initial request, and creates a new one. Now the source IP address is ECS Task IP – &lt;code&gt;192.168.2.28&lt;/code&gt; and destination is &lt;a href="http://www.amazon.com" rel="noopener noreferrer"&gt;www.amazon.com&lt;/a&gt;. There is a default route towards  the NAT gateway, so the packet is sent there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NAT gateway performs source NAT from &lt;code&gt;192.168.2.28&lt;/code&gt; to its own public IP &lt;code&gt;3.48.29.55&lt;/code&gt; and sends it to the internet gateway. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internet gateway sends it to the destination. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When destination responds, and packet gets back to the internet gateway, it is sent back to NAT Gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In NAT gateway the destination IP is changed back to &lt;code&gt;192.168.2.28&lt;/code&gt; and on a local route the packet gets back to ECS Task and the Squid inside. Squid forwards the response back to network loadbalancer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Network loadbalancer knows the client IP and based on the route &lt;code&gt;10.0.0.0/16&lt;/code&gt; in the routing table, the packet is sent to transit gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transit gateway checks its routing tables and finds a route to &lt;code&gt;10.0.0.0/16&lt;/code&gt; towards its attachment in private subnet of client VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once packet reaches private subnet of client VPC, by local route it gets back to client’s EC2.&lt;/p&gt;&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%2Fa95bfcxiy8ish4u8l5ps.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%2Fa95bfcxiy8ish4u8l5ps.png" alt="Image description" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Transparent proxy network flow
&lt;/h3&gt;

&lt;p&gt;When user wants to reach &lt;a href="http://www.amazon.com" rel="noopener noreferrer"&gt;www.amazon.com&lt;/a&gt; and no proxy is specified, it automatically goes via transparent proxy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User creates request to &lt;a href="http://www.amazon.com" rel="noopener noreferrer"&gt;www.amazon.com&lt;/a&gt;, from EC2 &lt;code&gt;10.0.1.130&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Based on the default route in the user’s VPC, traffic is sent to AWS Transit Gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From transit gateway, the packets is sent to the transit gateway attachment in private subnet of Outbound VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From there, based on the default route it gets to AWS network firewall.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Traffic is inspected against the firewall rules, and if allowed, based on the default route it gets to NAT gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NAT gateway performs source NAT from &lt;code&gt;10.0.1.130&lt;/code&gt; to its own public IP &lt;code&gt;3.48.29.55&lt;/code&gt; and sends it to the internet gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internet gateway sends it to the destination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When destination responds, and packet gets back to the internet gateway, it is sent back to NAT Gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the NAT gateway the destination IP is changed back to &lt;code&gt;10.0.1.130&lt;/code&gt;. NAT gateway knows the route for &lt;code&gt;10.0.0.0/16&lt;/code&gt;, so response packet is sent to network firewall.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In network firewall the response packet is evaluated against the rules and if allowed, based on the routing it is sent to transit gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transit gateway checks its routing tables and finds a route to &lt;code&gt;10.0.0.0/16&lt;/code&gt; towards its attachment in private subnet of client VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once packet reaches private subnet of client VPC, by local route it gets back to client’s EC2.&lt;/p&gt;&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%2Fi4vx5xqeug7tpxaq4d1d.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%2Fi4vx5xqeug7tpxaq4d1d.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;As we conclude this comprehensive exploration of forward proxies, it's clear that these tools are very important.&lt;/p&gt;

&lt;p&gt;Forward proxies play a critical role in enhancing network security, regulating internet traffic, and ensuring compliance with organizational policies. Their ability to filter, monitor, and control access to web resources is vital in protecting against cyber threats.&lt;/p&gt;

&lt;p&gt;Whether it's a explicit proxy running in container, or transparent proxy in AWS Network Firewall, these solutions are tailored to address a broad spectrum of security and compliance requirements.&lt;/p&gt;

&lt;p&gt;We've seen that explicit proxies offer more control and detailed traffic inspection, making them ideal for environments requiring stringent security measures.&lt;/p&gt;

&lt;p&gt;Transparent proxies, on the other hand, provide ease of use and maintenance, making them suitable for basic filtering and routing without needing end-user configuration.&lt;br&gt;
The integration of forward proxies within the AWS VPC, such as using Squid inside the ECS container managed by Amazon Fargate, for explicit forward proxy or leveraging AWS Network Firewall for transparent forward proxy, showcases the versatility and scalability of AWS ecosystem.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>firewall</category>
      <category>squid</category>
    </item>
    <item>
      <title>How I became cloudbased from being cloudless, in 2022</title>
      <dc:creator>michal salanci</dc:creator>
      <pubDate>Sun, 24 Dec 2023 14:40:12 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-i-became-cloudbased-from-being-cloudless-in-2022-1d4n</link>
      <guid>https://dev.to/aws-builders/how-i-became-cloudbased-from-being-cloudless-in-2022-1d4n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on 2023/01/22 on my &lt;a href="https://michalsalanci.wixsite.com/fullycloudbased/post/how-i-really-became-cloudbased-from-being-cloudless" rel="noopener noreferrer"&gt;wix blog&lt;/a&gt;. &lt;br&gt;
As I am shutting down the blog, all my articles are being moved here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are considering shifting your career in the direction of AWS, this article may be an inspiration to you.&lt;/p&gt;

&lt;p&gt;Having worked as an AWS DevOps engineer since December 2021 I would like to encourage all of you who are still doubtful to make a change.&lt;/p&gt;

&lt;p&gt;This is my story of how I got from cloudless to cloudbased.&lt;br&gt;
I am old school networking guy, for my whole career I worked with different kinds of networks and datacenter technologies – routers, switches, loadbalancers, and firewalls. I had built quite a successful career there and a get into the great team of colleagues. One might say it was an ideal job. Well, not quite – I felt that I was missing something. For the past years, I witnessed my customers leaving DC for AWS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Master Shifu once said:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you only do things you can do, you can never be more than you are.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Amen to that, bro!&lt;/p&gt;

&lt;p&gt;Until 2021 I had no knowledge about AWS...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;But how difficult can it be, right?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I said to myself… &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%2Fc9nzcoufezxnz415wg3q.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%2Fc9nzcoufezxnz415wg3q.png" alt="LINUXXXXX" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was wrong and I learned it the hard way.&lt;/p&gt;

&lt;p&gt;You may ask yourself a question – why should I learn AWS? &lt;/p&gt;

&lt;p&gt;Well, let me tell you: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AWS is one of the biggest cloud providers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will have the opportunity to work with the latest technology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There is a high potential for career growth because there is a high demand for AWS professionals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting an AWS job requires a set of skills and certifications that will help you a lot as well.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WLNSC is all you need
&lt;/h2&gt;

&lt;p&gt;Have you heard about the WLNSC method? The shame on you if not! (Don't worry, I made it up).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WLNSC&lt;/strong&gt; is the abbreviation for what I have started with and it worked pretty well.&lt;/p&gt;

&lt;p&gt;Let's get step by step with the WLNSC method that has no copyright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;W for Will to make a change&lt;/strong&gt;&lt;br&gt;
This is the first step you have to make – find a will to start. Learning new technology is never easy. It costs time, stepping out of your comfort zone, and maybe a couple of dollars (you better stop that EC2 after you are done with it).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L for Lab to practice&lt;/strong&gt;&lt;br&gt;
One can't learn something without practicing. Lucky for us, AWS provides a lot of free resources. You just need to create an &lt;a href="https://portal.aws.amazon.com/billing/signup?refid=bc81ce5f-a42e-464a-9fbe-d9d26efa6161&amp;amp;redirect_url=https%3A%2F%2Faws.amazon.com%2Fregistration-confirmation#/start/email" rel="noopener noreferrer"&gt;AWS account&lt;/a&gt; – don’t worry, it’s free. AWS also provides a lot of &lt;a href="https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&amp;amp;awsf.Free%20Tier%20Types=*all&amp;amp;awsf.Free%20Tier%20Categories=*all" rel="noopener noreferrer"&gt;free&lt;/a&gt; resources to your AWS lab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N for Networking with other professionals&lt;/strong&gt;&lt;br&gt;
There are a lot of inspiring people who can help you, without even knowing you. Networking with other AWS professionals can be a great way to learn new things and stay up-to-date with the latest developments in the platform. Just go and check the profiles of &lt;a href="https://www.linkedin.com/in/semaan/" rel="noopener noreferrer"&gt;Viktoria Semaan&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/lindahaviv/" rel="noopener noreferrer"&gt;Linda Haviv&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/cloudgeek7/" rel="noopener noreferrer"&gt;Madhu Kumar&lt;/a&gt;, &lt;a href="https://dev.to/arturschneider"&gt;Artur Schneider&lt;/a&gt; and many more, whose profiles are full of interesting ideas, good tips, tricks, etc…&lt;/p&gt;

&lt;p&gt;You will also get information about AWS meetups, conferences, and other networking events that you can attend to meet even more inspiring professionals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S for Support from people around&lt;/strong&gt;&lt;br&gt;
If you are not the lucky one with a photographic memory, there will be some sacrifices, you have to understand that. Learning something new and learning it good needs takes time. &lt;br&gt;
I used to exercise in the morning before work and watch series with my wife in the evening when the kids went to bed. Instead of that for a good amount of time, I was exercising the lab and watching &lt;a href="https://skillbuilder.aws/" rel="noopener noreferrer"&gt;AWS Skill Builder&lt;/a&gt;, &lt;a href="https://www.coursera.org/" rel="noopener noreferrer"&gt;Coursera&lt;/a&gt;, &lt;a href="https://www.udemy.com/" rel="noopener noreferrer"&gt;Udemy&lt;/a&gt;... &lt;/p&gt;

&lt;p&gt;But trust me every minute is worthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C for Certification&lt;/strong&gt;&lt;br&gt;
I found that the best way (for me) to learn AWS is by learning and practicing for &lt;a href="https://aws.amazon.com/certification/exams/" rel="noopener noreferrer"&gt;AWS certifications&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Certified Cloud Practitioner for starter
&lt;/h3&gt;

&lt;p&gt;Checking the certification path on the AWS page and as a knower of nothing (sorry Jon Snow), I decided to start with &lt;strong&gt;AWS Certified Cloud Practitioner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lucky me, I found a great and free essentials training on Coursera, created by AWS - &lt;a href="https://www.coursera.org/learn/aws-cloud-practitioner-essentials?=" rel="noopener noreferrer"&gt;AWS Cloud Practitioner Essentials&lt;/a&gt;. AWS Instructors &lt;a href="https://www.linkedin.com/in/morgan-willis-001/" rel="noopener noreferrer"&gt;Morgan Willis&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/blaine-sundrud-6389a15/" rel="noopener noreferrer"&gt;Blaine Sundrud&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/rudychetty/" rel="noopener noreferrer"&gt;Rudy Chetty&lt;/a&gt; are explaining the essentials of AWS in a very understandable way – comparing AWS to a coffee shop. If you are completely new to that field, I definitely suggest this course to start with.&lt;/p&gt;

&lt;p&gt;AWS also provides tons of free trainings. Login to &lt;a href="https://skillbuilder.aws/" rel="noopener noreferrer"&gt;AWS Skill Builder&lt;/a&gt;, &lt;a href="https://www.coursera.org/" rel="noopener noreferrer"&gt;Coursera&lt;/a&gt;, create a free account and start learning for free. I definitely recommend &lt;a href="https://explore.skillbuilder.aws/learn/course/internal/view/elearning/134/aws-cloud-practitioner-essentials" rel="noopener noreferrer"&gt;AWS Cloud Practitioner Essentials&lt;/a&gt; and &lt;a href="https://explore.skillbuilder.aws/learn/course/internal/view/elearning/11458/aws-cloud-quest-cloud-practitioner" rel="noopener noreferrer"&gt;AWS Cloud Quest: Cloud Practitioner&lt;/a&gt;, but there are more.&lt;/p&gt;

&lt;p&gt;I passed this certification in April 2021 with pretty good score, and suddenly there was me thinking how good I am. If you haven’t heard about Dunning–Kruger effect, this is exactly the book example. &lt;/p&gt;

&lt;p&gt;I passed this certification in April 2021 with pretty good score, and suddenly there was me thinking how good I am. If you haven’t heard about &lt;a href="https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect" rel="noopener noreferrer"&gt;Dunning–Kruger effect&lt;/a&gt;, this is exactly the book example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Certified Architect Associate for main course&lt;/strong&gt;&lt;br&gt;
Feeling like Po the Dragon Warrior, I just started to prepare for &lt;strong&gt;AWS Certified Architect Associate&lt;/strong&gt; and that was a real deal. I've spent evenings and evenings labing and watching the content (my wife had almost finished 6 seasons of a TV show).&lt;/p&gt;

&lt;p&gt;This time I decided to go not just with AWS Skill Builder, but also with the learning platform &lt;a href="https://www.udemy.com/" rel="noopener noreferrer"&gt;Udemy&lt;/a&gt;. I purchased &lt;a href="https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03/" rel="noopener noreferrer"&gt;Ultimate AWS Certified Solutions Architect Associate SAA-C03&lt;/a&gt; from &lt;a href="https://www.linkedin.com/in/stephanemaarek/" rel="noopener noreferrer"&gt;Stéphane Maarek&lt;/a&gt;. The topics I found most crucial, like IAM, EC2, S3, VPC, and others I dove deeper into with specific courses on &lt;a href="https://skillbuilder.aws/" rel="noopener noreferrer"&gt;AWS Skill Builder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Somewhere in the middle of the preparation, I found out that the AWS DevOps team within my company is hiring, I applied and was accepted. With a good attitude and a new role in my pocket, I was able to pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specialties for dessert&lt;/strong&gt;&lt;br&gt;
If you’re still not full and thinking about some desserts (&lt;em&gt;like lava cake right after 1kg of ribs you think to order just because your teammate ordered it too, even if you are fuller than you have ever been – ain’t that right&lt;/em&gt; &lt;a href="https://dev.to/lydiadely"&gt;Lydia Delyova&lt;/a&gt; ?), there is nothing better than Specialties.&lt;/p&gt;

&lt;p&gt;AWS offers multiple specialties. Working for years with BGP, VPNs, and IP subnets, first logical choice for me was the &lt;strong&gt;AWS Advanced Networking Specialty&lt;/strong&gt;, and I must admit this certification was pretty doable, with all my networking backround. Without that, the exam might be pretty though.&lt;/p&gt;

&lt;p&gt;For my passion for security, I also took the &lt;strong&gt;AWS Security Specialty&lt;/strong&gt;, and I can tell you this was the most challenging one for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End of story?&lt;/strong&gt;&lt;br&gt;
Going through all of this, I encourage you to do the same if you are still considering. Getting from classic DC networking, or any other field to the AWS is a huge change, but I can assure you it's worthy.&lt;/p&gt;

&lt;p&gt;What will however never change, is you still being that &lt;em&gt;hey, my PC is so slow, can you do something about it?&lt;/em&gt; and also &lt;em&gt;hey, can you set up my wireless router&lt;/em&gt; kind of guy for the whole your family, friends, neighbors, their friends… &lt;/p&gt;

&lt;p&gt;I wish I had a dollar for every router I have set up…&lt;/p&gt;

&lt;p&gt;This is not the end and the story continues. Let's see what 2023 will bring. &lt;/p&gt;

&lt;p&gt;And what should your next steps be? Make the step and start the unexpected journey to the clouds.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>aws</category>
      <category>career</category>
      <category>certification</category>
    </item>
  </channel>
</rss>
