Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde el 1.° de junio de 2023.
Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Defina las funciones y políticas AWS Identity and Access Management (de IAM) para las construcciones de L2 al utilizar. AWS Cloud Development Kit (AWS CDK)
Utilice métodos de concesión para definir los permisos
Al definir la infraestructura mediante construcciones de nivel 2 de la AWS biblioteca de construcciones, puede utilizar los métodos de concesión proporcionados para especificar los permisos que necesitarán sus recursos. AWS CDK Creará automáticamente las funciones de IAM necesarias para todos los AWS recursos que las requieran.
El siguiente es un ejemplo que define los permisos entre una AWS Lambda función y un bucket de Amazon Simple Storage Service (Amazon S3). En este caso, se utiliza el método grantRead
del constructo de L2 del bucket para definir estos permisos:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as kms from 'aws-cdk-lib/aws-kms';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const key = new kms.Key(this, 'BucketKey');
const bucket = new s3.Bucket(this, 'Bucket', {
encryptionKey: key,
});
const handler = new lambda.Function(this, 'Handler', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// Define permissions between function and S3 bucket using grantRead method
bucket.grantRead(handler);
}
}
Cuando utilice métodos de concesión de estructuras de nivel 2 para definir permisos entre recursos, AWS CDK se crearán roles con políticas de privilegios mínimos en función del método que especifique. Como práctica recomendada de seguridad, le recomendamos que utilice el método que aplique únicamente los permisos que necesite. Por ejemplo, si solo necesita conceder permisos para que una función de Lambda lea desde un bucket de Amazon S3, utilice el método grantRead
en lugar de grantReadWrite
.
Para cada método que utilice, el CDK crea un rol de IAM único para los recursos especificados. Si es necesario, también puede modificar directamente la política que se asociará al rol. A continuación, se muestra un ejemplo:
import { aws_iam as iam } from 'aws-cdk-lib';
handler.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject', 's3:List*'],
resources: [
bucket.bucketArn,
bucket.arnForObjects('*'),
]
}));
Sin embargo, le recomendamos que utilice los métodos grant
cuando estén disponibles.
Creación y utilización manual de roles de IAM
Si prefiere no utilizar los métodos grant
de CDK para crear y administrar los permisos, debe crearlos y configurarlos de forma manual. Puede crear funciones de IAM mediante AWS Management Console, AWS CLI o. AWS SDKs A continuación, puede pasarlos de forma manual a su aplicación CDK o utilizar la característica de personalización de rol.
Consulta y gestión de todos los roles de forma manual
Los constructos que requieren un rol tienen una propiedad role
opcional que puede usar para transferir un objeto de rol.
Para hacer referencia a un rol de forma manual
-
Se utiliza
Role.fromRoleName()
para hacer referencia a un rol preexistente. A continuación, se muestra un ejemplo:const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
-
Pase el rol preexistente al definir su recurso. A continuación, se muestra un ejemplo:
const handler = new lambda.Function(stack, 'Handler', { runtime: lambda.Runtime.NODEJS_20_XZ, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), // Pass in pre-existing role role: existingRole, });
Utilice la característica de personalización de roles
La AWS CDK función de personalización de roles genera un informe de los roles y políticas de tu aplicación CDK. Puede utilizar esta característica para generar un informe. Luego, puede sustituirlos por roles ya creados.
Para utilizar la característica de personalización de roles
-
Agregue
Role.customizeRoles()
en algún lugar situado en la parte superior de la aplicación CDK. A continuación, se muestra un ejemplo:const stack = new Stack(app, 'LambdaStack'); // Add this to use the role customization feature iam.Role.customizeRoles(stack); // Define your resources using L2 constructs const key = new kms.Key(stack, 'BucketKey'); const bucket = new s3.Bucket(stack, 'Bucket', { encryptionKey: key, }); const handler = new lambda.Function(stack, 'Handler', { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), }); // The grantRead() is still important. Even though it actually doesn't mutate // any policies, it indicates the need for them. bucket.grantRead(handler);
-
Al sintetizar la aplicación, el CDK mostrará un error que indica que debe proporcionar el nombre del rol creado con anterioridad a
Role.customizeRoles()
. A continuación, se muestra un ejemplo del informe generado:<missing role> (LambdaStack/Handler/ServiceRole) AssumeRole Policy: [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" } } ] Managed Policy ARNs: [ "arn:(PARTITION):iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ] Managed Policies Statements: NONE Identity Policy Statements: [ { "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*" ], "Effect": "Allow", "Resource": [ "(LambdaStack/Bucket/Resource.Arn)", "(LambdaStack/Bucket/Resource.Arn)/*" ] } ]
-
Una vez creado el rol, puede pasarlo a la aplicación para el recurso al que se aplica. Por ejemplo, si el nombre del rol para creado para
LambdaStack/Handler/ServiceRole
eslambda-service-role
, actualizaría la aplicación CDK de la siguiente manera:const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });
El CDK ahora usará el nombre del rol creado con anterioridad en cualquier lugar en el que se haga referencia al rol en la aplicación CDK. También seguirá generando el informe para que se pueda hacer referencia a cualquier cambio futuro en la política.
Observará que la referencia al ARN del bucket de Amazon S3 en el informe se representa como (
LambdaStack/Bucket/Resource.Arn
) en lugar del ARN real del bucket. Esto se debe a que el ARN del bucket es un valor de tiempo de implementación que no se conoce en el momento de la síntesis (el bucket aún no se ha creado). Este es otro ejemplo de por qué recomendamos permitir que CDK administre los permisos y los roles de IAM mediante los métodosgrant
proporcionados. Para crear el rol con la política inicial, el administrador tendrá que crear la política con permisos más amplios (por ejemplo,arn:aws:s3:::*
).