Pilih preferensi cookie Anda

Kami menggunakan cookie penting serta alat serupa yang diperlukan untuk menyediakan situs dan layanan. Kami menggunakan cookie performa untuk mengumpulkan statistik anonim sehingga kami dapat memahami cara pelanggan menggunakan situs dan melakukan perbaikan. Cookie penting tidak dapat dinonaktifkan, tetapi Anda dapat mengklik “Kustom” atau “Tolak” untuk menolak cookie performa.

Jika Anda setuju, AWS dan pihak ketiga yang disetujui juga akan menggunakan cookie untuk menyediakan fitur situs yang berguna, mengingat preferensi Anda, dan menampilkan konten yang relevan, termasuk iklan yang relevan. Untuk menerima atau menolak semua cookie yang tidak penting, klik “Terima” atau “Tolak”. Untuk membuat pilihan yang lebih detail, klik “Kustomisasi”.

Tentukan izin untuk konstruksi L2 dengan AWS CDK

Mode fokus
Tentukan izin untuk konstruksi L2 dengan AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Tentukan AWS Identity and Access Management (IAM) peran dan kebijakan untuk konstruksi L2 saat menggunakan. AWS Cloud Development Kit (AWS CDK)

Gunakan metode hibah untuk menentukan izin

Saat Anda menentukan infrastruktur menggunakan konstruksi L2 dari Perpustakaan AWS Konstruksi, Anda dapat menggunakan metode hibah yang disediakan untuk menentukan izin yang diperlukan sumber daya Anda. Secara otomatis AWS CDK akan membuat IAM peran yang dibutuhkan untuk semua AWS sumber daya yang membutuhkannya.

Berikut ini adalah contoh yang mendefinisikan izin antara AWS Lambda fungsi dan bucket Amazon Simple Storage Service (Amazon S3). Di sini, grantRead metode konstruksi Bucket L2 digunakan untuk menentukan izin ini:

TypeScript
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); } }
JavaScript
const { Stack, Duration } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); const lambda = require('aws-cdk-lib/aws-lambda'); const kms = require('aws-cdk-lib/aws-kms'); class CdkDemoStack extends Stack { constructor(scope, id, props) { 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); } } // ...
Python
from aws_cdk import ( Stack, aws_s3 as s3, aws_lambda as _lambda, aws_kms as kms, ) from constructs import Construct class CdkDemoStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) key = kms.Key(self, 'BucketKey') bucket = s3.Bucket(self, 'Bucket') handler = _lambda.Function( self, 'Handler', runtime = _lambda.Runtime.NODEJS_20_X, handler = 'index.handler', code = _lambda.Code.from_asset('lambda'), ) # Define permissions between function and S3 bucket using grantRead method bucket.grantRead(handler)
Java
package com.myorg; import software.amazon.awscdk.core.App; import software.amazon.awscdk.core.Stack; import software.amazon.awscdk.core.StackProps; import software.amazon.awscdk.services.kms.Key; import software.amazon.awscdk.services.kms.KeyProps; import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.s3.BucketProps; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.FunctionProps; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.lambda.Code; import software.constructs.Construct; public class CdkDemoStack extends Stack { public CdkDemoStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Key key = new Key(this, "BucketKey", KeyProps.builder().build()); Bucket bucket = new Bucket(this, "Bucket", BucketProps.builder() .encryptionKey(key) .build()); Function handler = new Function(this, "Handler", FunctionProps.builder() .runtime(Runtime.NODEJS_20_X) .handler("index.handler") .code(Code.fromAsset("lambda")) .build()); // Define permissions between function and S3 bucket using grantRead method bucket.grantRead(handler); } public static void main(final String[] args) { App app = new App(); new CdkDemoStack(app, "CdkDemoStack"); app.synth(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.KMS; using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.Lambda; namespace CdkDemo { public class CdkDemoStack : Stack { internal CdkDemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var key = new Key(this, "BucketKey"); var bucket = new Bucket(this, "Bucket", new BucketProps { EncryptionKey = key }); var handler = new Function(this, "Handler", new FunctionProps { Runtime = Runtime.NODEJS_20_X, Handler = "index.handler", Code = Code.FromAsset("lambda") }); // Define permissions between function and S3 bucket using grantRead method bucket.GrantRead(handler); } } }
Go
package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awskms" "github.com/aws/aws-cdk-go/awscdk/v2/awss3" "github.com/aws/aws-cdk-go/awscdk/v2/awslambda" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) // ... func NewCdkDemoStack(scope constructs.Construct, id string, props *CdkDemoStackProps) awscdk.Stack { stack := awscdk.NewStack(scope, &id, &props.StackProps) key := awskms.NewKey(stack, jsii.String("BucketKey"), nil) bucket := awss3.NewBucket(stack, jsii.String("Bucket"), &awss3.BucketProps{ EncryptionKey: key, }) handler := awslambda.NewFunction(stack, jsii.String("Handler"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), Handler: jsii.String("index.handler"), Code: awslambda.Code_FromAsset(jsii.String("lambda"), &awss3assets.AssetOptions{}), }) bucket.GrantRead(handler) return stack } // ...
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); } }

Saat Anda menggunakan metode hibah konstruksi L2 untuk menentukan izin antar sumber daya, AWS CDK akan membuat peran dengan kebijakan hak istimewa paling sedikit berdasarkan metode yang Anda tentukan. Sebagai praktik keamanan terbaik, kami menyarankan Anda menggunakan metode yang hanya menerapkan izin yang Anda perlukan. Misalnya, jika Anda hanya perlu memberikan izin agar fungsi Lambda dapat dibaca dari bucket Amazon S3, gunakan grantRead metode ini sebagai gantinya. grantReadWrite

Untuk setiap metode yang Anda gunakan, CDK menciptakan IAM peran unik untuk sumber daya yang ditentukan. Jika perlu, Anda juga dapat langsung memodifikasi kebijakan yang akan dilampirkan pada peran tersebut. Berikut adalah contohnya:

TypeScript
import { aws_iam as iam } from 'aws-cdk-lib'; handler.addToRolePolicy(new iam.PolicyStatement({ actions: ['s3:GetObject', 's3:List*'], resources: [ bucket.bucketArn, bucket.arnForObjects('*'), ] }));
JavaScript
const iam = require('aws-cdk-lib/aws-iam'); handler.addToRolePolicy(new iam.PolicyStatement({ actions: ['s3:GetObject', 's3:List*'], resources: [ bucket.bucketArn, bucket.arnForObjects('*'), ] }));
Python
from aws_cdk import aws_iam as iam handler.add_to_role_policy(iam.PolicyStatement( actions=['s3:GetObject', 's3:List*'], resources=[ bucket.bucket_arn, bucket.arn_for_objects('*'), ] ))
Java
import software.amazon.awscdk.services.iam.PolicyStatement; import software.amazon.awscdk.services.iam.PolicyStatementProps; handler.addToRolePolicy(PolicyStatement.Builder.create() .actions(Arrays.asList("s3:GetObject", "s3:List*")) .resources(Arrays.asList( bucket.getBucketArn(), bucket.arnForObjects("*") )) .build());
C#
using Amazon.CDK.AWS.IAM; using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.Lambda; handler.AddToRolePolicy(new PolicyStatement(new PolicyStatementProps { Actions = new[] { "s3:GetObject", "s3:List*" }, Resources = new[] { bucket.BucketArn, bucket.ArnForObjects("*") } }));
Go
package main import ( // ... "github.com/aws/aws-cdk-go/awscdk/v2/awsiam" // ... ) // ... func NewCdkDemoStack(scope constructs.Construct, id string, props *CdkDemoStackProps) awscdk.Stack { // ... handler.AddToRolePolicy(awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{ Actions: jsii.Strings("s3:GetObject", "s3:List*"), Resources: jsii.Strings(bucket.BucketArn(), bucket.ArnForObjects("*")), })) // ...
import { aws_iam as iam } from 'aws-cdk-lib'; handler.addToRolePolicy(new iam.PolicyStatement({ actions: ['s3:GetObject', 's3:List*'], resources: [ bucket.bucketArn, bucket.arnForObjects('*'), ] }));

Namun, kami menyarankan Anda menggunakan grant metode jika tersedia.

Buat dan gunakan IAM peran secara manual

Jika Anda memilih untuk tidak menggunakan CDK grant metode untuk membuat dan mengelola izin, Anda harus membuat dan mengonfigurasinya secara manual. Anda dapat membuat IAM peran menggunakan AWS Management Console, AWS CLI, atau AWS SDKs. Kemudian, Anda dapat meneruskannya ke CDK aplikasi Anda secara manual atau menggunakan fitur penyesuaian peran.

Referensi dan kelola semua peran secara manual

Konstruksi yang memerlukan peran memiliki role properti opsional yang dapat Anda gunakan untuk meneruskan objek peran.

Untuk mereferensikan peran secara manual
  1. Gunakan Role.fromRoleName() untuk referensi peran Anda yang sudah ada sebelumnya. Berikut adalah contohnya:

    const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
  2. Lulus peran yang sudah ada sebelumnya saat menentukan sumber daya Anda. Berikut adalah contohnya:

    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, });

Gunakan fitur kustomisasi peran

Fitur penyesuaian AWS CDK peran menghasilkan laporan peran dan kebijakan di CDK aplikasi Anda. Anda dapat menggunakan fitur ini untuk menghasilkan laporan. Kemudian Anda dapat mengganti peran yang telah dibuat sebelumnya untuk mereka.

Untuk menggunakan fitur kustomisasi peran
  1. Tambahkan Role.customizeRoles() suatu tempat ke bagian atas CDK aplikasi Anda. Berikut adalah contohnya:

    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);
  2. Saat Anda mensintesis aplikasi Anda, CDK akan menimbulkan kesalahan, yang menunjukkan bahwa Anda perlu memberikan nama peran yang telah dibuat sebelumnya. Role.customizeRoles() Berikut ini adalah contoh laporan yang dihasilkan:

    <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)/*"
        ]
      }
    ]
  3. Setelah peran dibuat, Anda dapat meneruskannya ke aplikasi Anda untuk sumber daya yang berlaku. Misalnya, jika nama peran yang dibuat LambdaStack/Handler/ServiceRole adalahlambda-service-role, Anda akan memperbarui CDK aplikasi Anda sebagai berikut:

    const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });

    Sekarang CDK akan menggunakan nama peran yang telah dibuat sebelumnya di mana saja peran tersebut direferensikan dalam aplikasi. CDK Ini juga akan terus menghasilkan laporan sehingga setiap perubahan kebijakan di masa depan dapat direferensikan.

    Anda akan melihat bahwa referensi ke bucket Amazon S3 ARN dalam laporan dirender sebagai (LambdaStack/Bucket/Resource.Arn), bukan bucket yang sebenarnyaARN. Ini karena bucket ARN adalah nilai waktu penerapan yang tidak diketahui saat sintesis (bucket belum dibuat). Ini adalah contoh lain mengapa kami merekomendasikan mengizinkan CDK untuk mengelola IAM peran dan izin dengan menggunakan grant metode yang disediakan. Untuk membuat peran dengan kebijakan awal, admin harus membuat kebijakan dengan izin yang lebih luas (misalnya,arn:aws:s3:::*).

PrivasiSyarat situsPreferensi cookie
© 2025, Amazon Web Services, Inc. atau afiliasinya. Semua hak dilindungi undang-undang.