🔁

【LINE Bot開発】CI/CD環境を構築してみた。

2024/09/22に公開

はじめに

先日、Udemyで講座を購入し、画像に写っている人の顔から感情を分析してくれるLINE Botを作り、
AWS環境でのLINE Bot開発について学びました。
その時の記事:【ハンズオン】 LINE Bot つくってみた!
今回は少しステップアップしCI/CD環境の構築に挑戦してみました。
GitHub Actionsを利用し構築したため、Git/GitHubの基礎もあわせて学びました。
↓Git/Githubの学習に利用したコンテンツ↓
【わかりやすい!Git操作】初心者向けのGitの基本 〜 30分で入門!
【GitHub入門】初心者向け!GitHubでチーム開発するための基本操作を解説!

構成図

やってみた

GitHubでリポジトリを作成

プライベートで"github_actions-aws_sam"という名前のリポジトリを準備しました。

IDプロバイダーの追加

OpenID Connect(OIDC)を使い、GitHub Actions ワークフローがAWS内のリソースにアクセスできるように設定していきます。

AWSにサインインし、IAMでIDプロバイダーを追加します。

プロバイダのタイプ:OpenID Connect
プロバイダの URL:https://token.actions.githubusercontent.com
対象者:sts.amazonaws.com
参考:AWS への ID プロバイダーの追加

IAMポリシーの作成

"TestGithubAction"という名前のポリシーを作成しました。
指定したjsonは以下です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:*",
                "s3:*",
                "lambda:*",
                "apigateway:*",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:DeleteRolePolicy",
                "iam:GetRolePolicy",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:TagRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "*"
        }
    ]
}

IAMロールの作成

作ったポリシーを使用してロールも作成します。

信頼されたエンティティタイプは”ウェブアイデンティティ”を選択します。

ウェブアイデンティティは以下の通り入力しました。
GitHubリポジトリにはさっき作成したリポジトリを指定します。

許可ポリシーはさっき作成したポリシーを選択します。

ロール名はポリシーと同じ"TestGithubAction"にしました。

GitHub Actionsのワークフローファイルを作成

GitHub Actionsにはワークフローファイルが必要になります。
このワークフローファイルには、GitHub Actionsで自動化する処理について書きます。
作成したワークフローファイルは、リポジトリの.github/workflows/ 配下に YML 形式で保存します。今は、ローカルで準備します。

参考:ワークフロー構文

準備したワークフローファイル

github-actions-workflow.yaml
name: Deploy-AWS-CloudFormation

on:
  push:
    branches:
      - 'main'

env:
  TEMPLATE_FILE: template.yaml

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup python
        uses: actions/setup-python@v3

      - name: Setup aws-sam
        uses: aws-actions/setup-sam@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-1
          role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
      - run: aws sts get-caller-identity

      - name: Build & Deploy Cloudformation stacks
        run: |
          sam build --use-container
          sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name GithubActionAwsSam --s3-bucket ${{ secrets.S3_BUCKET_NAME }} --capabilities CAPABILITY_IAM --parameter-overrides LineChannelAccessToken=${{ secrets.LINE_CHANNEL_ACCESS_TOKEN }} LineChannelSecret=${{ secrets.LINE_CHANNEL_SECRET }}

GitHub シークレットを設定。

IAMロール、Lineチャンネルアクセストークン、チャンネルシークレット、S3バケット名はGitHub シークレットに設定します。
S3バケットは普段samのデプロイに使用しているバケットを指定してください。

「Settings」→「secrets and variables」から設定できます。

設定したシークレットは
ワークフローファイルの${{ secrets.** }}の記述箇所で取得しています。
参考:GitHub Actions でのシークレットの使用

GitHubにpushする。

以下のファイルをGitHubの"main"ブランチにpushします。
"mylinebot.py"と"template.yaml"以下の記事作成の際に構築したファイルで変更箇所はありません。
記事:【ハンズオン】 LINE Bot つくってみた!

├── .github
│   └── workflows
│       └── github-actions-workflow.yaml
├── functions
│   └── mylinebot.py
└── template.yaml

ワークフローをモニタリング

Actionsからモニタリングします。

pushすると、Actionsに追加されます。

クリックしていくと、何か実行されているかモニタリングできます。

どこでどんなエラーが起きたか確認もできました。

無事デプロイできたら、緑チェックになりました。

おわりに

AWS SAMとGitHub Actionsを使用してCI/CD環境の構築に挑戦してみました。
次回は以下のハンズオンに挑戦してみようと思います。
機械学習を使って魚の画像判定アプリを作ってみた !

Discussion