Pulumi: как создать правило события CloudWatch для хранилища - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь захватить событие PutImage из определенного репозитория ECR, используя Cloudwatch для запуска Lambda.

Моя проблема в том, что eventPattern набирается как 'строка':

export const myTestRepo = ECRTemplate('my-test-repo');

export const eventRule = new aws.cloudwatch.EventRule("putimagerule", {
    eventPattern: JSON.stringify({
        "detail-type": [
            "AWS API Call via CloudTrail"
        ],
        "source": ["aws.ecr"],
        "detail": {
            "eventName": ["PutImage"],
            "repositoryName": [myTestRepo.repository.name]
        }
    }),
});

, а результирующее правило события выглядит так:

{
   "detail":{
      "eventName":[
         "PutImage"
      ],
      "repositoryName":[
         "Calling [toJSON] on an [Output\u003cT\u003e] is not supported.\n\nTo get the value of an Output as a JSON value or JSON string consider either:\n    1: o.apply(v =\u003e v.toJSON())\n    2: o.apply(v =\u003e JSON.stringify(v))\n\nSee https://pulumi.io/help/outputs for more details.\nThis function may throw in a future version of @pulumi/pulumi."
      ]
   },
   "detail-type":[
      "AWS API Call via CloudTrail"
   ],
   "source":[
      "aws.ecr"
   ]
}

Объект myTestRepo содержитдействительный репозиторий и не является частью проблемы, поэтому он не включен сюда.

Q: Как отловить PutImage для конкретного репозитория?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Проблема вызвана типом myTestRepo.repository.name: это не string, а pulumi.Output<string>. Его значение неизвестно во время первого запуска программы, поэтому вы не можете использовать его при интерполяции строк.

Вместо этого вы можете использовать apply function:

const eventRule = new aws.cloudwatch.EventRule("putimagerule", {
    eventPattern: myTestRepo.repository.name.apply(repositoryName =>
        JSON.stringify({
          "detail-type": [
              "AWS API Call via CloudTrail",
          ],
          "source": ["aws.ecr"],
          "detail": {
              eventName: ["PutImage"],
              repositoryName: [repositoryName],
          },
    })),
});

Youможете узнать больше в Выходы и Входы Документы.

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

Проблема с линией "repositoryName": [myTestRepo.repository.name]

Попробуйте

export const myTestRepo = ECRTemplate('my-test-repo');

export const eventRule = new aws.cloudwatch.EventRule("putimagerule", {
    eventPattern: {
        "detail-type": [
            "AWS API Call via CloudTrail"
        ],
        "source": ["aws.ecr"],
        "detail": {
            "eventName": ["PutImage"],
            "repositoryName": [myTestRepo.repository.name.apply(v => v.toJSON()]
        }
    });
...