GitHub Actions 自動化部署到 Amazon EC2

GitHub Actions 自動化部署到 Amazon EC2

Table of Contents

從 GitHub Actions 自動化部署到 Amazon EC2 並整合 S3 的流程

以下說明如何設定 GitHub Actions,自動將 Ktor 專案的 app.jar 上傳至 S3,再將其部署到 EC2 並重啟應用程式。


Github的deply.yml

name: Build and Deploy to EC2
on:
  push:
    branches:
      - main  # push to main branch

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      # Step 1: check code
      - name: Checkout Code
        uses: actions/checkout@v3

      # Step 2: jav enviroment
      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'

      # Step 3: build shadowJar
      - name: Build with Gradle
        run: ./gradlew shadowJar

      # Step 4: upload app.jar to S3
      - name: Upload app.jar to S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}
        run: |
          aws s3 cp build/libs/app.jar s3://your-s3/app.jar          

      # Step 5: EC2 download app.jar then restart
      - name: Restart Ktor Service using SSM
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}
        run: |
          aws ssm send-command \
            --instance-ids "your-ec2-instance-id" \
            --document-name "AWS-RunShellScript" \
            --comment "Deploy and Restart Ktor Service" \
            --parameters 'commands=["sudo aws s3 cp s3://your-s3/app.jar /opt/your-app/app.jar", "sudo systemctl restart ktor.service"]'          

1. IAM 角色與權限設定

為確保 GitHub Actions 與 AWS 資源間的安全通信,需建立 IAM 角色並分配必要的權限。

GitHub Actions 使用者的 IAM 權限政策

以下是允許 GitHub Actions 使用者操作 SSM 與 S3 的範例政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:SendCommand",
        "ssm:GetCommandInvocation"
      ],
      "Resource": [
        "arn:aws:ec2:<region>:<account_id>:instance/<instance_id>",
        "arn:aws:ssm:<region>:<account_id>:document/AWS-RunShellScript"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "ssm:SendCommand",
        "ssm:GetCommandInvocation"
      ],
      "Resource": [
        "arn:aws:s3:::<bucket_name>/*",
        "arn:aws:ssm:*:*:document/AWS-RunShellScript",
        "arn:aws:ssm:*:*:instance/<instance_id>"
      ]
    }
  ]
}
存取金鑰管理

為 GitHub Actions 使用者建立存取金鑰:

  1. 前往 IAM > 使用者 > GitHub Actions User > 安全認證
  2. 建立存取金鑰,用於程式化存取。
  3. 在 GitHub Actions 中使用以下環境變數:
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY

注意: 請妥善保存存取金鑰。如果遺失,需停用舊金鑰並重新建立。


2. S3 Bucket 設定

確保 S3 Bucket 可用於存取與儲存 app.jar 檔案。

S3 存取政策

為 EC2 實例設定權限,以存取 S3 Bucket 中的檔案。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account_id>:role/<instance_role>"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<bucket_name>/*"
    }
  ]
}
訪問控制

根據需求,設定 IP 白名單或其他安全控制,以確保資源的安全性。


3. EC2 實例角色與權限

為 EC2 實例分配角色,確保具備 SSM 和 S3 的相關權限。

EC2 實例的權限政策

將以下政策附加至 EC2 實例的角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:SendCommand",
        "ssm:GetCommandInvocation",
        "ssmmessages:CreateControlChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::<bucket_name>",
        "arn:aws:s3:::<bucket_name>/*"
      ]
    }
  ]
}

4. GitHub Actions 部署流程

以下為 GitHub Actions 的 YAML 範例,實現自動化部署:

name: 部署到 EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 程式碼
        uses: actions/checkout@v3

      - name: 設定 AWS CLI
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: <region>

      - name: 上傳至 S3
        run: |
          aws s3 cp ./build/libs/app.jar s3://<bucket_name>/app.jar          

      - name: 部署至 EC2
        run: |
          aws ssm send-command \
            --document-name "AWS-RunShellScript" \
            --targets "Key=instanceIds,Values=<instance_id>" \
            --parameters '{"commands":["aws s3 cp s3://<bucket_name>/app.jar /path/to/app.jar", "systemctl restart my-app"]}' \
            --region <region>          

5. 安全性最佳實踐

  • 使用最小權限政策,確保所有角色僅具備必要的操作權限。
  • 定期旋轉存取金鑰,減少安全風險。
  • 使用 AWS CloudTrail 監控所有活動,及時檢測異常。

此流程可實現從 GitHub Actions 到 Amazon EC2 的高效、安全自動化部署。請將 <region><account_id><bucket_name><instance_id><instance_role> 等占位符替換為實際 AWS 資源的詳細資訊。

Related Posts

透過 Android 手機 USB 分享網路,解決沒有網線的困擾

透過 Android 手機 USB 分享網路,解決沒有網線的困擾

今天同事的筆電 Wi-Fi 突然故障,讓他一時陷入困境,因為現在的電腦大多已經取消了網路線接口,導致連接網路的選項相當有限。他甚至考慮要更換電腦來解決這個問題。

這時,我想到一個方便的方法:利用 Android 手機透過 USB 分享網路,成功幫他解決了這個困擾!這個方法其實是我老公在五年前就告訴過我的,沒想到現在仍然很少人知道呢!

如何透過 Android 手機 USB 分享網路

  1. 啟用手機的行動數據:確保您的手機可以連上網路。
  2. 連接 USB 線:用 USB 線將 Android 手機連接到電腦。
  3. 進入設定選單
    • 打開手機的「設定」。
    • 前往「連線與分享」或「更多連接方式」的選項(不同品牌手機可能名稱略有不同)。
  4. 啟用 USB 網路共享
    • 點選「USB 網路共享」開關,確認其已經啟用。
  5. 電腦檢查網路連線:電腦應該會自動識別新網路並完成連線。

這個方法不需要額外硬體或網線,對於臨時應急的狀況非常實用。

Read More
Google帳戶驗證與鄧白氏編碼

Google帳戶驗證與鄧白氏編碼

了解鄧白氏編碼在Google開發者帳戶申請中的重要性, 以及如何透過正確的步驟加速審核流程。

Google帳戶驗證與鄧白氏編碼

在申請Google開發者帳戶時,鄧白氏編碼(D-U-N-S®)是一項重要的驗證要求。這個編碼由鄧白氏集團提供,旨在幫助企業確認其身份並提升可信度。以下是有關Google帳戶驗證及鄧白氏編碼的詳細資訊。

鄧白氏編碼的作用

  • 身份驗證:鄧白氏編碼用於確認申請公司的資料,確保其與政府機構的資料一致。這對於提升企業的信譽和建立合作關係至關重要。
  • 加速上架流程:擁有鄧白氏編碼的公司可以縮短應用程式上架的前置作業時間,減少因資料不正確而造成的修改時間,從而提高審核效率。

Google開發者帳戶的要求

  1. 鄧白氏編碼
    對於註冊公司或組織類型的開發者帳戶,提供鄧白氏編碼是必須的。若無法獲得該編碼,可能需要尋求其他驗證方式,但這通常不如鄧白氏編碼簡單。

    Read More
Spotify 2024 年度回顧:我的音樂與 Podcast 足跡

Spotify 2024 年度回顧:我的音樂與 Podcast 足跡

Spotify 的 2024 年回顧來了!每年的回顧總是揭示了我們不經意間的音樂偏好。

今年,我的播放清單裡最常出現的名字就是 孫盛希。她的最新專輯充滿了優美的 R&B 音色, 每首歌曲都讓人無法抗拒,自然成為了我今年的播放冠軍。

除了 R&B,我也特別喜歡有點搖滾感的日語快歌,特別適合需要節奏感的時候。

Read More