Рубрики
Uncategorized

Как создать кодовую обработку с источником от другой учетной записи AWS?

При использовании AWS Services, чаще всего, нам нужны несколько учетных записей AWS по разным причинам. Если … помечен с кодом, AWS, CICD, DEVOPS.

При использовании AWS Services, чаще всего, нам нужны несколько учетных записей AWS по разным причинам. Если вы работаете над инструментами AWS DEVOPS, вы, должно быть, надо надо мной AWS CodePipipeline который является инструментом автоматизации трубопровода от AWS. Работая с CodePipipeline в сценарии с несколькими счетами, я уверен, что все, что все столкнулось с множеством таких вопросов, как Доступ отрицал Ошибки, которые являются наиболее головоломками и разочаровывающими ошибками, ИМХО, потому что не всегда говорится, где нам не хватает разрешений. В сценарии нескольких учетных записей для CodePipipeline, если вы развертываете свое приложение в другой учетной записи AWS, AWS имеет это отличное Документация Который я бы очень рекомендую вам пройти. Но что, если у вас есть требование, когда источник самого трубопровода находится в другой учетной записи AWS?

В последнее время я столкнулся с этим использованием и попытался найти некоторое начальное руководство по созданию кодовой обработки, имеющего источник с другой учетной записи AWS, но не смогли найти никаких полезных ресурсов. Следовательно, я решил написать этот блог, чтобы помочь другим, которые могут столкнуться с такими использованием.

Этот блог проведет вас через пример развертывания от Amazon Ecr к Amazon ECS С помощью кодовой обработки. Здесь у меня есть использование, в котором,

  • Account-A уже построена докера, размещенное в ECR (исходный этап)
  • Account-B имеет ведро S3 (исходный этап), содержащий imagedefinitions.json и ECS (развертывание этапа).

Примечание. Все ресурсы AWS в этом примере существуют в том же регионе AWS.

Наше требование такое, что у нас есть команда разработчиков в учетной записи — A, который будет создавать свои изображения докера на местном уровне, толкает его в репозиторий ECR в учетной записи A и это изображение докера должно быть автоматически развернуто к ресурсам (ECS), присутствующим в учетной записи B Всякий раз, когда наши разработчики вносят изменения в их образы докера и подтолкнут его в репозитории аккаунта ECR. И мы хотим, чтобы наша кодепейлина была создана в самой аккаунте-B, где сделано наше развертывание. Звучит сложно, верно? Не волнуйтесь. Давайте начнем…

Шаг 1: В учетной записи-B -> Настройка нормальной кодовой обработки:

  1. Во-первых, создайте стандартный трубопровод, имеющий все компоненты трубопровода (ECR, S3, ECS), проживающие в том же счете — B обычно так, как вы бы. Мы создаем этот трубопровод в том же учетной записи, сначала только для получения структуры позвоночника для нашего поперечного трубопровода, который мы будем изменять в соответствии с нашими требованиями в более поздних шагах.
  2. На этом трубопроводе исходная сцена будет иметь два действия I.E. ECR и S3, где ECR будет вашим репозиторий с тегом изображения и ведра S3 будет иметь ZIP-файл файла JSON с именем imagedefinitions.json. Этот файл JSON требуется для развертывания ECS, как он содержит имя контейнера и URI ECR Image с его тегом изображения. Обратитесь к этому Официальная документация Чтобы узнать больше об этом файле. Не забудьте заставить zip файл, когда S3 используется на исходном этапе.

    ПРИМЕЧАНИЕ: Это ведро S3 должно быть версию Отказ

  3. Когда вы включаете ECS (стандартное развертывание) в качестве поставщика развертывания в вашем трубопрочесе, обязательно указывайте на вывод действия S3 Action в качестве входа в ECS, потому что выход ECR Action будет содержать информацию только о изображении Docker, а не на имя контейнера, который ожидается по кодеPipipine работник для ECS.

  4. После того, как у вас есть рабочий конвейер в учетной записи-B, мы изменим его для развертываний с перекрестным счетом, имеющим источник от учетной записи-A.

Шаг 2: в учетной записи-B -> Создать пользовательскую клавишу AWS KMS:

  1. Для любых развертываний по перекрестному счету CodePipipeline требует пользовательского ключа KMS, позволяя другую учетную запись AWS для доступа к зашифрованным артефактам CodePipipeline, сохраненным в кодом S3 CodePipeline (Artifact Store).
  2. Создание пользовательских AWS KMS ключевая учетная запись — A для доступа к артефактам CodePipeline, проживающих в ведре S3 SP S3.
  3. Создавая политику KMS через консоль, когда вы достигнете 5-го шага Просмотрите и редактируйте ключевую политику Введите следующую политику, заменив соответствующую арну на комментарий.

  4. Вышеуказанная ключевая политика KMS позволит вашему пользователю IAM, роли сервисной службы IAM, Account-A для доступа к этой клавише KMS, с которой будут зашифрованы наши артефакты.

Шаг 3: В учетной записи-A -> Создать пользовательскую роль IAM для перекрестного доступа:

  1. Создать новую роль IAM по имени Brossaccount-a_role Отказ Вы можете назвать эту роль что-нибудь, что вы хотите, пока это следует за конвенциями именования в IAM. Подумайте о том, чтобы дать роль имя, которое четко заявляет о своей цели.
  2. На Создать роль Страница, выберите Еще одна учетная запись AWS Вариант от Выберите тип доверенного объекта раздел. Введите идентификатор учетной записи AWS Account-B в Укажите учетные записи, которые могут использовать эту роль раздел. Нажмите Следующий: Разрешения Отказ
  3. Прикрепите две управляемые политики AWS по имени Amazonec2containerregistryReadonly и Amazons3fullaccess к этой роли IAM.
  4. Создать еще один пользовательский встроенный IAM Политика с именем Cross-Account-KMS Для этой же роли IAM доступ к KMS ключевой учетной записи-B, который мы создали на шаге 2. Введите политику ниже IAM, заменив клавишу ARN KMS в учетную запись-B на комментарии для этой встроенной политики.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:GenerateDataKey*",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:Decrypt"
            ],
            "Resource": [
                ""  //MAKE CHANGE HERE
            ]
        }
    ]
}

Шаг 4: В учетной записи-B -> Создать политику для ведра S3, которое предоставляет доступ к учетной записи A:

  1. Выберите команду S3 S3 CodePipipieline I.E. Artifact (не ведро источника S3) и отредактируйте его ведровую политику в соответствии со следующей политикой, заменяя соответствующую арну на комментарии.
  2. Политика ниже S3 Bucket позволит аккаунт-A доступа к артефактам нашего трубопровода.
{
    "Version": "2012-10-17",
    "Id": "SSEAndSSLPolicy",
    "Statement": [
    {
        "Sid": "DenyUnEncryptedObjectUploads",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::/*",   //MAKE CHANGE HERE
        "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "aws:kms"
                }
            }
    },
    {
        "Sid": "DenyInsecureConnections",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::/*",   //MAKE CHANGE HERE
        "Condition": {
            "Bool": {
                    "aws:SecureTransport": false
                }
            }
    },
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam:::root"   //MAKE CHANGE HERE
            },
        "Action": [
                "s3:Get*",
                "s3:Put*"
            ],
        "Resource": "arn:aws:s3:::/*"   //MAKE CHANGE HERE
    },
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam:::root"   //MAKE CHANGE HERE
                },
        "Action": "s3:ListBucket",
        "Resource": "arn:aws:s3:::"   //MAKE CHANGE HERE
        }
    ]
} 

Шаг 5: В учетной записи-B -> Создать встроенную политику для сервисной роли кодовой обработки:

  1. Как мы хотим, чтобы роль службы кодепанчики предположить, что роль для перекрестных аккаунтов IAM, которую мы создали на шаге 3, мы должны добавить дополнительную политику IAM к роли сервисной службы CodeePipine.
  2. Введите следующий политик IAM, заменив учетную запись-идентификатор на комментарий для этой встроенной политики.
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": [
            "arn:aws:iam:::role/*"   //MAKE CHANGE HERE
        ]
    }
}

Шаг 6: В учетной записи-A -> Применить политику хранилища ECR:

  1. Чтобы разрешить кодовую обработку в учетной записи-B, чтобы вытащить изображения ECR, проживающие в учетной записи A, репозиторий ECR должен разрешить учетную запись-B вытащить эти изображения из своего репозитория. Для этого мы будем применять политику на основе ресурсов нашего репозитория ECR.
  2. Вы можете использовать политику репозитория внизу ECR, заменив соответствующую арну на комментарий.
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "Cross-account-policy",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam:::root",   //MAKE CHANGE HERE
          "arn:aws:iam:::role/CrossAccount-A_Role"   //ARN OF CROSS-ACCOUNT IAM ROLE CREATED IN ACCOUNT-A AT STEP 3   
        ]
      },
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:CompleteLayerUpload",
        "ecr:DescribeImages",
        "ecr:DescribeRepositories",
        "ecr:GetDownloadUrlForLayer",
        "ecr:GetLifecyclePolicy",
        "ecr:GetLifecyclePolicyPreview",
        "ecr:GetRepositoryPolicy",
        "ecr:ListImages",
        "ecr:UploadLayerPart"
      ]
    }
  ]
}

Шаг 7: В учетной записи-B -> Измените файл конфигурации вашего трубопровода:

  1. Теперь, когда у нас есть большая часть необходимых компонентов нашего трубопровода по перекрестному счету, мы будем изменять файл конфигурации нашего трубопровода, который мы создали на шаге 1, изменив источник на нашу репозиторий ECR в учетной записи A и мы также добавим KMS Похожие подробности.
  2. Чтобы сделать это, запустите команду Get-Pipeline AWS CodePipieline Get-PainseRE --NAME - MEGION > PIPREISE.JSON от AWS CLI.
  3. Откройте этот файл Pipeline.json в вашем любимом текстовом редакторе (VIM?) И добавьте «Encricptionkey» в разделе «Артефактин».

  4. Затем измените действие ECR Action of Source Stage, где вы измените значения имени хранилища ECR и его тег изображения, который находится в учетной записи.

  5. В том же действии ECR включите «Rolearn»: «Арн: AWS: IAM:: : Роль/brossaccount-a_role" Что мы создали на шаге 3, чтобы этот перекрестный счет IAM роль от аккаунта-A будет использоваться для действий ECR. Ниже приведен фрагмент для нашего исходного действия по перекрестному исходному счету в файле JSON трубопровода.

    ПРИМЕЧАНИЕ: Замените соответствующие значения в прокомменных местах ниже

    ПРИМЕЧАНИЕ: Выше представляет собой просто фрагмент нашего ECR действий исходного стадии, а не всю конфигурацию JSON трубопровода.

  6. Обязательно выполните 4-й шаг этого Документация Чтобы удалить нежелательные секции метаданных из файла конфигурации.

  7. После того, как вы сделаете вышеупомянутые изменения, обновите трубопровод из CLI CLI UPDATE CLI AWS CodePipieline Update-Pipeline --регион --CLI-INPUT-JSON File://pipeline.json

  8. После того, как вы обновите свой трубопровод, не забудьте обновить файл imagedefintions.json с правильной картинкой с учетной записи, если вы этого не сделали. Это должно выглядеть ниже,

  9. После обновления файла imagedefinitions.json застегивает его и загрузите его снова в исходный код S3.

Как вы можете знать что CloudWatch Event (CWE) Правила — это ресурсы на заднем плане, который вызывает ваш трубопровод всякий раз, когда есть какие-либо изменения в вашем источнике, присутствующем в AWS. С тех пор, как один из наших исходных действий, то есть ECR существует в другой учетной записи AWS, CodePipipeline не может автоматически создавать это правило CWE для ECR, так как он сделал для действий S3. Следовательно, теперь мы создадим правило CWE для хранилища ECR с помощью CloudWatch Event Bus Отказ

Шаг 8: В учетной записи-B -> Редактировать шину событий по умолчанию, чтобы разрешить учетную запись A:

  1. Перейдите в CloudWatch Console и выберите автобус события по умолчанию.
  2. Нажмите на Добавить разрешение Чтобы добавить свой аккаунт — идентификатор и проверьте Все (*) вариант.

Шаг 9: В учетной записи-A -> Создать правило CWE для вашего репозитория ECR:

  1. Следуйте этим Официальная документация до Шаг 5 Чтобы создать правило CWE для вашего репозитория ECR в качестве источника для вашего правила CWE.
  2. Как цель для этого правила CWE, выберите Автобус событий в другой учетной записи AWS Отказ Введите идентификатор вашей учетной записи-B и выберите Создать новую роль для этого конкретного ресурса Вариант для IAM ROTE, которая автоматически создает роль IAM для этого правила CWE.

Шаг 10: в учетной записи-B -> Создание правила CWE с кодом в качестве цели:

  1. Создайте новое правило CWE с источником событий точно так же, как вы сделали в учетной записи. Отредактируйте этот шаблон события, добавив аккаунт раздел со значением в качестве аккаунта-A ID. Это будет слушать любые изменения, происходящие в вашу репозиторий ECR, присутствующие в учетной записи — A с помощью шины событий. Обратитесь к этому Официальная документация знать, как это сделать именно. Как только вы создадите шаблон события, он должен выглядеть ниже,

  2. Поместите свой кодепанчик ARN ( ARN: AWS: CodePipipine: : : ) в качестве цели для этого правила CWE.

Ура!! Теперь мы успешно настроили кодовую обработку в учетную запись-B с помощью ECR в учетной записи в учетной записи A, S3 Bucket, содержащее только Zipped Imagedefinitions.json файл для развертывания ECS и службы ECS в учетной записи-б. Всякий раз, когда вы вносите какие-либо изменения в любой из ваших источников, ваш трубопровод будет запущен в CI/CD.

Спасибо за чтение этого блога! Я надеюсь, что вы найдете это полезно. Не стесняйтесь любить, поделиться и комментировать эту статью с вашей конструктивной обратной связью. Если вы найдете этот блог полезным или если вы застряли на любой из вышеупомянутых шагов, дайте мне знать через раздел комментариев, и я буду более чем рад помочь!

Есть потрясающий день! 😎

Оригинал: «https://dev.to/pranitraje/how-to-create-a-codepipeline-with-source-from-another-aws-account-n0m»