{"id":5415,"date":"2023-07-07T20:49:51","date_gmt":"2023-07-07T20:49:51","guid":{"rendered":"https:\/\/staging.elixirrdigital.com\/us\/?p=5415"},"modified":"2025-03-17T12:14:54","modified_gmt":"2025-03-17T12:14:54","slug":"using-github-actions-to-deploy-to-aws","status":"publish","type":"post","link":"https:\/\/staging.elixirrdigital.com\/us\/2023\/07\/07\/using-github-actions-to-deploy-to-aws\/","title":{"rendered":"Using GitHub Actions to Deploy to AWS"},"content":{"rendered":"<p><span class=\"lead\">GitHub Actions allows developers to automate workflows and tasks associated with building, testing, and deploying their applications. <\/span><\/p>\n<div class=\"sc-jnCuNW duFsLn\">\n<h2>1. Introduction to GitHub Actions<\/h2>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\" target=\"_blank\" rel=\"noopener\">GitHub Actions<\/a>\u00a0allows developers to automate workflows and tasks associated with building, testing, and deploying their applications.\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/about-workflows\" target=\"_blank\" rel=\"noopener\">Workflows<\/a>\u00a0can be customized to fit the specific needs of the project and can be triggered by events such as\u00a0<a href=\"https:\/\/docs.github.com\/en\/pull-requests\/collaborating-with-pull-requests\/proposing-changes-to-your-work-with-pull-requests\/about-pull-requests\" target=\"_blank\" rel=\"noopener\">pull requests<\/a>,\u00a0<a href=\"https:\/\/docs.github.com\/en\/pull-requests\/committing-changes-to-your-project\/creating-and-editing-commits\/about-commits\" target=\"_blank\" rel=\"noopener\">commits<\/a>, or\u00a0<a href=\"https:\/\/docs.github.com\/en\/repositories\/releasing-projects-on-github\/about-releases\" target=\"_blank\" rel=\"noopener\">releases<\/a>. GitHub Actions is designed to be code-centric, which means that workflows are defined within the repository itself.<\/p>\n<p>&nbsp;<\/p>\n<p>With GitHub Actions, you can integrate your code with, e.g.,\u00a0<a href=\"https:\/\/aws.amazon.com\/\" target=\"_blank\" rel=\"noopener\">Amazon Web Services<\/a>(AWS) to streamline your development process. Integrating GitHub Enterprise with AWS using GitHub Actions can help you automate your infrastructure deployment and improve your overall development workflow.<\/p>\n<p>The following example is conducted inside the repository that is described in the\u00a0<a href=\"https:\/\/iolap.com\/blog\/git-hub-enterprise-overview-and-best-practices\/\" target=\"_blank\" rel=\"noopener\">blog<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>Workflows must be stored in the .github\/workflows directory of the repository. Workflow files are stored with the .yml extension.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5425\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1-1024x516.png\" alt=\"\" width=\"1024\" height=\"516\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-1024x516.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-300x151.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-768x387.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-1536x774.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-200x101.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-198x100.png 198w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1-79x40.png 79w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.png 1597w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>1.1 GitHub Events, Context, Basic Syntax<\/strong><\/p>\n<p>Workflow is a pipeline that will get triggered on a certain event. The event is defined in the beginning of the workflow code.<\/p>\n<p>For example, we have a \u2018create_branch.yml\u2019 workflow which gets triggered on a \u2018create\u2019 event, in other words, it gets created if a new branch or tag is created.<\/p>\n<p>Another example would be \u2018pr_opened.yml\u2019 which gets triggered when there is a new pull request opened or synchronized (this event occurs when we push an update to the branch which is associated with the already opened pull request) towards \u2018development\u2019, \u2018stage\u2019 or \u2018production\u2019 branches.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts\" target=\"_blank\" rel=\"noopener\">GitHub Context<\/a>\u00a0is used to access metadata which GitHub stores during the workflow execution. That means that we can access certain data such as base branch, commit id, event etc.<\/p>\n<p>For example, if you see<\/p>\n<div>\n<pre>${{ github.base_ref }}<\/pre>\n<h4>in the code, that expression is accessing context to get the information about which branch is the base branch of this event. In other words, if the event is \u2018pull_request\u2019 \u2013 then the base branch is the branch that is getting merged into the environment branch. In our case that would be the feature branch.<\/h4>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5426\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.1-1024x238.png\" alt=\"\" width=\"1024\" height=\"238\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-1024x238.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-300x70.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-768x179.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-1536x357.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-200x47.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-220x51.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1-172x40.png 172w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.1.png 1719w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>GitHub workflows use specific syntax to access information such as variables, secrets, contexts etc. If we want to access a\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/encrypted-secrets\" target=\"_blank\" rel=\"noopener\">secret<\/a>, we will type:<\/p>\n<div>\n<pre>${{ secrets.SECRET_NAME }}<\/pre>\n<\/div>\n<h4>or for\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/variables\" target=\"_blank\" rel=\"noopener\">variables<\/a>:<\/h4>\n<pre>${{ vars.VARIABLE_NAME }}<\/pre>\n<p>To expand understanding of the workflow syntax, please refer to the documentation\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<p><strong>1.2 Example Description<\/strong><\/p>\n<p>In our example, we have two workflows \u2013 \u201cCreate Branch Workflow\u201d and \u201cPR Opened Workflow\u201d.<\/p>\n<p>\u201cCreate Branch Workflow\u201d is based on the repository level restriction, while \u201cPR Opened Workflow\u201d is our deployment link to AWS.<\/p>\n<p>Our repository setup has three environment branches \u2013 \u2018development\u2019, \u2018stage\u2019, \u2018production\u2019. We have one AWS account, that is why you will see that we are deleting\u00a0<a href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/stacks.html\" target=\"_blank\" rel=\"noopener\">CloudFormation stacks<\/a>\u00a0created from \u2018development\u2019 and \u2018stage\u2019 environments; those deployments serve as test deployments, while deployments from \u2018production\u2019 environment serve as an official deployment.<\/p>\n<p>Ideally, we would have separate AWS accounts for each of the environments, but this example will serve its purpose to show how to use GitHub Actions for flexible repository-level restriction and integration with AWS by using AWS CLI and GitHub Marketplace.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/get-started\/exploring-integrations\/about-github-marketplace\" target=\"_blank\" rel=\"noopener\">GitHub Marketplace<\/a>\u00a0is a platform where you can find apps (actions) which can be integrated in the workflow. Action provides an out-of-the-box solution which can streamline and improve workflow.<\/p>\n<p>Besides workflows, branches contain\u00a0<a href=\"https:\/\/docs.aws.amazon.com\/AWSCloudFormation\/latest\/UserGuide\/template-guide.html\" target=\"_blank\" rel=\"noopener\">CloudFormation template<\/a>\u00a0called \u2018s3_bucket.yml\u2019 that looks like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5427\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.2.png\" alt=\"\" width=\"743\" height=\"879\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.2.png 743w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.2-254x300.png 254w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.2-200x237.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.2-85x100.png 85w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.2-34x40.png 34w\" sizes=\"auto, (max-width: 743px) 100vw, 743px\" \/><\/p>\n<p>This template, when deployed, creates an\u00a0<a href=\"https:\/\/aws.amazon.com\/s3\/\" target=\"_blank\" rel=\"noopener\">S3<\/a>\u00a0bucket. The purpose of this template is to showcase AWS integration with GitHub Enterprise, so it is not necessary to describe it for this blog.<\/p>\n<p><strong>1.3 create_branch.yml<\/strong><\/p>\n<p>This is a GitHub workflow that is triggered whenever a new branch is created in the repository. The workflow is designed to validate the branch name and ensure that it adheres to a specific naming convention.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5434\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.png\" alt=\"\" width=\"792\" height=\"858\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.png 792w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3-277x300.png 277w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3-768x832.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3-200x217.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3-92x100.png 92w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3-37x40.png 37w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/p>\n<p>The workflow consists of a single job called \u201ccreate-branch\u201d that runs on the latest version of the Ubuntu operating system. The job includes two steps:<\/p>\n<ol>\n<li>Checkout Repository: This step uses the \u201cactions\/checkout\u201d action to check out the repository and ensure that the latest changes are available for subsequent steps. The step uses the \u201cGITHUB_TOKEN\u201d secret to authenticate with the GitHub API (Application Programming Interface). This is a default secret token which does not need to be created manually.<\/li>\n<li>Validate branch name: This step validates the name of the newly created branch to ensure that it starts with the prefix \u201cfeature\/\u201d. If the branch name does not start with this prefix, the step deletes the branch and generates an error message. If the branch name is valid, the step generates a success message.<\/li>\n<\/ol>\n<p>The \u201cif\u201d statement at the beginning of the job ensures that the job is only executed if the event that triggered the workflow is a branch creation event. If the event is not a branch creation event, the job is skipped.<\/p>\n<p>This basic workflow helps to ensure that all new branches in the repository adhere to a specific naming convention, which can help to improve consistency and organization in the development process. This is an example of how we can use GitHub workflow to enforce developers to adhere to the non-native rules.<\/p>\n<p><u>1.3.1 Workflow Results<\/u><\/p>\n<p>This workflow should be successful if user creates a new branch called \u201cfeature\/description\u201d where \u2018description\u2019 part can be anything \u2013 the only important thing is the \u201cfeature\/\u201d portion.<\/p>\n<p>That implies that the workflow should fail if user creates a new branch which does not start with \u201cfeature\/\u201d.<\/p>\n<p>Let\u2019s test the use case in which workflow should be\u00a0<strong>successful<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5428\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1a.png\" alt=\"\" width=\"615\" height=\"488\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1a.png 615w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1a-300x238.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1a-200x159.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1a-126x100.png 126w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1a-50x40.png 50w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/><\/p>\n<p>Firstly, we should create a feature branch named \u201cfeature\/my-branch\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5429\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1b-1024x110.png\" alt=\"\" width=\"1024\" height=\"110\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-1024x110.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-300x32.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-768x83.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-1536x165.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-200x22.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-220x24.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b-371x40.png 371w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1b.png 1801w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Then the workflow should get triggered.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5430\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1c-1024x296.png\" alt=\"\" width=\"1024\" height=\"296\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-1024x296.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-300x87.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-768x222.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-1536x443.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-200x58.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-220x64.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c-139x40.png 139w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1c.png 1798w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>The workflow ran successfully without any errors.<\/p>\n<p>Now, let\u2019s test the use case in which workflow should fail.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5431\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1d.png\" alt=\"\" width=\"610\" height=\"550\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1d.png 610w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1d-300x270.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1d-200x180.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1d-111x100.png 111w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1d-44x40.png 44w\" sizes=\"auto, (max-width: 610px) 100vw, 610px\" \/><\/p>\n<p>Creating branch called \u2018my-branch\u2019 \u2013 notice that we did not put \u201cfeature\/\u201d prefix.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5432\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1e-1024x106.png\" alt=\"\" width=\"1024\" height=\"106\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-1024x106.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-300x31.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-768x79.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-1536x159.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-200x21.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-220x23.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e-387x40.png 387w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1e.png 1799w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>The workflow is triggered.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5433\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.3.1f-1024x238.png\" alt=\"\" width=\"1024\" height=\"238\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-1024x238.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-300x70.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-768x178.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-1536x357.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-200x46.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-220x51.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f-172x40.png 172w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.3.1f.png 1799w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>The workflow returned an error and deleted the branch.<\/p>\n<p><strong>1.4 pr_opened.yml<\/strong><\/p>\n<p>This is a GitHub workflow that is triggered whenever a new pull request is opened. In this case, the workflow will run when a pull request is opened or synchronized on one of the specified branches: development, stage, or production. The workflow is designated to validate the CloudFormation template, deploy to the AWS account and delete the\u00a0<a href=\"https:\/\/aws.amazon.com\/cloudformation\/\" target=\"_blank\" rel=\"noopener\">CloudFormation<\/a>\u00a0stack if the target branch is not \u2018production\u2019.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5440\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.png\" alt=\"\" width=\"537\" height=\"958\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.png 537w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4-168x300.png 168w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4-200x357.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4-56x100.png 56w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4-22x40.png 22w\" sizes=\"auto, (max-width: 537px) 100vw, 537px\" \/><\/p>\n<p>We will go through the code &#8211; section by section.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5416\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4b.png\" alt=\"\" width=\"279\" height=\"71\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4b.png 279w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4b-276x71.png 276w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4b-200x51.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4b-220x56.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4b-157x40.png 157w\" sizes=\"auto, (max-width: 279px) 100vw, 279px\" \/><\/p>\n<p>This section defines the event that will trigger the workflow. In this case, the workflow will run when a pull request is opened or synchronized on one of the specified branches: development, stage, or production.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5417\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4c.png\" alt=\"\" width=\"148\" height=\"50\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4c.png 148w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4c-118x40.png 118w\" sizes=\"auto, (max-width: 148px) 100vw, 148px\" \/><\/p>\n<p>This section defines the required permissions for the workflow to run. The id-token permission is set to write, which allows the workflow to create or delete branch heads, and the contents permission is set to write, which allows the workflow to create or update files in the repository.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5418\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4d.png\" alt=\"\" width=\"251\" height=\"68\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4d.png 251w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4d-200x54.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4d-220x60.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4d-148x40.png 148w\" sizes=\"auto, (max-width: 251px) 100vw, 251px\" \/><\/p>\n<p>This section defines the job that will run when the workflow is triggered. The build job runs on a\u00a0<a href=\"https:\/\/ubuntu.com\/\" target=\"_blank\" rel=\"noopener\">ubuntu-latest<\/a>\u00a0machine and in a specific\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/deployment\/targeting-different-environments\/using-environments-for-deployment\" target=\"_blank\" rel=\"noopener\">GitHub environment<\/a>\u00a0based on the \u201cgithub.base_ref\u201d. The \u201cgithub.base_ref\u201d variable is set to the base branch of the pull request.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5419\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4e.png\" alt=\"\" width=\"261\" height=\"115\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4e.png 261w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4e-200x88.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4e-220x97.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4e-91x40.png 91w\" sizes=\"auto, (max-width: 261px) 100vw, 261px\" \/><\/p>\n<p>This step checks out the head branch of the pull request using the \u201cactions\/checkout\u201d action. It uses the GITHUB_TOKEN secret to authenticate with GitHub and fetches the entire commit history (fetch-depth: 0).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5420\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4f.png\" alt=\"\" width=\"338\" height=\"101\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4f.png 338w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4f-300x90.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4f-200x60.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4f-220x66.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4f-134x40.png 134w\" sizes=\"auto, (max-width: 338px) 100vw, 338px\" \/><\/p>\n<p>This step configures the AWS credentials using the \u201caws-actions\/configure-aws-credentials\u201d action. It specifies the AWS region, the role to assume, and the duration of the assumed role.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5421\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4g.png\" alt=\"\" width=\"471\" height=\"40\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4g.png 471w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4g-300x25.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4g-200x17.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4g-460x40.png 460w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4g-220x19.png 220w\" sizes=\"auto, (max-width: 471px) 100vw, 471px\" \/><\/p>\n<p>This step validates a CloudFormation template using AWS CLI. It uses the \u201caws cloudformation validate-template\u201d command to validate the template named \u201cs3_bucket.yml\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5422\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4h.png\" alt=\"\" width=\"345\" height=\"132\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4h.png 345w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4h-300x115.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4h-200x77.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4h-220x84.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4h-105x40.png 105w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><\/p>\n<p>This step deploys the CloudFormation template using the \u201caws-actions\/aws-cloudformation-github-deploy\u201d action. It specifies the name of the CloudFormation stack, the template file, and the parameter overrides. The if statement ensures that this step only runs if the previous step was successful.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5423\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4i.png\" alt=\"\" width=\"209\" height=\"37\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4i.png 209w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4i-200x35.png 200w\" sizes=\"auto, (max-width: 209px) 100vw, 209px\" \/><\/p>\n<p>This step waits for 30 seconds before proceeding to the next step, this gives us just enough time to check CloudFormation logs and validate that everything is created as expected.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5424\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4j.png\" alt=\"\" width=\"506\" height=\"99\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4j.png 506w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4j-300x59.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4j-200x39.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4j-220x43.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4j-204x40.png 204w\" sizes=\"auto, (max-width: 506px) 100vw, 506px\" \/><\/p>\n<p>This step will delete the CloudFormation stack if the infrastructure was not deployed from \u2018production\u2019. That is because if we deploy from either \u2018development\u2019 or \u2018stage\u2019 that is just for testing, while if we deploy from \u2018production\u2019, that should be permanent change.<\/p>\n<p><u>1.4.1 Workflow Results<\/u><\/p>\n<p>This workflow will get triggered when a new pull request is created towards the environment branch. Let\u2019s test that.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5435\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.1a-1024x486.png\" alt=\"\" width=\"1024\" height=\"486\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-1024x486.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-300x142.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-768x364.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-1536x728.png 1536w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-200x95.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-211x100.png 211w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a-84x40.png 84w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1a.png 1613w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Creating a new pull request from \u201cfeature\/new-feature\u201d to \u201cdevelopment\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5436\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.1b.png\" alt=\"\" width=\"805\" height=\"856\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b.png 805w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b-282x300.png 282w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b-768x817.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b-200x213.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b-94x100.png 94w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1b-38x40.png 38w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>This is how the pull request looks initially. Notice that merging is blocked because the check (workflow job) is required to pass successfully, and we also need a review from code owner (Marin in this case).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-5437\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.1k-1024x450.png\" alt=\"\" width=\"1024\" height=\"450\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-1024x450.png 1024w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-300x132.png 300w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-768x337.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-200x88.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-220x97.png 220w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k-91x40.png 91w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1k.png 1430w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>While the workflow is running, we can look at CloudFormation to check if our stack is created and deleted as defined in the code. We can see that everything is running as expected and that the stack is deleted.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5438\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.1l.png\" alt=\"\" width=\"868\" height=\"888\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l.png 868w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l-293x300.png 293w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l-768x786.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l-200x205.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l-98x100.png 98w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1l-39x40.png 39w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/><\/p>\n<p>We can see that the workflow is executed successfully, therefore Marin will approve the pull request.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5439\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/2025\/03\/1.4.1m.png\" alt=\"\" width=\"866\" height=\"889\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m.png 866w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m-292x300.png 292w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m-768x788.png 768w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m-200x205.png 200w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m-97x100.png 97w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2025\/03\/1.4.1m-39x40.png 39w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/p>\n<p>After Marin approved the pull request, we can merge \u201cfeature\/new-branch\u201d to \u201cdevelopment\u201d branch.<\/p>\n<h2>2. Conclusion<\/h2>\n<p>In conclusion, we have covered basic example of using GH Actions in GH Enterprise to manage simple infrastructure on AWS. That includes using GH Actions to deploy CloudFormation template to AWS.<\/p>\n<p>I hope this blog has given you a good overview of GitHub Enterprise and its capabilities. Whether you are a developer or project owner, you should now feel more confident about exploring GH Enterprise world and leveraging its advanced features.<\/p>\n<p>Nevertheless, the features covered in this blog are not all functionalities of GH Enterprise, so we encourage you to explore it as it provides a variety of flexible solutions that will help your organization.<\/p>\n<p>Rest assured that our dedicated\u00a0<a href=\"https:\/\/staging.elixirrdigital.com\/us\/services\/end-to-end-it-services\/\">DevSecOps<\/a>\u00a0team is here to support you every step of the way. Whether it\u2019s designing, managing, or building infrastructures within GitHub Enterprise, we have you covered. Don\u2019t hesitate to reach out to us or share your thoughts\u00a0<a href=\"https:\/\/staging.elixirrdigital.com\/us\/contact\/\">here<\/a>. We\u2019re always ready to provide assistance and help you succeed!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitHub Actions allows developers to automate workflows and tasks associated with building, testing, and deploying their applications. 1. Introduction to GitHub Actions GitHub Actions\u00a0allows developers to automate workflows and tasks&hellip;<\/p>\n","protected":false},"author":7,"featured_media":5443,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[35],"tags":[],"related_service":[48,91],"related_industry":[],"class_list":["post-5415","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-sec-ops"],"acf":[],"card":"<article class=\"wp-component-card wp-component-card--dark wp-component-card--resource wp-component-card--post wp-component-card--full-width            wp-component-card--link js-card-link\n        \">\n            <div class=\"wp-component-card__image\">\n            <img width=\"868\" height=\"579\" src=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2023\/07\/git-868x579.jpeg\" class=\"attachment-card-1-col size-card-1-col\" alt=\"\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2023\/07\/git-868x579.jpeg 868w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2023\/07\/git-276x184.jpeg 276w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2023\/07\/git-696x464.jpeg 696w, https:\/\/staging.elixirrdigital.com\/us\/wp-content\/uploads\/sites\/2\/2023\/07\/git-450x300.jpeg 450w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/>        <\/div>\n        <div class=\"wp-component-card__content\">\n        <div class=\"wp-component-card__content-top\">\n                                                    <p class=\"wp-component-card__eyebrow\">\n                    Blog                <\/p>\n                        <a href='https:\/\/staging.elixirrdigital.com\/us\/2023\/07\/07\/using-github-actions-to-deploy-to-aws\/'>\n        <h2 class='wp-component-card__title'>\n            Using GitHub Actions to Deploy to AWS\n        <\/h2>\n    <\/a>        <\/div>\n                    <div class=\"wp-component-card__content-bottom\">\n                                    <p class=\"wp-component-card__description\">\n                        GitHub Actions allows developers to automate workflows and tasks associated with building, testing, and deploying their applications. 1. Introduction to GitHub Actions GitHub Actions\u00a0allows developers to automate workflows and tasks&hellip;                    <\/p>\n                                                                    <div class=\"wp-component-card__meta\">\n                                                    <p class=\"wp-component-card__date\">\n                                07 July 2023                            <\/p>\n                                                                            <div class=\"wp-component-card__terms\">\n                                                                                            <div class=\"wp-component-tags__tag\">\n                DevOps            <\/div>\n                                <div class=\"wp-component-tags__tag\">\n                IT Services            <\/div>\n                                                                                                            <\/div>\n                                            <\/div>\n                                            <\/div>\n            <\/div>\n<\/article>\n","_links":{"self":[{"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/posts\/5415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/comments?post=5415"}],"version-history":[{"count":0,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/posts\/5415\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/media\/5443"}],"wp:attachment":[{"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/media?parent=5415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/categories?post=5415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/tags?post=5415"},{"taxonomy":"related_service","embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/related_service?post=5415"},{"taxonomy":"related_industry","embeddable":true,"href":"https:\/\/staging.elixirrdigital.com\/us\/wp-json\/wp\/v2\/related_industry?post=5415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}