Развертыванию CodePipeline через Elasti c Beanstalk отказано в доступе к S3, несмотря на IAM - PullRequest
0 голосов
/ 21 февраля 2020

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:

CodePipeline

Elasti c События Beanstalk:

Beanstalk Events

* Роль 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/...).

...