這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 時,為 L2 建構定義 AWS Identity and Access Management (IAM) 角色和政策 AWS Cloud Development Kit (AWS CDK)。
使用授予方法來定義許可
當您使用 AWS Construct Library 中的 L2 建構來定義基礎設施時,您可以使用提供的授予方法來指定資源所需的許可。 AWS CDK 會自動建立需要這些角色的所有 AWS 資源所需的 IAM 角色。
以下是定義 AWS Lambda 函數與 Amazon Simple Storage Service (Amazon S3) 儲存貯體之間許可的範例。在此,儲存貯體 L2 建構的 grantRead
方法用於定義這些許可:
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);
}
}
當您使用 L2 建構的授予方法定義資源之間的許可時, AWS CDK 會根據您指定的方法建立具有最低權限政策的角色。作為安全最佳實務,我們建議您使用僅套用所需許可的方法。例如,如果您只需要授予 Lambda 函數從 Amazon S3 儲存貯體讀取的許可,請使用 grantRead
方法,而非 grantReadWrite
。
對於您使用的每個方法,CDK 會為指定的資源建立唯一的 IAM 角色。如有必要,您也可以直接修改要連接到角色的政策。以下是範例:
import { aws_iam as iam } from 'aws-cdk-lib';
handler.addToRolePolicy(new iam.PolicyStatement({
actions: ['s3:GetObject', 's3:List*'],
resources: [
bucket.bucketArn,
bucket.arnForObjects('*'),
]
}));
不過,我們建議您使用可用的grant
方法。
手動建立和使用 IAM 角色
如果您不想使用 CDK grant
方法來建立和管理許可,則必須手動建立和管理許可。您可以使用 AWS Management Console AWS CLI、 或 AWS SDKs建立 IAM 角色。然後,您可以手動將它們傳遞到您的 CDK 應用程式,或使用角色自訂功能。
手動參考和管理所有角色
需要角色的 建構具有選用role
屬性,您可以用來傳遞角色物件。
手動參考角色
-
使用
Role.fromRoleName()
來參考您現有的角色。以下是範例:const existingRole = Role.fromRoleName(stack, 'Role', 'my-pre-existing-role', { mutable: false // Prevent CDK from attempting to add policies to this role }
-
在定義您的資源時傳遞預先存在的角色。以下是範例:
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, });
使用角色自訂功能
AWS CDK Therole 自訂功能會在 CDK 應用程式中產生角色和政策的報告。您可以使用此功能來產生報告。然後,您可以將預先建立的角色替換為這些角色。
使用角色自訂功能
-
在 CDK 應用程式頂端新增
Role.customizeRoles()
某個位置。以下是範例: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);
-
當您合成應用程式時,CDK 會擲回錯誤,表示您需要提供預先建立的角色名稱給
Role.customizeRoles()
。以下是產生的報告範例:<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)/*" ] } ]
-
建立角色後,您可以將該角色傳遞至應用程式,以取得其適用的資源。例如,如果為 建立的角色名稱
LambdaStack/Handler/ServiceRole
為lambda-service-role
,則您將更新 CDK 應用程式,如下所示:const stack = new Stack(app, 'LambdaStack'); // Add this to pass in the role iam.Role.customizeRoles(stack, { usePrecreatedRoles: { 'LambdaStack/Handler/ServiceRole': 'lambda-service-role', }, });
CDK 現在會在 CDK 應用程式中參考角色的任何位置使用預先建立的角色名稱。它也會繼續產生報告,以便參考任何未來的政策變更。
您會注意到報告中 Amazon S3 儲存貯體 ARN 的參考呈現為 (
LambdaStack/Bucket/Resource.Arn
),而不是儲存貯體的實際 ARN。這是因為儲存貯體 ARN 是合成時未知的部署時間值 (儲存貯體尚未建立)。這是另一個範例,說明為什麼我們建議允許 CDK 使用提供的grant
方法來管理 IAM 角色和許可。若要使用初始政策建立角色,管理員必須建立具有更廣泛許可的政策 (例如arn:aws:s3:::*
)。