閲覧ありがとうございます。
本記事では、一回繋いでしまえば超絶便利なGitHub ActionsとAWSの連携方法を共有します。
今回は、GitHub ActionsとAWSを、IAM IDプロバイダ・STSを用いて連携します。
AWS側の設定
【 用意するもの 】
- GitHub ActionsがAWS環境にアクセスするためのIAMロール
- GitHub Actionsからのアクセスに対し一時的な認証情報を渡すためのIDプロバイダ
① IAMロールの作成
1. 任意のIAMポリシーをアタッチしたIAMロールを作成
私はAWS Nuke(*1)をAWS環境に対し実行したかったため、AdministratorAccess権限を持つIAMロールを作成しました。
(*1) AWS Nuke:AWS環境内のリソースを一括削除することができるオープンソースのツール。(後日NukeとGitHub Actionsを用いた不要リソースの自動定期削除について記事を投稿予定です)
2. IAMロールの信頼ポリシーを設定
信頼ポリシー内で、ワークフローファイル(=GitHub Actionsでスクリプトを実行するファイル)からの認証用URL経由のアクセス時にassume roleするよう許可します。
IAMポリシー(コピペ用)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::[アカウントID]:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:[Organizations名 or 個人アカウント名]/[リポジトリ名]:*"
                }
            }
        }
    ]
}
注意点
- 赤くマークした箇所:個人のGitHub内リポジトリを使用する際は個人のGitHubアカウント名を、企業などのOrganizations配下のリポジトリを使用する際はOrganizations名を記入してください
- 青でマークした箇所:使用するリポジトリ名を記入してください
② IAM IDプロバイダーの作成
1. IAMコンソール画面で「IDプロバイダ」を選択
2. 「IDプロバイダを追加」ボタンをクリック
3. IDプロバイダの詳細を設定
- プロバイダのタイプ:OpenID Connect
- プロバイダのURL:https://token.actions.githubusercontent.com
- 対象者:sts.amazonaws.com
上記を設定し、「プロバイダを追加」ボタンを押下
AWS側の設定はこれで終了です!
GitHub Actions側の設定
①実行用IAMロールのARNをSecretsに設定
※variablesやベタ打ちでも大丈夫ですがセキュリティ面に不安があるためSecretsに保存するのがおすすめです。
1. GitHubにアクセスし、Settingsタブに移動
2. 「Security」内「Secrets and variables」の「Actions」を選択
3. Repository secretsの「New repository secret」ボタンを押下
4. 「Name」に任意のSecret変数名、「Secret」に作成したIAMロールのARNを記載し、「Add secret」ボタンを押下
5. Actionsタブに移動し、「New workflow」ボタンを押下
6. Simple workflowの「Configure」ボタンを押下すると、新しいワークフロー作成画面へ遷移する
7. ワークフローファイルの中身には以下を設定
ファイル名には「任意のファイル名.yaml」を設定してください。
name: github-actions-to-aws  # 任意のワークフロー名(処理名)
on: push  # on:push = ファイルがプッシュ(更新)されるごとに処理を動かす
jobs:
  run-container: # job名は任意。ワークフローを起動させるための設定
    name: run  # 任意の関数名
    runs-on: [Organaizationsで指定されているセルフホステッドランナー]  # 個人のアカウントの場合は「ubuntu-latest」などを設定
    permissions:
      id-token: write
      contents: write
    steps:
      - name: Checkout  # 関数名は任意
        uses: actions/checkout@v3
        
      - name: Configure AWS credentials  # 関数名は任意。AWS環境にアクセスする
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME_TEST }}  # 先ほど作成したSecretsを指定
          aws-region: ap-northeast-1  # Assume roleを行うリージョンを指定
      - name: CLI-install  # 関数名は任意。CLIのインストールを行う
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install  
      - name: [任意の関数名]
        run: |
          [任意の処理]
        # 例:bash ami-get.sh
          
最後の行 [任意の処理] の中に任意のスクリプトを入力することでAWS環境に対し任意のスクリプトを実行することができます。
また、2行目のon: pushを以下のように変更すると、任意の日次で定期実行や1回きりの実行ができるようになります。(cron形式で指定)
on:
  schedule:
    - cron: '0 6 * * 4'
本記事はここまでとなります。
閲覧いただき、ありがとうございました!











