簡體   English   中英

使用 Github Actions 將代碼直接部署到 AWS EC2 實例

[英]Deploy code directly to AWS EC2 instance using Github Actions

正如標題所說,我正在嘗試使用Github Actions將我的Laravel-Angular應用程序直接從Github 部署AWS EC2實例。

在我的應用程序中,有 3 個Angular 8+項目需要在部署前構建。 其中 laravel 不需要構建。

可用的解決方案建議使用AWS Elastic Beanstalk來部署代碼。 但是,如果要這樣做,如何將彈性 beantalk 附加到現有實例還不夠清楚。

有沒有辦法在不使用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

有沒有一種方法可以在不使用 Elastic Beanstalk 的情況下將代碼部署到 AWS EC2?

我找到了一種使用GitHub Actions部署到 EC2 實例(或通過ssh接受rsync命令的任何服務器)的簡單方法。

我在 repo 的.github/workflows文件夾中有一個簡單的文件,只要對我的 GitHub repo 進行推送,該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 部署GitHub 操作的詳細信息。

真正的最終編輯

一年后,我終於抽出時間來制作教程: 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-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捐贈任何東西 我已經轉移到自我部署設置。 如果你看一下 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 操作和 workflow_dispatch 的正確實現位於Donate Anything 的 GitHub 存儲庫中。 您會在下方找到相同的 ECS 工作。 請注意,我將 GitHub 操作更改為使用 Docker Hub,因為它是免費的(如果您要使用 ECS,對我來說更便宜,因為 AWS ECR 很昂貴)。

編輯:ECS 部署現在有效。 將很快開始進行 EC2 部署。

編輯 2:我添加了 Donate Anything 回購協議。 此外,我不確定直接 EC2 部署是否可行,至少對我而言,因為安裝腳本有點奇怪。 但是,我仍然沒有找到時間去 EC2。 同樣,如果有人願意分享他們的時間,請這樣做並做出貢獻!

我確實想警告大家,安全組非常重要。 這困擾了我很長時間,所以請確保你把它們弄對了。 在 ECS 教程中,我教你我是怎么做的。


完整非完整答案:

我現在正在使用 GitHub 操作在此 repo中處理此問題,並在此處針對 ECS 處理另一個問題。 我在 EC2 上還沒有開始太多,但是測試的基本概要是這樣的:

至關重要的

  • 您需要先嘗試從 AWS CLI 進行部署。 這是因為 AWS 操作還沒有專門用於部署到 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

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 部署的痛苦。 ..

首先,你需要在AWS上通過本教程go來設置你的EC2服務器,以及在CodeDeploy中配置Application and Deployment Group: 教程:使用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 }}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM