Історія така. В нас куча проєктів все запхнуто в 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
Вище показано, як приблизно отримуємо тимчасові токени
'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 без зайвих символів
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 строк коду на фіга незрозуміло.
Коментарі
Дописати коментар