当前位置: 首页 > 知识库问答 >
问题:

如何在AWS CDK中获取lambda函数执行角色的Arn

左丘恩
2023-03-14

我的用例是:

我想为现有S3存储桶的PUT事件执行一个lambda函数。

问题是,在CloudForm或CDK中,您不能为现有存储桶添加通知,只能为已创建的存储桶添加通知。

为了解决这个问题,我尝试使用一个自定义资源,将Lambda函数添加到putda通知中。我在CloudFormation中工作得很好,但我现在正尝试使用CDK来做类似的事情。

为了模拟我在Cloud形成中拥有的内容,我需要在现有的桶中添加一个桶策略,向lambda执行角色主体授予操作s3: PutBucketNotify的权限。

在云形成中,我这样做:

NotificationBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref BucketName
      PolicyDocument:
        Statement:
          - Effect: "Allow"
            Action:
            - 's3:PutBucketNotification'
            Resource: !Sub "arn:aws:s3:::${BucketName}"
            Principal:
              AWS: !GetAtt LambdaExecutionRole.Arn

我试图创建bucket策略并在CDK中将语句添加到其中,但我需要Lambda函数的Arn的Arn

const bucket = Bucket.fromBucketName(this, "Bucket", "my-bucket-name");

const bucketConfigurationFunction = new lambda.SingletonFunction(this, "bucketConfigurationFunction ", {
      runtime: lambda.Runtime.NODEJS_8_10,
      code: lambda.Code.asset('lambda/bucket-configuration'),
      handler: 'lambda_function.handler',
      timeout: cdk.Duration.seconds(300),
      uuid: '72561a5f-e772-4365-b3d1-f59e8ddc60b1'
    }) 

const bucketPolicy = new BucketPolicy(this, "TargetBucketPolicy", {
      bucket: bucket
    })


const bucketPolicyStatement = new PolicyStatement()
bucketPolicyStatement.addActions("s3:PutBucketNotification");
//Need to put the execution role arn here but role is undefined
bucketPolicyStatement.addArnPrincipal(bucketConfigurationFunction.role.roleArn)

我读过CDK自动创建lambda函数执行角色,但是当我试图访问角色Arn以将其添加为策略语句中的主体时,它是未定义的。

我这样做完全是错误的吗?

共有1个答案

鲜于勇
2023-03-14

因为TypeScript对检查可选变量非常严格,并且角色是在运行时生成的,所以需要使用和if将其框起来,但这仍然可以。例如,这项工作:

    const bucketPolicyStatement = new iam.PolicyStatement()
    bucketPolicyStatement.addActions("s3:PutBucketNotification");

    if (bucketConfigurationFunction.role) {
      bucketPolicyStatement.addArnPrincipal(bucketConfigurationFunction.role.roleArn)
    }

    const bucketPolicy = new s3.BucketPolicy(this, "TargetBucketPolicy", {
      bucket: bucket,
    })

    bucketPolicy.document.addStatements(bucketPolicyStatement);
 类似资料:
  • 我想做的是: > 我有一个应用程序可以接收登录凭据:用户的用户名和密码。我有一个rest api,它在内部调用keydape rest api:/auth/realms/realmname/protocol/openid connect/token,并获取该用户的访问令牌。 现在,我正在构建另一个RESTAPI来访问我希望执行以下操作的资源:doSomething(accesstoken,data

  • 我有两个AWS帐户(A和B)。在我的帐户A上,我有一个lambda功能,需要访问帐户B的资源。确切地说,我的帐户A上的lambda需要更新我帐户B上托管的Route53区域中的记录。 与S3相反,我在Route53中没有看到任何资源访问策略。所以我有点迷路了。我试图扮演IAM的跨账户角色,但这似乎对lambda不起作用。 如何允许帐户a上的lambda函数访问我的帐户B的资源?

  • 我正在使用AWS Lambda+API网关+无服务器(Python)。太神奇了!

  • 我想知道为用户分配的站点角色名称列表。所以我试着如下, 我只能看到用户的常规类型角色。不是网站类型。但在我的情况下,用户是网站管理员。那么如何使用api调用获取用户的站点角色名称呢?

  • 我试图制作一个命令,显示提及用户的角色。这个命令是一个测试命令,我将在mute命令中实现它。(命令将删除成员的当前角色并添加静音角色) 这就是我所拥有的: 希望有人能帮我。 谢了!

  • 运行lambda函数时,我得到一个Boto3无效参数异常。我正试图找到一种方法来处理这个异常。 我遇到了以下解决方案: 我使用的是python3,我知道boto现在已被弃用,并被boto3取代。但我在boto3中找不到等效的解决方案。 有人能帮我解决这个问题吗?