OIDC Provier認証とAssumeRole権限移譲によるGitHubActionのCI

# 概要
:::note info
* GitHub ActionsでAWS ACEESKEYをGitHub側(GitHubSecrets)に保存したくない
* [OpenID Connect](https://openid.net/connect/)経由の各種Cloud Providerの認証がとれる
* 認証をパスする事が目的なのでポリシーなど細かい要素は後回しにしてシンプルにトライ
* とりあえず習うより慣れろで
:::

***

# 前提
:::note info
* OpenID Connect Provider認証の仕組みについて理解している
* [IAMのAssumeRole](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)の仕組みについて理解している
* GitHubSecretsの利便性とリスクについて理解している
:::

***

# 詳細

## OpenIDプロバイダを作成

* プロバイダのタイプ: OpenID Connect
* プロバイダの URL: https://token.actions.githubusercontent.com
* 対象者: sts.amazonaws.com

* AWSのIAMからIDプロバイダを作成する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/4c1535a7-0d20-d6e3-279b-daf64ac7f29d.png" width=90%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/be96778e-3080-817f-6a15-033810421864.png" width=90%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e0997541-d85e-0d7d-592c-ede92bd102d2.png" width=90%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/cb11173f-1074-5db7-8824-04591e3126c0.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/071655bf-31e1-efe6-7f0e-0d37cc3fc21b.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/42137a0b-2f7c-2ca5-ae32-784dbd61101a.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/2b71d079-1d74-09d7-3ebf-e8d84fbc73dd.png" width=70%>

## ロールの割当

* "ロールの割当"→"新しいロールを作成"

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/34a1214e-138b-9824-ce88-620bc917a227.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e633fefb-1ffc-c742-89c7-6fe370e77570.png" width=70%>

****

## テスト用ロールの作成

* ウェブアイデンティティで作成
    * Audienceは"sts.amazonaws.com "

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/0ecf995d-83af-a0fa-afbd-0d974b6ad1cd.png" width=100%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/c45c0dcd-6506-3e99-164a-73d7aa41d65a.png" width=100%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/ae8e2190-15d0-1408-ec08-8bcda79b86ae.png" width=100%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/1386b199-6e15-4c8c-ea61-11855337bd13.png" width=100%>

## GitHub側準備

* テスト用リポジトリを用意する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/d32968e1-4d77-17ea-9373-5362dbfa1889.png" width=100%>

* workflowのフォルダとファイルを作成

```
$ git clone https://github.com/menergia/test-oidc
$ mkdir -p test-oidc/.github/workflows
$ echo "### oidc test workflow ###" > test-oidc/.github/workflows/test-oidc-ci.yml
$ cd test-oidc
$ git add .
$ git commit -m "add blank workflow"
$ git push origin main
```
-----------------------------------------------------------

## GitHubActions用workflowファイルを作成

* アカウントIDをメモ・控えておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/64a90aa4-95b6-1d56-ab03-5964ce001581.png)

* test-oidc-ci.ymlを編集
    * [GitHub公式ドキュメント](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)のworkflowサンプルを参考
    * permissions: id-token: write

```test-oidc-ci.yml

### oidc test workflow ###

name: OIDC test
on:
  push:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:

      - name: Set up environment
        run: |
          export AWS_ROLE_ARN=arn:aws:iam::39********81:role/Role-GithubActions-OpenIDConnect-Test
          export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/aws-credential
          export AWS_DEFAULT_REGION=ap-northeast-1

          echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
          echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
          echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV

          curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sts.amazonaws.com" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE

      - run: aws sts get-caller-identity
```

* commit/push後actionsタブを確認
    * CI上でOpenIDConnectが成功している

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/a2e39e9d-0ff4-9e25-8b01-c8260a581ce6.png" width=100%>



## 残課題

* このあとは必要なポリシー・ロールを正しく設定してトライして見る


### 関連

* 続き
    * [OpenIDConnect＆AssumeRole＆GithubActionでS3に自動デプロイ](https://qiita.com/ezaqiita/private/659c59c56e05f91393a0)



-----------------------------------------------------------