Search code examples
amazon-web-servicescontinuous-integrationbitbucketcontinuous-deploymentaws-code-deploy

Using Bitbucket Pipelines to deploy to multiple AWS regions using AWS CodeDeploy


I have an existing Bitbucket Pipelines setup with AWS CodeDeploy that works on single region. Now I'm trying to modify the existing setup to cater for multi region deployment. Here's my bitbucket-pipelines.yml:

image: php:7.1.29

pipelines:
  branches:
    develop:
      - step:
          caches:
            - composer
          script:
            - apt-get update && apt-get install -y unzip zip
            - zip -r MobileAPIDEV.zip .
            - pipe: atlassian/aws-code-deploy:0.5.3
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                APPLICATION_NAME: 'MobileAPIDEV'
                ZIP_FILE: 'MobileAPIDEV.zip'
                COMMAND: 'upload' 
                S3_BUCKET: $S3_BUCKET
            - pipe: atlassian/aws-code-deploy:0.5.3
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                APPLICATION_NAME: 'MobileAPIDEV'
                DEPLOYMENT_GROUP: 'MobileAPIDEV'
                WAIT: 'false'
                S3_BUCKET: $S3_BUCKET
                COMMAND: 'deploy' 
                IGNORE_APPLICATION_STOP_FAILURES: 'true'
                FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
    master:
      - step:
          caches:
            - composer
          script:
            - apt-get update && apt-get install -y unzip zip
            - zip -r prodMobileAPI.zip .
            - pipe: atlassian/aws-code-deploy:0.5.3
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                APPLICATION_NAME: 'prodMobileAPI'
                ZIP_FILE: 'prodMobileAPI.zip'
                COMMAND: 'upload' 
                S3_BUCKET: $S3_BUCKET
            - pipe: atlassian/aws-code-deploy:0.5.3
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION
                APPLICATION_NAME: 'prodMobileAPI'
                DEPLOYMENT_GROUP: 'prodMobileAPI'
                WAIT: 'false'
                S3_BUCKET: $S3_BUCKET
                COMMAND: 'deploy' 
                IGNORE_APPLICATION_STOP_FAILURES: 'true'
                FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
            - pipe: atlassian/aws-code-deploy:0.5.3
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY # Optional if already defined in the context.
                AWS_DEFAULT_REGION: eu-central-1 
                APPLICATION_NAME: 'prodMobileAPI'
                DEPLOYMENT_GROUP: 'prodMobileAPI'
                WAIT: 'false'
                S3_BUCKET: $S3_BUCKET
                COMMAND: 'deploy' 
                IGNORE_APPLICATION_STOP_FAILURES: 'true'
                FILE_EXISTS_BEHAVIOR: 'OVERWRITE'

I added the third pipe under master branch and set eu-central-1 as the new default region. I'm not sure if I'm doing it correctly because I couldn't find any example for multi region deployment using this approach.

When I tried to deploy, I got this error: An error occurred (RevisionDoesNotExistException) when calling the GetApplicationRevision operation: No application revision found for revision.

I confirm that my CodeDeploy setup in the other region has the correct role, and the Access Key that I used for the Bitbucket Pipeline has sufficient permission as well.


Solution

  • From error

    An error occurred (RevisionDoesNotExistException) when calling the GetApplicationRevision operation: No application revision found for revision.

    There is no artifact available in the mentioned region eu-central-1 RevisionDoesNotExistException.

    As per the documentation

    When you create or edit a pipeline, you must have an artifact bucket in the pipeline Region and then you must have one artifact bucket per Region where you plan to execute an action.

    So you have to have an upload section as well OR

    what I would do is have a separate step per region OR

    setup Cross-Region Replication for Amazon S3, this would let me copy the articats whichever region I want to and I can have only one upload in the pipeline.yml

    check this blog post Using AWS CodePipeline to Perform Multi-Region Deployments

    
    pipelines:
      branches:
        develop:
          - step:
              caches:
                - composer
              script:
                - apt-get update && apt-get install -y unzip zip
                - zip -r MobileAPIDEV.zip .
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                    AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                    APPLICATION_NAME: 'MobileAPIDEV'
                    ZIP_FILE: 'MobileAPIDEV.zip'
                    COMMAND: 'upload' 
                    S3_BUCKET: $S3_BUCKET
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                    AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                    APPLICATION_NAME: 'MobileAPIDEV'
                    DEPLOYMENT_GROUP: 'MobileAPIDEV'
                    WAIT: 'false'
                    S3_BUCKET: $S3_BUCKET
                    COMMAND: 'deploy' 
                    IGNORE_APPLICATION_STOP_FAILURES: 'true'
                    FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
        master:
          - step:
              caches:
                - composer
              script:
                - apt-get update && apt-get install -y unzip zip
                - zip -r prodMobileAPI.zip .
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                    AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION 
                    APPLICATION_NAME: 'prodMobileAPI'
                    ZIP_FILE: 'prodMobileAPI.zip'
                    COMMAND: 'upload' 
                    S3_BUCKET: $S3_BUCKET
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                    AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION
                    APPLICATION_NAME: 'prodMobileAPI'
                    DEPLOYMENT_GROUP: 'prodMobileAPI'
                    WAIT: 'false'
                    S3_BUCKET: $S3_BUCKET
                    COMMAND: 'deploy' 
                    IGNORE_APPLICATION_STOP_FAILURES: 'true'
                    FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY 
                    AWS_DEFAULT_REGION: 'eu-central-1'
                    APPLICATION_NAME: 'prodMobileAPI'
                    ZIP_FILE: 'prodMobileAPI.zip'
                    COMMAND: 'upload' 
                    S3_BUCKET: $S3_BUCKET
                - pipe: atlassian/aws-code-deploy:0.5.3
                  variables:
                    AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID 
                    AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY # Optional if already defined in the context.
                    AWS_DEFAULT_REGION: 'eu-central-1' 
                    APPLICATION_NAME: 'prodMobileAPI'
                    DEPLOYMENT_GROUP: 'prodMobileAPI'
                    WAIT: 'false'
                    S3_BUCKET: $S3_BUCKET
                    COMMAND: 'deploy' 
                    IGNORE_APPLICATION_STOP_FAILURES: 'true'
                    FILE_EXISTS_BEHAVIOR: 'OVERWRITE'