Как получить Арн из исполняющей роли лямбда-функции в AWS CDK - PullRequest
0 голосов
/ 04 октября 2019

Мой пример использования:

Я хочу выполнить лямбда-функцию для события PUT существующего сегмента S3.

Проблема в том, что вы в CloudFormation или CDK не можете добавлять уведомлениядля существующего сегмента, только для созданных сегментов.

Чтобы обойти это, я пытаюсь использовать пользовательский ресурс, который добавляет функцию Lambda к PutNotification. У меня это работает нормально в CloudFormation, но я пытаюсь использовать CDK сейчас, чтобы сделать что-то подобное.

Чтобы смоделировать то, что у меня есть в CloudFormation, мне нужно добавить политику сегмента в существующий сегмент, предоставляя разрешение для действия s3: PutBucketNotification для принципала роли выполнения лямбда-выражений.

В CloudFormation я делаю это следующим образом:

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

Я пытаюсь создать политику сегмента и добавить к ней оператор в CDK, но яМне нужен Арн лямбда-функции Арн

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 автоматически создает роль выполнения лямбда-функции, однако, когда я пытаюсь получить доступ к роли Арн, чтобы добавить ее в качестве участника в выражении политики, онне определено.

Я делаю это совершенно неправильно?

1 Ответ

0 голосов
/ 07 октября 2019

Поскольку TypeScript довольно строг при проверке необязательных переменных и role генерируется во время выполнения, вам нужно пометить его, используя и 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);
...