Перейти до основного вмісту

EC2 metadata server на локальній машині


 


Історія така. В нас куча проєктів все запхнуто в Docker containers і стартує за допомогою docker-compose. Сервіси написані на Python. І все це запускається на AWS ECS. 

І багато чого зав'язано на boto3.  При розробці потрібно використовувати ресурси AWS як, наприклад SSM і тому подібне. Звичайно для security включений assume role and mfa. 

З mfa і виникає проблема на локальній розробці. Для того, щоб спрацював boto3 потрібно ввести token і це треба робити в момент підключення до AWS ресурсів. В цей момент отримуємо тимчасові токени і ключі. 

Приблизно це виглядає так

boto3.Session(profile_name=aws_profile['source_profile'], Профіль з /.aws/config
region_name=aws_profile['region'])
mfa_token = dialog_mfa_token() # Це вводимо руками
return assume_aws_role(aws_sess, self.aws_profile, mfa_token)

Як бачимо зайвий код і головняк з тимчасовими токенами. Що робити?

Потрібно з імітувати роботу як в Instance EC2. Boto3 не бере локальні доступи, а звертається до meta service, який ці права і віддає creditional providers в boto3
Вище показано, як приблизно отримуємо тимчасові токени

'AccessKeyId': 'ASIAQ2MVLYIBRTPVA2GV',

'SecretAccessKey':'Q8EyEanQhTzHcBZ80/YGpcaMIK5TfacvAKQN4+/d',

'SessionToken':'FwoGZXIvYXdzEG4aDMkhIN535mYdVc2B0iK0AdYc...',


Далі піднімаємо сервер на http://169.254.169.254:8. Чесно кажучи трохи головняк бо треба зробити 


#!/bin/bash

LOCALIP='169.254.169.254'

BASEDIR=$(dirname "$0")

echo "$BASEDIR"

cd $BASEDIR

sudo ifconfig lo0 alias $LOCALIP 255.255.255.255

sudo uvicorn main:app --host $LOCALIP --port 80 --reload


А на сервері робимо два endpoints:

GET http://169.254.169.254/latest/meta-data/iam/security-credentials/

<role>



Тут маленька хитрість для java потрібно віддавати чистий String без зайвих символів

Response(content=get_current_assume_role(), media_type="text/html") #Fastapi

GET http://169.254.169.254/latest/meta-data/iam/security-credentials/<role> 

Response


{

"Type": "AWS-HMAC",

"Code": "Success",

"LastUpdated": "2011-12-03T00:00:33.842739",

"AccessKeyId": "A2MVLYIBRTPVA2GV",

"SecretAccessKey": "Q8EyEanQhBZ80/YGpcaMIK5TfacvAKQN4+/d",

"Token": "FwoGZXIvYX...",

"Expiration": "2011-12-03 02:28:13Z"

}

Працює за милу душу в кожному контейнері без зайвих рухів над контейнером.


Звичайно до цього хлопці такий сервіс робили ec2metadata-role-assumption. Але це на рубі й там 100500 строк коду на фіга незрозуміло.


Коментарі

Популярні дописи з цього блогу

Так-с

  Ось цікаво куди вони поділи мій попередній блог. Там були мої старі спроби щось написати. Сумно якось. Без моєї згоди взяти та похерити. Мда.  Знайшовся старий блог. Називається спробуй знайди. Для чого цей блог. Спроба записувати  нове те що прочитав, почув побачив. Також робити висновки, або враження як саме зачепило те чи інша тема. Як буду це робити. В мене в trello набір карток з різними цікавими темами. Зараз це програмування і проєктування. Можливо в майбутньому ще заведу для збору інформації по лібертаріанству та австрійській економічній школі. Прочитавши буду записувати враження в evernote і далі раз в неділю буду публікувати короткі резюме по кожній темі за неділю. Image Source by  Brett Jordan

Перше спостереження

У свій час похерив Ubuntu при спробі знести системний python. В результаті відвалилась курсор і ще щось. Була доступна консоль без мережі. Ось зараз дійшли руки поставити нову убунту. І тут стикнувся цікавою штукою, яка відповіла мені на питання навіщо потрібно логічний розділ і що primary може бути три.  EFI потрібно ставити на primary і треба бути уважний скільки в наявності primary розділів. https://www.pcmag.com/encyclopedia/term/extended-partition