【问题标题】:Deploy code directly to AWS EC2 instance using Github Actions使用 Github Actions 将代码直接部署到 AWS EC2 实例
【发布时间】:2020-09-17 02:24:19
【问题描述】:

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

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

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

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

这是我的 Github 操作 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

【问题讨论】:

  • 不是答案,但我认为您应该调查 AWS Code Pipeline。我正在使用完整的堆栈:CodeCommit(这是一个 git 存储库)、CodeBuild 和 CodeDeploy。但是,如果您能够以某种方式将工件上传到 S3,那么您可以将其附加到管道中。剩下的只是构建一个 .yaml 脚本以将您的工件部署在正确的 EC2 文件夹中并运行命令行指令。

标签: amazon-web-services github amazon-ec2 github-actions


【解决方案1】:

真正的最终编辑

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

我发现了一个 Medium tutorial,如果有人想使用 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-data-in-aws-codedeploy/

例如:

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

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

开始之前:

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

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

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

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

编辑:ECS 部署现在工作。即将开始部署 EC2。

编辑 2:我添加了 Donate Anything 存储库。此外,我不确定直接 EC2 部署是否可行,至少对我而言是否可行,因为安装脚本会有点奇怪。但是,我仍然没有时间去 EC2。同样,如果有人愿意分享他们的时间,请这样做并做出贡献!

我确实想警告大家,安全组非常重要。这让我困扰了很长时间,所以确保你把它们弄对了。 In the ECS tutorial,我教你怎么做。


完整的非完整答案:

我现在正在 this repo 和另一个 ECS here 使用 GitHub 操作解决此问题。我在 EC2 上还没有开始太多,但测试的基本纲要是这样的:

至关重要

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

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

您的测试计划将是什么样子:

  • 对于我来说,对于我的 ECS 存储库,我花了整整 10 个小时尝试逐步正确配置所有内容,就像 GitHub 操作一样。对你来说,你也应该这样做。想象你是代码:找出你需要从哪里开始。
  • 啊哈!我可能应该先弄清楚 CodeDeploy。让我们先纠正一个 appspec.yaml 文件! appspec 文件是 CodeDeploy 将如何处理所有内容的挂钩。不幸的是,我目前正在解决这个问题here,但那是因为 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

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

签出代码对于...嗯...获取代码是必要的。

对于 AWS 凭证的配置,您需要使用适当的 IAM 凭证将 AWS_ACCESS_KEY_IDAWS_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"

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

如果您成功了,请在此处分享:https://github.com/Andrew-Chen-Wang/cookiecutter-django-ec2-gh-action,这样其他人就不必遭受 AWS 部署的痛苦...

【讨论】:

  • 这可能有帮助,也可能没有帮助,但我在下面发布了一个超级简单的GitHub Action deploy to EC2 instance 方法。它不依赖于 AWS 端的任何配置(除了一些 ssh 登录凭证)。
  • @terrymorse 我认为 Taylor Newton 所做的 in their answer 看起来更好,因为它利用了 CodeDeploy;无需获取一些服务器主机名和 IP。
  • 我想我们正在看个人喜好。 Taylor Newton 的方法需要 AWS 凭证和 CLI,因此仅限于 AWS 使用;我的方法需要登录凭证,但不使用任何特定于 AWS 的代码,因此可用于部署到其他主机。我的偏好倾向于更通用的解决方案。
  • 嗯,我不太熟悉其他云服务,但即便如此,存储单个 IP 和主机名似乎也有风险,或者对我来说不是“最佳实践”。那是除非通用解决方案是用于在单个服务器上快速部署的自托管,那么是的,我认为没有问题。 (只是有点令人困惑,因为这是一个特定的 AWS EC2 问题)
  • EC2实例不就是一个单一的服务器,一个域名和一个IP地址吗?如果这是一个 Elastic Beanstalk 问题,我会同意这个问题。
【解决方案2】:

是的,我今天能够解决这个问题。

首先,您需要在 AWS 上完成本教程来设置您的 EC2 服务器,并在 CodeDeploy 中配置应用程序和部署组:Tutorial: Use CodeDeploy to deploy an application from 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 }}

【讨论】:

    【解决方案3】:

    有没有办法在不使用 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"
    
    

    上面使用的ssh deploy GitHub Action 的详细信息。

    【讨论】:

    • 我注意到 /home 目录之外的任何东西都会给我一个权限被拒绝错误,有什么解决方法吗?
    • @user8453321 - 我认为您永远不能在 EC2 实例的用户目录(在本例中为“/home/ec2-user”)之外写入内容。我不知道有什么解决方法。
    • 您在哪里以及如何保存 ssh 密钥?我无法在我的 github 上添加 ssh 密钥,我也无法访问它。我将如何存储 ssh 密钥?
    • @MDNasirulIslam - GitHub 有一个用于在你的 repo 中存储秘密的工具,可以在${{ secrets.EC2_SSH_KEY }} 这样的工作流脚本中访问它。请参阅 GitHub 文档页面 Encrypted secrets
    • 这帮助我在我的 EC2 服务器上部署了我的 Lumen API 项目。感谢您分享的信息。
    猜你喜欢
    • 2021-10-17
    • 2021-04-21
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2020-10-29
    相关资源
    最近更新 更多