LaravelをGitHub ActionsでEC2に自動デプロイしてみた(AWS編)

## 経緯
今まで直接SSH接続してgit pullやらphp artisan やらをしていたことが多く
また1から作成したことがないなと思いこの機会に学習したので備忘録として残します。

## 色々検索してみる
「github ec2 自動デプロイ」でググるといろんな方法がありました。
認証鍵の方法だとGitHub ActionsのIPが固定じゃないので「セキュリティグループでSSHのIP制限をしていたら使えないんじゃないか？」と思い今回はOpenID Connectを使用することにしました。

※self-hosted runner等使用すると認証鍵でもいけそうでした。

### 構成

Amazon Linux2023
Laravel (sailを使用)
Vue3

* git,composer等、使用するものをEC2でインストール済み


## やること

AWS
1. IDプロバイダの作成
1. IAMロールの作成
1. ポリシーの作成

### 1. IDプロバイダの作成
1. AWS Management ConsoleでIAMの管理画面に移動し「IDプロバイダ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/75a9259d-fbae-8f6d-a825-a257438c5338.png)

1. 以下を追加し作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/a95c9cb9-54e0-598f-dce2-490918116e69.png)
• プロバイダーのタイプ: OpenID Connect
• プロバイダーURL: https://token.actions.githubusercontent.com
• 対象者: sts.amazonaws.com
    > token.actions.githubusercontent.com:audは、トークンの発行者（audience）を指定します。ここでは 'sts.amazonaws.com' を使用
    token.actions.githubusercontent.com:subは、トークンのサブジェクトを指定し、特定のGitHubリポジトリやブランチに対するアクセスを制限します。

    引用元
    
    
https://qiita.com/satooshi/items/0c2f5a0e2b64a1d9a4b3#:~:text=com'%20%E3%82%92%E4%BD%BF%E7%94%A8-,token.actions.,%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E5%88%B6%E9%99%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

 
### 2. IAMロールの作成

1. IAMの管理画面で「ロール」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/26d654cd-b30f-51d4-7f56-fa387036128b.png)

1. 信頼されたエンティティタイプを「ウェブアイディンティティ」を選択し下記を入力
**アイデンティティプロバイダー**: token.actions.githubusercontent.com
**Audience**: sts.amazonaws.com
**GitHub 組織**: ユーザー名　(今回は個人のためユーザー名になります)
**GitHub repository**: 対象のリポジトリ
**GitHub branch**: 対象のブランチ

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/2bbc3c62-1069-7231-9b0a-b57f87a92de4.png)

1. 許可ポリシーは設定せずに次へ

1. 名前、確認、および作成画面で任意のロール名を入力(必要であれば説明も)しロールを作成
1. 作成したロールを確認しARNをメモします。(GitHubで使用します)

## 3. ポリシーの作成

1. IAMの管理画面にある「ポリシー」から「ポリシーの作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/8991e73b-f7e1-59ce-2554-fb3ddfe18eee.png)

1. ポリシーエディタを「JSON」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/d5347831-2b30-f7f4-868b-9c1963ef88ec.png)
下記を追加し「次へ」ボタン押下

    ```JSON:json
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ssm:SendCommand",
    				"ssm:GetCommandInvocation"
    			],
    			"Resource": [
    				"arn:aws:ec2:[リージョン]:[アカウントID]:instance/*",
    				"arn:aws:ssm:[リージョン]::document/AWS-RunShellScript"
    			]
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ssm:GetCommandInvocation"
    			],
    			"Resource": [
    				"*"
    			]
    		}
    	]
    }
    ```
    * **Effect**
    許可または拒否を設定。
    * **Action**
    許可もしくは拒否する操作。
    * **Resource**
    対象のリソース。
    * **[リージョン]**
    使用しているEC2のリージョンを記載します。(例:ap-northeast-1)
    * **[アカウントID]**
    IAMダッシュボードの右側に記載されているアカウントIDになります。
    インスタンスARNにも記載されています。

    GetCommandInvocationがResourceをグローバル(*)にしないと認識してくれませんでした。。。

    <br>
1. 「ポリシー名」を入力(必要に合わせて説明も)しポリシーを作成する
![スクリーンショット 2024-11-24 17.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/df56d393-4722-1543-de18-577ed8eb0019.png)

1. [2. IAMロールの作成]で作成したロールに戻り「ポリシーをアタッチ」を押下し先ほど作成したポリシーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939352/0326d4c7-fd11-5836-8762-20a46d438281.png)

### 最後に
ロールやポリシーの付け方がいろんな方法で可能なのでどこで設定したか戸惑ってしまいました。
AWSの設定はこれで終了です。
次回はGitHubの設定をしていきます。↓

https://qiita.com/kyona/items/083cb542e63140dfa231

参考

https://emoshu.co.jp/blog/archives/26

https://qiita.com/kaino5454/items/bae4bca47e6f409e072f