GitHub Actionsを利用してAWS EC2セキュリティグループを自動更新

GitHub Actionsを使用してAWS EC2セキュリティグループの更新プロセスを自動化することで、より安全かつ効率的なデプロイメントを実現する。

### 前提条件
セットアップに入る前に、以下のものを準備しておく必要があります：

1. EC2インスタンスとセキュリティグループを管理する権限を持つAWSアカウント。
2. GitHub ActionsワークフローをホストするGitHubアカウントとリポジトリ。

### AWS IAMユーザーの設定
1. IAMユーザーの作成: [AWS管理コンソール](https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-1#/users)でIAMに移動し、プログラムによるアクセスを持つ新しいユーザーを作成します。このユーザーはGitHub Actions経由でAWSサービスとやり取りします。
2. ポリシーの割り当て: AmazonEC2FullAccessポリシーをユーザーに割り当てます。より厳格なセキュリティを求める場合は、必要なリソースへのアクセスを限定するカスタムポリシーを推奨します。
3. アクセスキーとシークレットキーのメモ: 作成後、ユーザーのアクセスキーIDとシークレットアクセスキーを安全に保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/bfa4a451-1007-c66f-8942-4c29b7a509b9.png)


### GitHubシークレットの設定

GitHubリポジトリのシークレットとしてAWS認証情報を保存します：

リポジトリの設定に移動し、'Secrets'セクションへ行きます。
AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY の2つの新しいシークレットを追加し、IAMユーザー設定から取得した値を使用します。

### GitHub Actionsワークフローの作成

ワークフローファイルの作成: リポジトリ内の .github/workflows/update-security-group.yml に新しいファイルを作成します。ワークフローの定義:

```yaml
name: EC2セキュリティグループの更新

on:
  workflow_dispatch:

jobs:
  update-security-group:
    runs-on: ubuntu-latest
    steps:
      - name: チェックアウト
        uses: actions/checkout@v2
      
      - name: AWS認証情報の設定
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: セキュリティグループの更新
        run: |
          aws ec2 authorize-security-group-ingress \
          --group-id=sg-xxxxxxxx \
          --protocol=tcp \
          --port=22 \
          --cidr==x.x.x.x/32

      - name: セキュリティグループの削除
        run: |
          aws ec2 delete-security-group \
          --group-id=sg-xxxxxxxx \
          --cidr=x.x.x.x/32

```

コマンドのカスタマイズ: sg-xxxxxxxxをセキュリティグループIDに置き換え、プロトコル、ポート、CIDRを必要に応じて調整します。

### ワークフローの実行
ワークフローが準備できたら、GitHubリポジトリのActionsタブから手動でトリガーできます。ワークフローを選択し、'Run workflow'をクリックして実行します。これにより、ワークフローファイルの指定に従ってEC2セキュリティグループが更新されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/02cec5af-491c-f9ff-9331-913d1b3ab2c7.png)


### Github IPからのアクセス許可例

```yaml
name: EC2セキュリティグループの更新

on:
  workflow_dispatch:

jobs:
  update-security-group:
    runs-on: ubuntu-latest
    steps:
      - name: チェックアウト
        uses: actions/checkout@v2
        
      - name: Public IP
        id: ip
        uses: haythem/public-ip@v1.2
      
      - name: AWS認証情報の設定
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: セキュリティグループの更新
        run: |
          aws ec2 authorize-security-group-ingress \
          --group-id=sg-xxxxxxxx \
          --protocol=tcp \
          --port=22 \
          --cidr=${{ steps.ip.outputs.ipv4 }}/32 # github global ip

      - name: セキュリティグループの削除
        run: |
          aws ec2 delete-security-group \
          --group-id=sg-xxxxxxxx \
          --cidr=${{ steps.ip.outputs.ipv4 }}/32 # github global ip

```


### 結論

GitHub Actionsを通じてAWS EC2セキュリティグループの更新を自動化することで、クラウドセキュリティの管理を簡素化できます。この記事で概説したステップに従えば、インフラの調整を一貫して安全に実行でき、手動でのエラーの可能性を減らし、運用効率を高めることができます。