Можно ли создать правило в другой учетной записи?

Используя CDK, я пытаюсь создать правило шины событий в другой учетной записи:

// Getting source bus ARN
const sourceBusArn = Stack.of(this).formatArn({
  region: this.region,
  service: 'events',
  account: Config.sourceAccount,
  resource: 'event-bus',
  resourceName: Config.sourceBusName,
});

// Retrieving source bus
const sourceBus = EventBus.fromEventBusArn(this, 'SourceBus', sourceBusArn);

// creating rule to forward source bus events to target buses
new Rule(this, 'CrossAccountSourceRule', {
  eventPattern: Config.eventPattern,
  eventBus: sourceBus,
  targets: [new EventBusTarget(targetBus)],
});

Здесь Config.sourceAccount — внешняя учетная запись, отличная от той, в которой выполняется CDK. Шина Config.sourceBusName существует в этой учетной записи и имеет политику, позволяющую создавать правила из внешних учетных записей в той же организации.

Но попытка создать правило выдает исключение Event bus <bus-in-external-account> does not exist. Status Code: 400. Можно ли создать правило в другой учетной записи таким же образом или любым другим способом?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение найдено. При импорте шины из исходной учетной записи вместо EventBus.fromEventBusArn используйте EventBus.fromEventBusAttributes, но с одним поворотом: передайте ARN исходной шины как имя шины, так и ARN шины:

// Getting source bus ARN
const sourceBusArn = Stack.of(this).formatArn({
  region: this.region,
  service: 'events',
  account: Config.sourceAccount,
  resource: 'event-bus',
  resourceName: Config.sourceBusName,
});

// Retrieving source bus. Pass ARN both as name and Arn props.
const sourceCoreBus = EventBus.fromEventBusAttributes(this, 'SourceCoreBus', {
  eventBusName: sourceBusArn,
  eventBusArn: sourceBusArn,
  eventBusPolicy: '',
});

// creating rule to forward source bus events to target buses
new Rule(this, 'CrossAccountSourceRule', {
  eventPattern: Config.eventPattern,
  eventBus: sourceBus,
  targets: [new EventBusTarget(targetBus)],
});

Это создаст правило во внешней учетной записи. Не забывайте, что шина, к которой вы пытаетесь получить доступ, должна иметь требуемую политику разрешений, например.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "AWS":"<id-of-account-that-creates-rules>"
         },
         "Action":[
            "events:DescribeEventBus",
            "events:PutRule",
            "events:PutTargets",
            "events:DeleteRule",
            "events:RemoveTargets",
            "events:DisableRule",
            "events:EnableRule",
            "events:TagResource",
            "events:UntagResource",
            "events:DescribeRule",
            "events:ListTargetsByRule",
            "events:ListTagsForResource"
         ],
         "Resource":[
            "arn:aws:events:us-west-2:<id-of-source-account>:rule/<bus-name>",
            "arn:aws:events:us-west-2:<id-of-source-account>:rule/<bus-name>/*"
         ]
      }
   ]
}

Обновлено: Немного пояснений. Приведенное выше решение работает, потому что внутри конструкции Rule используется конструкция уровня 1 CfnRule. И один из его реквизитов EventBusName может быть либо имя шины или ARN. Поэтому, когда вместо имени передается ARN, оно используется как таковое. И сгенерированный шаблон CloudFormation выглядит так (соответствующий фрагмент):

  "CrossAccountSourceRuleAF67328": {
   "Type": "AWS::Events::Rule",
   "Properties": {
    "EventBusName": {
     "Fn::Join": [
      "",
      [
       "arn:",
       {
        "Ref": "AWS::Partition"
       },
       ":events:",
       {
        "Ref": "AWS::Region"
       },
       ":1234567890:event-bus/bus-name"
      ]
     ]
    },

Вау, я удивлен, что это работает. Можете ли вы поделиться фрагментом результирующего шаблона CloudFormation, который создает правило?

gshpychka 11.05.2022 10:21

@gshpychka Я добавил немного пояснений плюс фрагмент шаблона.

Yuriy Galanter 11.05.2022 12:11

Хорошо, я был уверен, что стек CloudFormation не может просто развернуть ресурс в другой среде. Можете ли вы подтвердить, что это нормально развертывается и фактически создает правило в другой учетной записи?

gshpychka 11.05.2022 12:35

Я тоже так думал, что стек CloudFormation привязан к конкретному окружению - аккаунту и региону, но видимо не всегда так, по крайней мере для некоторых ресурсов. Да, когда на шине другой учетной записи была установлена ​​правильная политика разрешений - это сработало. Правило было успешно создано и работает (использует шину событий в исходной учетной записи в качестве цели).

Yuriy Galanter 11.05.2022 13:18

Но где создается правило? Это на самом деле в исходной учетной записи или в текущей учетной записи, как я и ожидал?

gshpychka 11.05.2022 14:34

Он создается в исходной учетной записи, на которую указывает ARN, в отличие от того, на который развернут стек.

Yuriy Galanter 11.05.2022 14:41

Другие вопросы по теме