[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]
AWS: Cómo utilizar roles de IAM entre cuentas con funciones Lambda: la forma más sencilla
Exploremos el uso de roles de IAM entre cuentas en AWS e implementémoslo en la función Lambda. Usaremos Python como lenguaje de código para nuestro Lambda.
Si es un desarrollador de AWS, tarde o temprano se le pedirá que implemente roles de IAM entre cuentas para que las aplicaciones o servicios en otras cuentas de AWS puedan acceder a recursos específicos en la cuenta de destino. No te preocupes, sería una tarea fácil de resolver y te muestro cómo.
[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]
Comencemos con una definición de tarea de ejemplo:
La función Lambda en la cuenta A necesita escribir algunos valores en claves específicas en el almacén de parámetros de AWS en la cuenta B.
En primer lugar, vayamos a la Cuenta A e implementemos un rol de IAM para la función de Lambda. Para hacerlo simple, usaré la siguiente plantilla de CloudFormation:
LambdaIAMRole:
Type: AWS::IAM::Role
Properties:
RoleName: LambdaIAMRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- 'sts:AssumeRole'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Ahora necesitamos crear el rol de IAM entre cuentas en la cuenta B, que proporciona permisos para escribir en el almacén de parámetros. Y el rol de IAM creado debe tener permisos para ser asumido por el rol de IAM de Lambda de la cuenta A.
Utilice la plantilla de CloudFormation a continuación y reemplace ACCOUNT_A_ID con el ID de cuenta de su función Lambda.
ParameterStoreRole:
Type: AWS::IAM::Role
Properties:
RoleName: ParameterStoreRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS:
- arn:aws:iam::ACCOUNT_A_ID:root
Action: sts:AssumeRole
Condition:
StringLike:
aws:PrincipalArn:
- arn:aws:iam::ACCOUNT_A_ID:role/LambdaIAMRole
Policies:
- PolicyName: ParameterStore
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Sid: ParameterStoreActions
Action:
- ssm:PutParameter
Resource: arn:aws:ssm:*:*:parameter/external/*
Una vez que se crean los roles de IAM, podemos pasar a escribir una función Lambda usando Python. Aquí está la plantilla de código que puede usar en su proyecto.
import boto3
import traceback
# Parameters
cross_account_iam_role_name = 'ParameterStoreRole'
account_b_id = '123456789'
parameter_store_key_prefix = '/external'
parameter_store_value = 'Hello from Account A'
session_name = 'LambdaParameterStoreWrite'
def lambda_handler(event, context):
try:
#Establish STS connection to the Account B
sts_connection = boto3.client('sts')
acct_a = sts_connection.assume_role(
RoleArn=cross_account_iam_role_name,
RoleSessionName=session_name
)
# Identify Access Keys to the Account B IAM role
ACCESS_KEY = acct_a['Credentials']['AccessKeyId']
SECRET_KEY = acct_a['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_a['Credentials']['SessionToken']
# Create connection to Session Manager service on Account B
ssm = boto3.client('ssm', aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
# Write Value to the parameter store key
write_to_parameterstore = ssm.put_parameter(
Name=parameter_store_key_prefix,
Value=parameter_store_value, Type='String',
Overwrite=True)
except:
# Print error message
traceback.print_exc()
return True
¡Y eso es casi todo! 🙂
Una vez que haya implementado las plantillas de Cloudformation para roles de IAM y también el código Lambda (no olvide adjuntar LambdaIAMRole a su función de Lambda), tendrá una solución funcional para asumir un rol de IAM desde una cuenta de AWS externa y ejecutar una tarea específica en la cuenta de destino mediante Lambda.
Siéntase libre de modificar el código a sus necesidades 🙂
[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]
Diego Pacheco
Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
Recent Post
[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]
