[英]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 工作的沖刺運行中混雜在一起的幾條線索。
我也沒有足夠的積分來發表評論或聊天……這是我能提供的最好的東西。
快速鏈接(不過你應該跳過這兩點):
編輯:ECS 部署現在有效。 將很快開始進行 EC2 部署。
編輯 2:我添加了 Donate Anything 回購協議。 此外,我不確定直接 EC2 部署是否可行,至少對我而言,因為安裝腳本有點奇怪。 但是,我仍然沒有找到時間去 EC2。 同樣,如果有人願意分享他們的時間,請這樣做並做出貢獻!
我確實想警告大家,安全組非常重要。 這困擾了我很長時間,所以請確保你把它們弄對了。 在 ECS 教程中,我教你我是怎么做的。
完整非完整答案:
我現在正在使用 GitHub 操作在此 repo中處理此問題,並在此處針對 ECS 處理另一個問題。 我在 EC2 上還沒有開始太多,但是測試的基本概要是這樣的:
至關重要的
測試此 AWS 設置時的一些提示:
您的測試綱要將如何顯示:
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_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"
很抱歉,如果這讓您感到困惑,而不是您正在尋找的內容,或者想要一個完整的教程。 我也沒有真正讓這個工作,但自從我上次嘗試以來也已經有一段時間了,而且我最后一次嘗試時,我什至不知道什么是 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.