閲覧ありがとうございます。
本記事では、一回繋いでしまえば超絶便利な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'
本記事はここまでとなります。
閲覧いただき、ありがとうございました!