TL; DR
Я установил развертывание Beanstalk в моей CodePipeline, и теперь я получаю: Deployment completed, but with errors: Failed to deploy application. Service:Amazon S3, Message:Access Denied
. Тем не менее, похоже, что мои разрешения IAM в порядке.
Я начал с проекта CodeStar, а затем постепенно превратился в более специализированное приложение. Недавно я хотел отойти от CloudFormation, поскольку его взаимодействие с CodeStar несколько раз перезаписывало определенные вещи, такие как политики IAM во время развертываний.
Теперь я создал новую среду SingleInstance в том же приложении Elasti c Beanstalk который был создан с помощью CodeStar. В моей CodePipeline я связал новую конфигурацию сборки, которая использует другой файл buildspe c (таким образом, я могу сохранить старую среду, настроенную CodeStar, до тех пор, пока я не буду уверен, что с моей новой установкой все работает как положено).
Исходная сборка c выводит определенный Артефакт, который используется при развертывании CloudFormation. Второй, который я создаю, выводит другой артефакт, который немного отличается, так что его можно правильно развернуть для развертывания Beanstalk.
Вот второй файл buildspe c:
version: 0.2
phases:
install:
runtime-versions:
java: openjdk8 # todo: requires 11 for SQ, but crashes Tomcat because JRE is 8
commands:
# Upgrade AWS CLI to the latest version
- pip install --upgrade awscli
pre_build:
commands:
- cd $CODEBUILD_SRC_DIR
- rm -r utils
- 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
base-directory: 'target/ROOT'
files:
- ./**/*
- .ebextensions/**/*
Теперь я проверил, что CodeBuild генерирует файл с желаемой подходящей структурой (WEBINF
, et c ...) и записывает его в S3 Bucket. Я также проверил соответствующие разрешения IAM ...
Мой конвейер не работает с этой ошибкой: Deployment completed, but with errors: Failed to deploy application. Service:Amazon S3, Message:Access Denied
.
Частичный снимок экрана CodePipeline:
Elasti c События Beanstalk:
* Роль IAM CodeStar/.../Toolchain
имеет Allow s3:* on *
(потому что AWSElasticBeanstalkFullAccess
прилагается), и его политика Границы имеет (среди прочего):
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": "*",
"Resource": [
"arn:aws:cloudformation:ca-central-1:781541930934:stack/awseb-e-xxx-stack/zzz",
"arn:aws:cloudformation:ca-central-1:781541930934:stack/awseb-e-xxx-stack/zzz/*",
"arn:aws:cloudformation:ca-central-1:xxx:stack/awscodestar-yyy-on-cod-*",
"arn:aws:codebuild:ca-central-1:xxx:project/yyy-on-cod",
"arn:aws:codebuild:ca-central-1:xxx:project/yyy",
"arn:aws:codecommit:ca-central-1:xxx:yyy-on-codecommit",
"arn:aws:codepipeline:ca-central-1:xxx:yyy-on-cod-Pipeline",
"arn:aws:elasticbeanstalk:ca-central-1:xxx:*/yyy-on-cod*",
"arn:aws:s3:::aws-codestar-ca-central-1-xxx-yyy-on-cod-pipe",
"arn:aws:s3:::aws-codestar-ca-central-1-xxx-yyy-on-cod-pipe/*",
"arn:aws:s3:::elasticbeanstalk-ca-central-1-xxx/resources/environments/e-xxx",
"arn:aws:s3:::elasticbeanstalk-ca-central-1-xxx/resources/environments/e-xxx/*"
]
}
... который ссылается на Bucket, где находится файл, выводимый из CodeBuild.
IAM, связанный с именем моего проекта и заканчивающийся EBService
, также был изменен, чтобы включить политику, которая предоставляет доступ к соответствующим сегментам S3.
При просмотре CloudTrail я вижу, что CreateApplicationVersion
и UpdateEnvironment
оба вызываются с политикой CodeStar...Toolchain
как пользователь, с источником событий, являющимся Beanstalk, и источником IP, являющимся Pipeline, и ссылка на S3-контейнер действительно упоминается в политике.
Это было 2 дни, когда я пытался заставить это работать. Я изможден. Что не так с этой штукой?
Precision
Когда у меня не было base-directory
, файл каким-то образом был правильно развернут в моей среде Beanstalk, но структура файла (полученная с помощью s sh смотреть на /usr/share/tomcat8/webapps/
) было неправильно (это было ROOT/target/ROOT/WEB-INF/...
вместо ROOT/WEB-INF/...
).