Z tego artykułu dowiesz się o Cross-account IAM, o tym, jak korzystać z roli IAM z innego konta AWS. Role IAM to potężne narzędzie do zarządzania dostępem do zasobów AWS, ale mogą być trudne do skonfigurowania i używania. Dzisiaj pokażę Ci, jak funkcja lambda może wykorzystać rolę IAM z innego konta AWS.
Na jednym koncie AWS możesz utworzyć funkcję lambda i przypisać rolę, dokładnie tak jak zawsze. Możesz jednak utworzyć nową rolę IAM na zupełnie innym koncie AWS i pozwolić funkcji lambda z niej korzystać. Możesz kontrolować inne konto AWS za pomocą funkcji Lambda. W tym artykule będę używał Pythona 3.10 i boto3.
Pierwsza ROLA IAM(lambda01-role
)
Na pierwszym koncie AWS(Account A) utworzę Rolę IAM lambda01-role
i funkcję lambda lambda01
. Funkcji lambda nadam tylko minimalne uprawnienia umożliwiające kontrolę roli o nazwie read-role-all-account na dowolnym koncie AWS.
Należy standardowo utworzyć rolę IAM, tak jak zawsze i dodac do niej następujące uprawnienia:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam:::role/read-role-all-account"
}
]
}
W moim przypadku rola read-role-all-account
zostanie utworzona na drugim koncie AWS(Account B). Tą rolą IAM chcę zarządzać. W ARN możesz zostawić puste miejsce albo dodać gwiazdkę, dzięki czemu będziesz mógł zarządzać taką rolą na każdym koncie. Jeśli chcesz być bardziej dokładny możesz zezwolić tylko na kontrolę jednego konta to w miejscu gwiazdki podaj numer konta.
Druga ROLA IAM(read-role-all-account
)
Teraz należy się zalogować na konto AWS, którym chce się zarządzać, w moim przypadku Account B. Tutaj należy utworzyć nową rolę IAM, którą chce się zarządzać, o takiej nazwie, jaką ustalono wcześniej. W moim przypadku jest to read-role-all-account
.
Do tej roli IAM dodajesz takie uprawnienia, jakich potrzebujesz. Ja chcę tylko odczytać dane o ec2, dlatego mi wystarczą poniższe uprawnienia. Ty dodaj takie, jakich potrzebujesz.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
}
]
}
Gdy już utworzysz rolę IAM, to powinieneś edytować trust rekationship i określić dokładniej jakiej roli, z jakiego konta AWS pozwolisz zarządzać tą rolą IAM.
BARDZO WAŻNE określ jakiej roli, z jakiego konta AWS ufasz i pozwolisz jej kontrolować tę rolę IAM. Nie używaj tutaj * przy numerze konta albo nazwie roli, ponieważ pozwolisz każdemu na użycie tej roli.
Jeszcze raz to napiszę, bo to bardzo ważne. Dokładnie określ nazwę roli i numer konta, która będzie mogła używać tej roli. W moim przypadku wygląda to tak.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_ID:role/lambda01-role"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
Pamiętaj zastąpić ACCOUNT_ID
numerem ID konta AWS.
Funkcja Lambda(lambda01
)
Gdy utworzyłeś role IAM możesz zająć się tworzeniem funkcji lambda. Podczas tworzenia funkcji lambda lambda01
przypisałem do funkcji rolę IAM lambda01-role
. Dla przypomnienia ta rola IAM znajduje się na tym samym koncie co funkcja Lambda i tylko tam.
W kodzie funkcji będę używał roli read-role-all-account
, która znajduje się na tych kontach AWS, które chcę kontrolować. Poniżej znajdziesz kod funkcji lambda, który pozwala na użycie roli IAM z innego konta AWS i zwraca informacje o używanych AMI.
import boto3
def lambda_handler(event, context):
regions = ['us-east-1', 'eu-central-1']
ami_ids = list()
sts_connection = boto3.client('sts')
account_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::ACCOUNT_ID:role/read-role-all-account",
RoleSessionName="cross_account_lambda"
)
AWS_ACCOUNT_ACCESS_KEY = account_b['Credentials']['AccessKeyId']
AWS_ACCOUNT_SECRET_KEY = account_b['Credentials']['SecretAccessKey']
AWS_ACCOUNT_TOKEN = account_b['Credentials']['SessionToken']
print("Read information from account B, from many regions")
for region in regions:
ec2_client = boto3.client(
'ec2',
region,
aws_access_key_id=AWS_ACCOUNT_ACCESS_KEY,
aws_secret_access_key=AWS_ACCOUNT_SECRET_KEY,
aws_session_token=AWS_ACCOUNT_TOKEN,
)
describe_instance = ec2_client.describe_instances()
for reservation in describe_instance["Reservations"]:
if reservation:
for instance in reservation["Instances"]:
ami_ids.append(instance["ImageId"])
print("InstanceId: " + instance["InstanceId"] + " AMI_Id: " + instance["ImageId"] + " Region: " + region)
return(ami_ids)
Pamiętaj zastąpić ACCOUNT_ID
numerem ID konta AWS.
W filmie, na górze strony albo na YouTube, znajdziesz tutorial pokazujący krok po kroku jak wdrożyć takie rozwiązanie z użyciem cross-account IAM role.
Zachęcam do oglądania i subskrybowania kanału.
Podsumowanie
Tak jak widziałeś zarządzanie rolami IAM z innego konta AWS, nie jest wcale takie trudne. Cross-Account IAM jest na pewno tym, co każdy DevOps powinien znać i umieć zastosować. Jeśli temat nadal przysparza ci problemów, to zachęcam do obejrzenia mojego filmu, w którym znajdziesz więcej szczegółów.
Jeśli nie masz kilku kont AWS do nauki, to się nie przejmuj. Możesz udostępnić przecież sobie rolę IAM na tym samym koncie AWS. Funkcja AWS niech ma tylko uprawnienai do kontroli innej roli IAM na tym samym koncie. Pamiętaj tylko by w kontrolowanej roli dodać odpowiednie uprawnienia.
Zachęcam także do przeczytania innych artykułów np 7 sposobów na usunięcie danych z S3