В тестовой среде для моделирования более крупной проблемы у меня есть пользователь IAM с напрямую подключенным профилем IAM. Я также пробовал с профилем, прикрепленным к роли IAM, которую принял пользователь IAM.
Профиль позволяет CloudFormation создавать VPC с IPv6CidrBlock и подсетью IPv6Cidr. Этот облачный стек всегда отлично создается в us-east-1 и некоторых других регионах. При дальнейшем тестировании другие регионы всегда терпят неудачу. Не удается создать подсеть IPv6. Исследование показало, что для некоторых регионов необходимо одно дополнительное действие профиля IAM, "ec2:DescribeNetworkAcls". Например us-east-1 и eu-west-2 не требуют дополнительных действий. eu-central-1 и несколько других регионов требуют дополнительных действий профиля IAM.
- Есть ли какая-либо известная причина таких различий в требованиях между регионами? Существуют ли какие-либо настройки службы EC2 или VPC, которые можно запросить, чтобы увидеть разницу?
- Почему CloudTrail не регистрирует сообщение об ошибке, когда в профиле IAM отсутствует действие «ec2:DescribeNetworkAcls»?
- Для предыдущих сбойных регионов, когда действие добавляется в профиль IAM, при повторном тестировании CloudTrail не регистрирует успешное событие с именем «DescribeNetworkAcls», хотя регистрирует все другие связанные события.
Ошибка, показанная в CloudFormation, но не в CloudTrail:
"ResourceStatus": "CREATE_FAILED",
Логический идентификатор: подсеть,
«ResourceStatusReason»:
«Не удалось получить атрибут Ipv6CidrBlocks для AWS::EC2::VPC, с сообщением об ошибке У вас нет прав на выполнение этой операции. (Служба: Ec2, код состояния: 403, идентификатор запроса: XXX, расширенный идентификатор запроса: ноль).. .
При возникновении ошибки добавление следующего действия IAM-политики устраняет проблему. Тем не менее, это событие EventName никогда не регистрируется CloudTrail:
"ec2:ОписатьNetworkAcls"
Шаблон Cloudformation:
---
AWSTemplateFormatVersion: "2010-09-09"
Описание: «Тестовый стек»
Ресурсы:
ВКД:
Тип: AWS::EC2::VPC
Характеристики:
СидрБлок: 172.16.0.0/16
Енабледнсуппорт: правда
EnableDnsHostnames: правда
InstanceTenancy: по умолчанию
ВПЧИПv6:
Тип: AWS::EC2::VPCCidrBlock
Характеристики:
AmazonProvidedIpv6CidrBlock: правда
VpcId: !Ref VPC
Подсеть:
Тип: AWS::EC2::Подсеть
Зависит от:
- ВПЧИПv6
Характеристики:
СидрБлок: 172.16.254.0/23
Ipv6CidrBlock: !Select [0, !Cidr [!Select [0, !GetAtt 'VPC.Ipv6CidrBlocks'], 1, 64]]
MapPublicIpOnLaunch: ложь
VpcId: !Ref VPC
IAM-политика
{
«Версия»: «2012-10-17»,
"Заявление": [
{
"Sid": "CloudFormationStackActions",
«Эффект»: «Разрешить»,
"Действие": [
"Облакообразование:СоздатьСтек",
"облако: стек обновлений",
"cloudformation:описать стеки",
"cloudformation:DescribeStackEvents",
"облако: ListStackResources"
],
"Ресурс": [
"*"
]
},
{
{
"Sid": "ТЕСТИРОВАНИЕVPCIPv6Subnet",
«Эффект»: «Разрешить»,
"Действие": [
"ec2:СоздатьVpc",
"ec2: Создать подсеть",
"ec2:AssociateVpcCidrBlock",
"ec2:AssociateSubnetCidrBlock",
"ec2: изменить атрибут Vpc",
"ec2:ОписатьАтрибутVpc",
"ec2:ОписатьVpcs",
"ec2:Описать подсети"
],
"Ресурс": [
"*"
]
}
]
}
Чтобы воспроизвести:
- Сохраните приведенный выше текст формирования облака в файл с именем «a-test-stack-template.yaml».
- Установите временную переменную bash с именем
aws_cred_profile
с именем профиля учетных данных aws, которое будет использоваться для команд aws cli. Кредиты должны принадлежать пользователю IAM с прикрепленным выше профилем IAM. Используйте значение по умолчанию, если имеется только один набор учетных данных.
aws_cred_profile = по умолчанию
- Команды AWS CLI для тестирования макета:
aws_region=eu-центральный-1
# aws cli create-stack
test_env=$(aws cloudformation create-stack --region $aws_region --no-cli-pager \
--profile $aws_cred_profile --disable-rollback \
--stack-name test-$(дата +%Y%b%d-%H%M%S) \
--template-body файл://a-test-stack-template.yaml \
| sed -r -e 's/.*:стек\/(.*)\/.*/\1/' | СЭД '1d' | сэд '2д')
эхо $test_env
# повторять вызовы list-stack-resources, пока создание стека не будет завершено
aws cloudformation list-stack-resources --region $aws_region --no-cli-pager \
--stack-name=$test_env --max-items=3