Questa è la guida per sviluppatori AWS CDK v2. Il vecchio CDK v1 è entrato in manutenzione il 1° giugno 2022 e ha terminato il supporto il 1° giugno 2023.
Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Definisci ruoli e politiche AWS Identity and Access Management (IAM) per i costrutti L2 quando usi. AWS Cloud Development Kit (AWS CDK)
Utilizza i metodi di concessione per definire le autorizzazioni
Quando definisci la tua infrastruttura utilizzando costrutti L2 della AWS Construct Library, puoi utilizzare i metodi di concessione forniti per specificare le autorizzazioni richieste dalle tue risorse. AWS CDK Creeranno automaticamente i ruoli IAM necessari per tutte le AWS risorse che li richiedono.
Di seguito è riportato un esempio che definisce le autorizzazioni tra una AWS Lambda funzione e il bucket Amazon Simple Storage Service (Amazon S3). Qui, il grantRead
metodo del costrutto Bucket L2 viene utilizzato per definire queste autorizzazioni:
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);
}
}
Quando si utilizzano i metodi di concessione dei costrutti L2 per definire le autorizzazioni tra le risorse, AWS CDK verranno creati ruoli con politiche di privilegi minimi in base al metodo specificato. Come best practice in materia di sicurezza, si consiglia di utilizzare il metodo che applica solo le autorizzazioni necessarie. Ad esempio, se devi solo concedere le autorizzazioni per consentire a una funzione Lambda di leggere da un bucket Amazon S3, utilizza il metodo invece di. grantRead
grantReadWrite
Per ogni metodo utilizzato, il CDK crea un ruolo IAM unico per le risorse specificate. Se necessario, puoi anche modificare direttamente la politica che verrà associata al ruolo. Di seguito è riportato un esempio:
import { aws_iam as iam } from 'aws-cdk-lib';
handler.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject', 's3:List*'],
resources: [
bucket.bucketArn,
bucket.arnForObjects('*'),
]
}));
Tuttavia, ti consigliamo di utilizzare i grant
metodi quando disponibili.
Crea e usa manualmente i ruoli IAM
Se preferisci non utilizzare i grant
metodi CDK per creare e gestire le autorizzazioni, devi crearle e configurarle manualmente. È possibile creare ruoli IAM utilizzando AWS Management Console AWS CLI, o. AWS SDKs Quindi, puoi passarli manualmente nella tua applicazione CDK o utilizzare la funzionalità di personalizzazione dei ruoli.
Fai riferimento e gestisci tutti i ruoli manualmente
I costrutti che richiedono un ruolo hanno una role
proprietà opzionale che è possibile utilizzare per passare un oggetto ruolo.
Per fare riferimento a un ruolo manualmente
-
Usa
Role.fromRoleName()
per fare riferimento al tuo ruolo preesistente. Di seguito è riportato un esempio:const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
-
Assegna il ruolo preesistente quando definisci la tua risorsa. Di seguito è riportato un esempio:
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, });
Usa la funzionalità di personalizzazione del ruolo
La AWS CDK funzione di personalizzazione dei ruoli genera un rapporto sui ruoli e le politiche nell'app CDK. È possibile utilizzare questa funzione per generare un rapporto. Quindi puoi sostituirli con ruoli precreati.
Per utilizzare la funzionalità di personalizzazione dei ruoli
-
Aggiungi
Role.customizeRoles()
un punto nella parte superiore dell'applicazione CDK. Di seguito è riportato un esempio: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);
-
Quando sintetizzi l'applicazione, il CDK genererà un errore, indicando che devi fornire il nome del ruolo creato in precedenza a.
Role.customizeRoles()
Di seguito è riportato un esempio del report generato:<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 volta creato il ruolo, puoi passarlo all'applicazione per la risorsa a cui si applica. Ad esempio, se il nome del ruolo creato per
LambdaStack/Handler/ServiceRole
èlambda-service-role
, aggiornerai l'app CDK come segue:const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });
Il CDK ora utilizzerà il nome del ruolo creato in precedenza ovunque venga fatto riferimento al ruolo nell'applicazione CDK. Continuerà inoltre a generare il rapporto in modo da poter fare riferimento a eventuali future modifiche politiche.
Noterai che il riferimento all'ARN del bucket Amazon S3 nel report viene visualizzato come
LambdaStack/Bucket/Resource.Arn
() anziché l'ARN effettivo del bucket. Questo perché l'ARN del bucket è un valore temporale di implementazione che non è noto al momento della sintesi (il bucket non è stato ancora creato). Questo è un altro esempio del motivo per cui consigliamo di consentire a CDK di gestire i ruoli e le autorizzazioni IAM utilizzando i metodi forniti.grant
Per creare il ruolo con la policy iniziale, l'amministratore dovrà creare la policy con autorizzazioni più ampie (ad esempio,).arn:aws:s3:::*