githubにアップロードしたMkDocs仕様書を、github pagesじゃなくて、ip制限したs3にCI/CDしてみた
やっていること
1, IAMロール作成(S3権限とレポジトリ指定)
2, github actions(deploy.ymlにIAMロールとS3を指定して、自動更新)
OIDCプロバイダーが登録済みか確認
1 2 3 4 5 6 7 |
$ aws iam create-open-id-connect-provider \ > --url https://token.actions.githubusercontent.com \ > --client-id-list sts.amazonaws.com \ > --thumbprint-list "6938fd4d98bab03faadb97b34396831e3780aea1" { "OpenIDConnectProviderArn": "arn:aws:iam::アカウントID:oidc-provider/token.actions.githubusercontent.com" } |
AWSアカウントID、作成するロール名、レポジトリを変数に格納
コマンドラインで実行するだけ
1 2 3 4 5 6 7 8 9 |
# AWSアカウントID AWS_ACCOUNT_ID="123456789012" # ロール名 ROLE_NAME="GitHubOIDCRole" # GitHubのリポジトリ情報 GITHUB_REPO="GitHubのユーザ名/mkdocs-spec" # 「ユーザー名/リポジトリ名」 BRANCH="main" # 制限するブランチ名 |
信頼ポリシーをJSONファイルで作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cat > trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "token.actions.githubusercontent.com:sub": "repo:${GITHUB_REPO}:ref:refs/heads/${BRANCH}" } } } ] } EOF |
実際にロールを生成する
1 2 3 |
aws iam create-role \ --role-name "$ROLE_NAME" \ --assume-role-policy-document file://trust-policy.json |
アップロードしたいS3へのアクセス権限ポリシーを定義(JSONファイル作成)
my-mkdocs-docsを、自分のバケット名に書き換える
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cat > s3-access-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-mkdocs-docs", "arn:aws:s3:::my-mkdocs-docs/*" ] } ] } EOF |
IAMロールにポリシーをアタッチ
1 2 3 4 |
aws iam put-role-policy \ --role-name "$ROLE_NAME" \ --policy-name "GitHubMkDocsS3Access" \ --policy-document file://s3-access-policy.json |
GitHub Actions を整備する
リポジトリに .github/workflows/deploy.yml を追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
name: Deploy MkDocs to S3 via OIDC on: push: branches: - main permissions: id-token: write # OIDCトークン発行に必要 contents: read # コード取得のため jobs: deploy: runs-on: ubuntu-latest steps: - name: リポジトリをチェックアウト uses: actions/checkout@v3 - name: PythonとMkDocsをインストール run: | # pip install mkdocs pip install -r requirements.txt - name: MkDocsをビルド run: mkdocs build - name: AWSにOIDCで認証 uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::590272411955:role/GitHubOIDCRole aws-region: ap-northeast-1 - name: S3にデプロイ run: | aws s3 sync ./site s3://my-mkdocs-docs --delete |
あとは、通常通りgit add/commit/pushすれば、自動的にS3へ反映される、はず。