Context
Сначала это был проект CodeStar, а затем он перерос в нечто большее. Мы повторно использовали приложение Beanstalk для создания сред stage
и prod
и сохранили изначально созданную среду dev
как есть.
Мы обновили CodePipeline для развертывания в наших новых средах с использованием "Elasti c Beanstalk "в качестве поставщика. (Хотя CodeStar настроил развертывание с использованием CloudFormation для среды, которую он автоматически предоставил в приложении Beanstalk.)
Проблема
Развертывание не выполнено из-за ошибки, в которой упоминается autoscaling:DescribeAutoScalingGroups
авторизован для выполнения ролью IAM CodePipeline.
Вот полное сообщение об ошибке, отображаемое в CodePipeline:
Недостаточные разрешения
Развертывание не удалось.
Предоставленная роль не имеет достаточных разрешений: Пользователь: arn: aws: sts :: xxx: предполагаемая роль / CodeStarWorker-xxx-on-cod-ToolChain / yyy не авторизован для выполнения: autoscaling: DescribeAutoScalingGroups (Service : AmazonAutoScaling; код состояния: 403; код ошибки: AccessDenied; идентификатор запроса: 905ee6ef-d75d-4cf8-b5f3-e6b16a5f6477)
Служба: AmazonAutoScaling, сообщение: пользователь: arn: aws: sts :: xxx : предполагаемая роль / CodeStarWorker-xxx-on-cod-ToolChain / yyy не разрешено выполнять: автоматическое масштабирование: DescribeAutoScalingGroups
Fai привел к развертыванию приложения.
Служба: AmazonAutoScaling, сообщение: пользователь: arn: aws: sts :: xxx: предполагаемая роль / CodeStarWorker-xxx-on-cod-ToolChain / yyy не авторизован для выполнения : autoscaling: DescribeAutoScalingGroups
IAM
Вот содержание CodePipeline (он же CodeStarWorker-xxx-on-cod-ToolChain
):
И вот связанная Граница разрешений (первоначально сгенерированная CodeStar и в конечном итоге обновленная нами, чтобы попытаться заставить все это работать):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ssm:GetParameters",
"Resource": "*",
"Condition": {
"StringEquals": {
"ssm:ResourceTag/awscodestar:projectArn": "arn:aws:codestar:yyy:xxx:project/xxx-on-cod"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:CreateBucket",
"iam:PassRole",
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:s3:::aws-codestar-yyy-xxx/xxx-on-cod/ssh/*",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx/*",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx",
"arn:aws:s3:::awscodestar-remote-access-yyy/*",
"arn:aws:s3:::awscodestar-remote-access-signatures-yyy/*",
"arn:aws:iam::xxx:role/CodeStarWorker-xxx-on-cod-CloudFormation",
"arn:aws:secretsmanager:yyy:xxx:secret:xxx"
]
},
{
"Sid": "VisualEditor4",
"Effect": "Allow",
"Action": [
"s3:*",
"codebuild:*",
"ec2:Describe*",
"ec2:*SecurityGroup*",
"iam:PassRole"
],
"Resource": [
"*"
]
},
{
"Sid": "VisualEditor14",
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": [
"arn:aws:logs:yyy:xxx:log-group:/aws/elasticbeanstalk/*"
]
},
{
"Sid": "VisualEditor6",
"Effect": "Allow",
"Action": [
"elasticbeanstalk:CreateApplicationVersion",
"elasticbeanstalk:UpdateEnvironment"
],
"Resource": [
"*"
]
},
{
"Sid": "VisualEditor5",
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:SuspendProcesses",
"autoscaling:ResumeProcesses",
"autoscaling:DescribeScalingActivities"
],
"Resource": [
"arn:aws:autoscaling:yyy:xxx:autoScalingGroup:*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"sns:Get*",
"sns:Publish",
"logs:DescribeLogGroups",
"cloudtrail:StartLogging",
"lambda:ListFunctions",
"cloudtrail:CreateTrail",
"sns:Subscribe",
"xray:Put*",
"logs:CreateLogGroup",
"logs:PutLogEvents",
"sns:List*"
],
"Resource": "*"
},
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": "*",
"Resource": [
"arn:aws:cloudformation:yyy:xxx:stack/awseb-e-mjdwv9ptcz-stack/2d588c80-5284-11ea-a1d4-068f4db663b8",
"arn:aws:cloudformation:yyy:xxx:stack/awseb-e-mjdwv9ptcz-stack/2d588c80-5284-11ea-a1d4-068f4db663b8/*",
"arn:aws:cloudformation:yyy:xxx:stack/awscodestar-xxx-on-cod-*",
"arn:aws:codebuild:yyy:xxx:project/xxx-on-cod",
"arn:aws:codecommit:yyy:xxx:xxx-on-codecommit",
"arn:aws:codepipeline:yyy:xxx:xxx-on-cod-Pipeline",
"arn:aws:elasticbeanstalk:yyy:xxx:*/xxx-on-cod*",
"arn:aws:s3:::aws-codestar-yyy-xxx-xxx-on-cod-pipe",
"arn:aws:s3:::aws-codestar-yyy-xxx-xxx-on-cod-pipe/*",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx/resources/environments/e-fp3mwptx9q",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx/resources/environments/e-fp3mwptx9q/*",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx/resources/environments/e-mjdwv9ptcz",
"arn:aws:s3:::elasticbeanstalk-yyy-xxx/resources/environments/e-mjdwv9ptcz/*"
]
}
]
}
Трубопровод
Как вы можете видеть, у нас есть два CodeBuild, потому что первый - это тот, который установлен CodeStar, и второй - тот, который слегка изменяет выходной артефакт так, чтобы он был в правильном формате для прямой загрузки в Beanstalk.
Успешное развертывание - это то, что из CodeStar (с использованием провайдера CloudFormation), следующее это сбой (с использованием Beanstalk Provider).
CodeStar CodeBuild (buildspec.yml
)
Выходной артефакт используется развертыванием CloudFormation:
version: 0.2
phases:
install:
runtime-versions:
java: openjdk8
commands:
# Upgrade AWS CLI to the latest version
- pip install --upgrade awscli
pre_build:
commands:
- cd $CODEBUILD_SRC_DIR
- mvn clean compile test
build:
commands:
- mvn war:exploded
post_build:
commands:
- cp -r .ebextensions/ target/ROOT/
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template-file template-export.yml
# Do not remove this statement. This command is required for AWS CodeStar projects.
# Update the AWS Partition, AWS Region, account ID and project ID in the project ARN on template-configuration.json file so AWS CloudFormation can tag project resources.
- sed -i.bak 's/\$PARTITION\$/'${PARTITION}'/g;s/\$AWS_REGION\$/'${AWS_REGION}'/g;s/\$ACCOUNT_ID\$/'${ACCOUNT_ID}'/g;s/\$PROJECT_ID\$/'${PROJECT_ID}'/g' template-configuration.json
artifacts:
type: zip
files:
- target/ROOT/**/*
- .ebextensions/**/*
- 'template-export.yml'
- 'template-configuration.json'
Наш CodeBuild (buildspec-two.yml
)
Используется выходной артефакт в результате (сбойного) развертывания Beanstalk:
# Everything up to that point is the very same as the code from above
artifacts:
type: zip
base-directory: 'target/ROOT'
files:
- ./**/*
- .ebextensions/**/*
Заключение
Я не представляю, как может произойти сбой развертывания, поскольку как в Permission Boundary, так и в базовой роли IAM упоминается, что autoscaling:DescribeAutoScalingGroups
.
Более того, развертывание в среде CodeStar работает нормально, но эта конкретная среда, которая не проходит развертывание, происходит из точной копии (с точки зрения конфигурации).
Есть идеи?
(Более того, исходная среда dev
, так же как и вновь созданная среда stage
, даже не имеет связанной с ней AutoScalingGroup ... поэтому я понятия не имею, почему развертывание даже пытается чтобы сделать это.)
(И я заглянул в S3, чтобы убедиться, что оба развертываемых артефакта имеют одинаковую структуру.)