Este é o Guia do Desenvolvedor AWS CDK v2. O CDK v1 antigo entrou em manutenção em 1º de junho de 2022 e encerrou o suporte em 1º de junho de 2023.
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Defina funções e políticas AWS Identity and Access Management (IAM) para construções de L2 ao usar o. AWS Cloud Development Kit (AWS CDK)
Usar métodos de concessão para definir permissões
Ao definir sua infraestrutura usando construções L2 da AWS Construct Library, você pode usar os métodos de concessão fornecidos para especificar as permissões que seus recursos exigirão. Eles AWS CDK criarão automaticamente as funções do IAM necessárias para todos os AWS recursos que as exigem.
Veja a seguir um exemplo que define permissões entre uma AWS Lambda função e o bucket do Amazon Simple Storage Service (Amazon S3). Aqui, o método grantRead
do constructo L2 do bucket é usado para definir essas permissões:
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 você usa métodos de concessão de construções L2 para definir permissões entre recursos, eles AWS CDK criarão funções com políticas de privilégios mínimos com base no método especificado. Como prática recomendada de segurança, use o método que aplica somente as permissões necessárias. Por exemplo, se você só precisa conceder permissões para que uma função do Lambda leia de um bucket do Amazon S3, use o método grantRead
em vez de grantReadWrite
.
Para cada método que você usa, o CDK cria um perfil do IAM exclusivo para os recursos especificados. Se necessário, você também pode modificar diretamente a política que será anexada ao perfil. Veja um exemplo a seguir:
import { aws_iam as iam } from 'aws-cdk-lib';
handler.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject', 's3:List*'],
resources: [
bucket.bucketArn,
bucket.arnForObjects('*'),
]
}));
No entanto, recomendamos usar os métodos grant
quando disponíveis.
Criar e usar manualmente os perfis do IAM
Se você preferir não usar os métodos grant
do CDK para criar e gerenciar permissões, deverá criá-las e configurá-las manualmente. Você pode criar funções do IAM usando o AWS Management Console AWS CLI, ou AWS SDKs. Em seguida, você pode passá-los para sua aplicação CDK manualmente ou usar o atributo de personalização de perfis.
Referenciar e gerenciar todos os perfis manualmente
Os constructos que exigem um perfil têm uma propriedade role
opcional que você pode usar para transmitir um objeto de perfil.
Para referenciar um perfil manualmente
-
Use
Role.fromRoleName()
para referenciar seu perfil preexistente. Veja um exemplo a seguir:const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
-
Passe o perfil preexistente ao definir seu recurso. Veja um exemplo a seguir:
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, });
Usar o atributo de personalização de perfis
O recurso de personalização de AWS CDK funções gera um relatório de funções e políticas em seu aplicativo CDK. Você pode usar esse atributo para gerar um relatório. Em seguida, você pode substituir perfis pré-criados para eles.
Para usar o atributo de personalização de perfis
-
Adicione
Role.customizeRoles()
a algum lugar na parte superior da sua aplicação CDK. Veja um exemplo a seguir: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 você sintetiza sua aplicação, o CDK gera um erro, indicando que você precisa fornecer o nome do perfil pré-criado para
Role.customizeRoles()
. O seguinte é um exemplo do relatório gerado:<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)/*" ] } ]
-
Depois que o perfil for criado, você poderá passá-lo para sua aplicação para o recurso ao qual ele se aplica. Por exemplo, se o nome do perfil criado para
LambdaStack/Handler/ServiceRole
forlambda-service-role
, você atualizaria sua aplicação CDK da seguinte forma:const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });
O CDK agora usará o nome do perfil pré-criado em qualquer lugar em que o perfil seja referenciado na aplicação CDK. Também continuará gerando o relatório para que quaisquer mudanças futuras na política possam ser referenciadas.
Você notará que a referência ao ARN do bucket do Amazon S3 no relatório é renderizada como (
LambdaStack/Bucket/Resource.Arn
) em vez do ARN real do bucket. Isso ocorre porque o ARN do bucket é um valor de tempo de implantação que não é conhecido na síntese (o bucket ainda não foi criado). Esse é outro exemplo de por que recomendamos permitir que o CDK gerencie os perfis e permissões do IAM usando os métodosgrant
fornecidos. Para criar o perfil com a política inicial, o administrador precisará criar a política com permissões mais amplas (por exemplo,arn:aws:s3:::*
).