使用 Github Actions 将代码直接部署到 AWS EC2 实例

Pri*_*dam 13 github amazon-ec2 amazon-web-services github-actions

正如标题所说,我正在尝试使用Github Actions将我的Laravel-Angular应用程序直接从Github部署到AWS EC2实例。

在我的应用程序中,需要在部署前构建3 个Angular 8+项目。哪里不需要构建laravel。

可用的解决方案建议使用AWS Elastic Beanstalk来部署代码。但是,如果要这样做,如何将弹性豆茎附加到现有实例还不够清楚。

有没有办法在不使用Elastic Beanstalk 的情况下将代码部署到AWS EC2

这是我的Github Actions build.yml :

name: Build Develop Branch

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x]

    steps:
    - name: Code Checkout
      uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: App 1 npm install
      run: npm install
      working-directory: angular-app-1
    - name: App 1 Build
      run: npm run build:staging
      working-directory: angular-app-1
    - name: App 2 npm install
      run: npm install
      working-directory: angular-app-2
    - name: App 2 Build
      run: node node_modules/@angular/cli/bin/ng build --configuration=staging
      working-directory: angular-app-2
    - name: App 3 npm install
      run: npm install
      working-directory: angular-app-3
    - name: App 3 Build
      run: node node_modules/@angular/cli/bin/ng build --configuration=staging
      working-directory: angular-app-3
Run Code Online (Sandbox Code Playgroud)

小智 6

首先,您需要在 AWS 上完成本教程来设置 EC2 服务器,并在 CodeDeploy 中配置应用程序和部署组:教程:使用 CodeDeploy 从 GitHub 部署应用程序

然后,您可以在 GitHub Actions 中使用以下工作流程来推送代码。您实质上使用 AWS CLI 来创建新部署。将 CLI 的 AWS 凭证存储在 GitHub Secrets 中。

以下是部署 Node 应用程序的示例:

name: Deploy to AWS

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    name: Deploy AWS
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12.x]
        app-name: ['your-codedeploy-application']
        deployment-group: ['your-codedeploy-deploy-group']
        repo: ['username/repository-name']
        
    steps:
      - uses: actions/checkout@v2
      
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
          
      - name: Install dependencies
        run: npm install
      
      - name: Build app
        run: npm run build

      - name: Install AWS CLI 
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install --update
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}
          aws-region: us-east-1
          
      - name: Deploy to AWS
        run: |
          aws deploy create-deployment \
          --application-name ${{ matrix.app-name }} \
          --deployment-config-name CodeDeployDefault.OneAtATime \
          --deployment-group-name ${{ matrix.deployment-group }} \
          --description "GitHub Deployment for the ${{ matrix.app-name }}-${{ github.sha }}" \
          --github-location repository=${{ matrix.repo }},commitId=${{ github.sha }}
Run Code Online (Sandbox Code Playgroud)


acw*_*acw 5

真正的最终编辑

一年后,我终于开始制作教程:https : //github.com/Andrew-Chen-Wang/cookiecutter-django-ec2-github

我找到了一个Medium 教程,如果有人想使用 Code Pipeline,它也值得一看(有一些差异;我将我的文件存储在 GitHub 上,而 Medium 教程在 S3 上。我创建了一个其他作者没有的自定义 VPC )。


较早的最终编辑

AWS 终于为带有 GitHub 存储库的 CodeDeploy 制作了一个简洁的教程:https ://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-github-prerequisites.html看看那里并享受 :)

与 ECS 教程一样,我们使用 Parameter Store 来存储我们的机密。AWS 之前希望我们获取机密的方式是通过 bash 脚本中的脚本:https : //aws.amazon.com/blogs/mt/use-parameter-store-to-securely-access-secrets-and-config-数据输入 aws 编码部署/

例如:

password=$(aws ssm get-parameters --region us-east-1 --names MySecureSQLPassword --with-decryption --query Parameters[0].Value)
password=`echo $password | sed -e 's/^"//' -e 's/"$//'`
mysqladmin -u root password $password
Run Code Online (Sandbox Code Playgroud)

新编辑(2020 年 12 月 24 日):我想我已经搞定了。下面我指出了为 AWS ECS捐赠任何东西。我已转向自部署设置。如果您查看 bin/scripts,我将利用 supervisord 和 gunicorn(用于 Python Web 开发)。但是在 EC2 的上下文中,您可以简单地将 AppSpec.yml 指向这些脚本!希望对大家有帮助!

在我开始之前:

这不是一个完整的答案。不是一个完整的演练,但有很多提示和一些代码可以帮助您设置某些 AWS 内容,例如 ALB 和您的存储库中的文件,以使其正常工作。这个答案更像是我昨晚试图让 ECS 工作的冲刺跑中混杂的几条线索。

我也没有足够的积分来评论或聊天……这是我能提供的最好的东西。

快速链接(不过,您可能应该跳过这两点):

  1. 看看这个:https : //docs.aws.amazon.com/codedeploy/latest/userguide/instances-ec2-configure.html
  2. 我没有足够的点数来评论或聊天……不过,这也不是一个完整的答案,因为我试图先从 GH 完成 ECS 部署,然后再从 GH 转移到 EC2。无论如何...
  3. 最后一个编辑:这听起来像是一种营销策略,但使用 GitHub 操作和工作流调度的正确实现位于Donate Anything 的 GitHub 存储库。您会在下面找到相同的 ECS 工作。请注意,我将我的 GitHub 操作更改为使用 Docker Hub,因为它是免费的(如果你打算使用 ECS,对我来说更便宜,因为 AWS ECR 很贵)。

编辑:ECS 部署现在有效。将很快开始进行 EC2 部署。

编辑 2:我添加了捐赠任何回购。此外,我不确定直接 EC2 部署(至少对我而言)是否可行,因为安装脚本有点奇怪。但是,我仍然没有找到时间去使用 EC2。同样,如果有人愿意分享他们的时间,请这样做并做出贡献!

我确实想警告大家,安全组非常重要。这阻碍了我很长时间,所以确保你把它们弄对了。在ECS教程中,我教你我是怎么做的。


完整非完整答案:

我现在正在这个 repo 中处理这个问题,另一个在这里使用 GitHub 操作针对 ECS 。我在 EC2 上还没有开始太远,但测试的基本概要是这样的:

至关重要的

  • 您需要先尝试从 AWS CLI 进行部署。这是因为 AWS Actions 还没有用于部署到 EC2 的专用操作。
  • 写下这些陈述中的每一个。我们稍后会在 GitHub 操作中用到它们。

测试此 AWS 设置时的一些提示:

您的测试纲要将如下所示:

  • 对我来说,对于我的 ECS 存储库,我只花了整整 10 个小时尝试像 GitHub 操作一样逐步正确配置所有内容。对你来说,你也应该这样做。想象一下你是代码:找出你需要从哪里开始。
  • 啊哈!我可能应该先弄清楚 CodeDeploy。我们先来对一个 appspec.yaml 文件!appspec 文件是 CodeDeploy 将如何处理所有内容的挂钩。不幸的是,我目前正在解决这个问题但这是因为 AppSpec 文件的 EC2 和 ECS 语法不同。幸运的是,EC2 没有任何特殊区域。只需正确设置文件和挂钩即可。我的测试中的一个例子:
version: 0.0
os: linux

files:
  - source: /
    destination: /code

hooks:
  BeforeInstall:
    - location: aws_scripts/install_dependencies
      timeout: 300
      runas: root
  ApplicationStop:
    - location: aws_scripts/start_server
      runas: root
Run Code Online (Sandbox Code Playgroud)

GitHub 操作:

您至少需要:

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        # TODO Change your AWS region here!
        aws-region: us-east-2
Run Code Online (Sandbox Code Playgroud)

检出代码对于……嗯……获取代码是必要的。

对于 AWS 凭证的配置,您需要使用适当的 IAM 凭证将AWS_ACCESS_KEY_ID和添加AWS_SECRET_ACCESS_KEY到您的 GitHub 秘密。为此,我相信唯一需要的 IAM 角色是完整的 CodeDeploy 内容。

部署代码:

这是您在到达此步骤之前应该尝试过的测试代码的时间。现在您的工作流已设置,让我们将 CLI 中的代码粘贴到您的操作中。


    - name: Deploying with CodeDeploy
      id: a-task
      env:
        an-environment-variable: anything you want
      run: |
        echo "Your CLI code should be placed here"
Run Code Online (Sandbox Code Playgroud)

对不起,如果这令人困惑,而不是您正在寻找的内容,或者想要一个完整的教程。我也没有真正让它工作,但距离我上次尝试也有一段时间了,上次我尝试时,我什至不知道 EC2 实例是什么......我只是做了一个独立的 EC2实例并使用 rsync 传输我的文件。希望我写的是几条线索,可以很容易地指导您找到解决方案。

如果你让它工作,请在此处分享:https : //github.com/Andrew-Chen-Wang/cookiecutter-django-ec2-gh-action以便其他人不必忍受 AWS 部署的痛苦。 ..


ter*_*rse 5

有没有办法在不使用 Elastic Beanstalk 的情况下将代码部署到 AWS EC2?

我找到了一种使用GitHub Actions部署到 EC2 实例(或任何接受rsync命令的服务器ssh)的简单方法。

我在存储库的.github/workflows文件夹中有一个简单的文件,每当向我的 GitHub 存储库进行推送时,GitHub Actions都会运行该文件以将其部署到我的 EC2 实例。

没有麻烦,没有大惊小怪,没有特殊的咒语或拜占庭式的 AWS 配置细节。

文件.github/workflows/pushtoec2.yml

name: Push-to-EC2

on: push

jobs:
  deploy:
    name: Push to EC2 Instance
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the code
        uses: actions/checkout@v1

      - name: Deploy to my EC2 instance
        uses: easingthemes/ssh-deploy@v2.1.5
        env:
          SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
          SOURCE: "./"
          REMOTE_HOST: "ec2-34-213-48-149.us-west-2.compute.amazonaws.com"
          REMOTE_USER: "ec2-user"
          TARGET: "/home/ec2-user/SampleExpressApp"

Run Code Online (Sandbox Code Playgroud)

上面使用的ssh 部署GitHub 操作的详细信息。

  • 这帮助我在 EC2 服务器上部署 Lumen API 项目。感谢您分享的信息。 (2认同)