GitHub ActionsからECRにコンテナをデプロイする #2  GitHub ActionsとAWSの接続

AWS

初めに

この記事はGitHub ActionsからECRにコンテナをデプロイするの1つ目の記事Github ActionsとAWSの接続する工程を行う記事になります。

上記の赤い枠の部分で、GitHubにPushしGitHub Actionsを利用してAWSに接続を行います。

概要

本記事では以下のようなことについて解説します。

・GitHub ActionsでAWSに接続するための設定
・AWSでGitHub Actionsからの接続を許可する設定

前提条件

以下の準備が行えていることを前提として説明を行います。

・GitHubが利用できる
・AWSが利用できる

それでは始めていきます。

Github ActionsとAWSの接続

サンプルソースの取得

今回はサンプルとしてAngularのを利用しようと思います。Angularで利用する場合は、以下のGitHubから取得をお願いします。

GitHub - toma3113/sample-cicd
Contribute to toma3113/sample-cicd development by creating an account on GitHub.

特にソースの内容などは理解する必要はありません。内容もng newして作成した、初期のソースです。

GitHub Actionsを実行する

次にGitHub Actionsで利用する設定ファイルを追加していきます。

以下のようなファルダを作成します。

プロジェクトフォルダ/.github/workflows

次にworkflowsフォルダ下に、workflow.ymlを作成します。

workflow.ymlに次のように追加します。

name: test workflow

on: push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

これで、GitHub Actionsを利用する設定は完了です。ソースコードをPushしてみましょう。

実行後、ブラウザでGitHubを開いてください。以下の「Actions」をクリックし、GitHub Actionsが実行されていることを確認します。

workflow run resultsの中に、コミット時にコメントした、workflowが動いていることを確認します。

これでGitHub Actionsが利用できることが確認できました。

AWSを設定する

次にGitHub ActionsからAWSに接続するためにAWSの設定を行っていきます。

まずどのようにGitHub ActinosとAWSを接続するかというと、OIDC(OpenID Connect)という方法を利用して接続します。OIDCについて内容を細かく知る必要はありません。簡単に言うと一時的に認証情報を取得し、それを用いてアクセスする方法になります。詳細は以下の記事を確認してください。

OIDC フェデレーション - AWS Identity and Access Management
AWS 上で実行しないアプリケーションが AWS にアクセスするための一時的な AWS セキュリティ認証情報を作成します。

それでは実際にAWSで設定を行っていきましょう。

IDプロバイダを作成する

まず、AWS IAMにアクセスしアクセス管理→IDプロバイダを開きます

次に「プロバイダを追加」をクリックします。

Add Identity provider画面で以下のように入力し、プロバイダを追加をクリックする。

項目
プロバイダのタイプOpenID Connect
プロバイダのURLhttps://token.actions.githubusercontent.com
対象者sts.amazonaws.com
ロールを追加する

次にロールを作成します。

アクセス管理→ロール→ロールを作成をクリックします。

信頼されたエンティティを選択の画面で次のように、入力する。

項目
信頼されたエンティティタイプカスタム信頼ポリシー
カスタム信頼ポリシー以下のJSON

カスタム信頼ポリシー

以下のようなJSONとなります。Federatedの<AWSアカウントID>と、token.actions.githubusercontent.com:subの<GitHubユーザー名>/<GitHubリポジトリ名>は自身のものに変更お願いします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:*"
                }
            }
        }
    ]
}

入力が完了したら次へをクリック

許可を追加画面では、今回は特に許可を追加せず次へを押してください。

次に、「名前、確認、および作成」画面でロールに名前を付けます。今回私は「sample-ECR-deploy-role」と名前を付けましたが、任意の名前でOKです!

入力が完了次第ロールを作成ボタンをクリックし完了する。

これでAWS側の設定を完了です!

GitHub ActionsとAWSを接続する

再度GitHub Actionsに戻りAWSとの接続を確認します。

プロジェクトフォルダ/.github/workflows/workflow.ymlを以下のように書き換えます。

name: test workflow

on: push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: '<リージョン>' 
          role-to-assume: 'arn:aws:iam::<AWSアカウントID>:role/<ロール名>' 

そのまま実行し、以下のようにbuildが成功すればAWSとの接続は完了です!

最後に

以上今回はGitHub ActionsとAWSとの接続を行いました。次回は#3として、Github ActionsからECSへのPushを行っていきます!

以下から次の記事を読んでみてください!

プロフィール

SIer勤めのエンジニア
アプリケーションエンジニアとして、WebやiOSなどのアプリ開発をメインにしてます

tomaをフォローする
AWSCI/CDGitHub Actions