Используя 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
. Можно ли создать правило в другой учетной записи таким же образом или любым другим способом?
Решение найдено. При импорте шины из исходной учетной записи вместо 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"
]
]
},
@gshpychka Я добавил немного пояснений плюс фрагмент шаблона.
Хорошо, я был уверен, что стек CloudFormation не может просто развернуть ресурс в другой среде. Можете ли вы подтвердить, что это нормально развертывается и фактически создает правило в другой учетной записи?
Я тоже так думал, что стек CloudFormation привязан к конкретному окружению - аккаунту и региону, но видимо не всегда так, по крайней мере для некоторых ресурсов. Да, когда на шине другой учетной записи была установлена правильная политика разрешений - это сработало. Правило было успешно создано и работает (использует шину событий в исходной учетной записи в качестве цели).
Но где создается правило? Это на самом деле в исходной учетной записи или в текущей учетной записи, как я и ожидал?
Он создается в исходной учетной записи, на которую указывает ARN, в отличие от того, на который развернут стек.
Вау, я удивлен, что это работает. Можете ли вы поделиться фрагментом результирующего шаблона CloudFormation, который создает правило?