【问题标题】:Is it possible to do a cross account and same account deployment in the same pipeline?是否可以在同一管道中进行跨账户和同一账户部署?
【发布时间】:2020-07-07 11:43:15
【问题描述】:

我正在 AWS 中进行跨账户部署,从我的部署账户到暂存账户,我有 2 个用于 API 和前端应用程序的单独管道。

在 API 的代码管道中,我正在创建一些我想在前端代码管道的构建阶段重复使用的资源。现在我需要通过运行单个管道来实现以下步骤

  1. 将 API 云形成堆栈从部署帐户部署到暂存帐户 - 成功完成。
  2. 在部署帐户本身中部署一个云形成堆栈 - 不成功,可以吗?如果有可能怎么办?

提前致谢

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-codepipeline


    【解决方案1】:

    我有一些用例,我需要在 AWS 代码构建中执行从我的管理账户(我运行管道的账户)到我要部署到的目标账户的操作。例如,当需要将钓鱼者应用程序部署到 S3 时,这很有帮助。这是我的解决方案,希望对您有所帮助:)

    BuildAngulerProjectAndUploadToS3:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: !Sub '${UniqueId}-build-anguler-project-upload-to-s3'
      Artifacts:
        Type: CODEPIPELINE
      Environment:
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/amazonlinux2-x86_64-standard:3.0
        Type: LINUX_CONTAINER
      ServiceRole: !Sub '{{resolve:ssm:/${SSMNamespace}/${PipelineSSMConfigId}/pipeline/pipeline_role_arn/mgmt:1}}'
      EncryptionKey: !Sub '{{resolve:ssm:/${SSMNamespace}/${PipelineSSMConfigId}/pipeline/artefact_encryption_key/arn:1}}'
      Source:
        Type: CODEPIPELINE
        BuildSpec:  !Sub |2 # Only use ${...} for substituted variables, not environment variables, to avoid issues with !Sub
          version: 0.2
          env:
            parameter-store:
              artifactory_username: "/${SSMNamespace}/${PipelineSSMConfigId}/pipeline/python-pip/username"
              artifactory_password: "/${SSMNamespace}/${PipelineSSMConfigId}/pipeline/python-pip/api"
          phases:
            pre_build:
                commands:
                  # Assume the cross account role in the Target Account
                  # CrossAccountDeploymentRoleArn is passed in as an environment variable
                  - output=$(aws sts assume-role
                    --role-arn $CrossAccountDeploymentRoleArn
                    --role-session-name "x-account-code-build"
                    --query 'Credentials.[SecretAccessKey,AccessKeyId,SessionToken]'
                    --output text)
                  - export AWS_ACCESS_KEY_ID=$(echo $output | cut -f2 -d ' ')
                  - export AWS_SECRET_ACCESS_KEY=$(echo $output | cut -f1 -d ' ')
                  - export AWS_SESSION_TOKEN=$(echo $output | cut -f3 -d ' ')
    
            install:
              runtime-versions:
                nodejs: 10
              commands:
                - echo Installing source NPM dependencies...
                - cd $CODEBUILD_SRC_DIR/client/app
                - echo Setting up artifactory...
                - printf _auth="$artifactory_password\nregistry=https://{ARTIFACTORY_ADDRESS}\nemail=$artifactory_username\nalways-auth=true" > .npmrc
                - cat .npmrc
                - npm i -g @angular/cli
            build:
              commands:
                - npm install
                - ng build --prod
                - echo uploading artifacts to S3
                - aws s3 sync dist/app s3://${UniqueId}-app-bucket-$Account_ID
    

    【讨论】:

      【解决方案2】:

      CodePipeline 由阶段(逻辑)和操作(源/构建/部署等)组成。

      每个操作都可以在本地帐户或跨帐户中运行。这种魔法是如何发生的?

      每个动作都有一个 roleArn 属性。这是 CodePipeline 在执行该操作时“承担”的角色。如果“roleArn”属性中指定的角色在本地帐户中(或属性为空),则操作在本地帐户中运行。如果“roleArn”属性中指定的角色是跨账户,则该操作将在另一个账户中运行。

      运行以下命令进行检查:

      $ aws codepipeline get-pipeline --name <name> --region us-east-1 
      

      结果将类似于(见倒数第二行):

                  "name": "Deploy",
                  "actions": [
                      {
                          "name": "Deploy",
                          "actionTypeId": {
                              "category": "Deploy",
                              "owner": "AWS",
                              "provider": "CloudFormation",
                              "version": "1"
                          },
                          "runOrder": 1,
                          "configuration": {
                              "ActionMode": "CREATE_UPDATE",
                              "Capabilities": "CAPABILITY_IAM,CAPABILITY_NAMED_IAM,CAPABILITY_AUTO_EXPAND",
                              "RoleArn": "arn:aws:iam::0123456789012:role/CrossAccount_Role",
                              "StackName": "Cx-Account",
                              "TemplatePath": "SourceArtifact::template.json"
                          },
                          "outputArtifacts": [],
                          "inputArtifacts": [
                              {
                                  "name": "SourceArtifact"
                              }
                          ],
                          "roleArn": "arn:aws:iam::0123456789012:role/CrossAccount_Role",
                          "region": "us-east-1"
                      }
      

      在部署帐户本身中部署一个云形成堆栈 - 不成功,有可能吗?如果可以怎么办?

      现在您有了在任何您想要的帐户中运行操作的密钥。照常创建操作,不要在操作本身上指定 roleArn,CodePipeline 将在部署帐户本身(管道所在的位置)中执行 cloudformation 操作。

      【讨论】:

        猜你喜欢
        • 2022-06-29
        • 2020-01-12
        • 2020-01-25
        • 1970-01-01
        • 2022-12-10
        • 2019-10-17
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多