前回の続きになります。
やること
GitHub
- Secretsの設定
- workflowの設定
1. Secretsの設定
Name | Secret |
---|---|
AWS_ROLE_ARN | IAM管理画面のロールで設定したARN (例:arn:aws:iam::[アカウントID]:role/[ロール名]) |
AWS_REGION | 使用しているEC2のリージョン(例:us-east-1) |
INSTANCE_ID | EC2のインスタンスID |
2. workflowの設定
-
リポジトリの[Actions]に移動し「New Workflow」を押下し「set up a workflow yourself」を押下
-
下記を追加し「Commit changes」を行う
main.ymlname: Deploy Laravel App on: push: branches: - main # mainブランチへのpushをトリガー jobs: deploy: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: # AWS CLIの設定 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN }} aws-region: ${{ secrets.AWS_REGION }} # SSMを使ってデプロイコマンドを実行 - name: Deploy using SSM run: | response=$(aws ssm send-command \ --instance-ids ${{ secrets.INSTANCE_ID }} \ --document-name "AWS-RunShellScript" \ --comment "Deploy Laravel Application" \ --parameters '{"commands": [ "set -eux", "export HOME=/home/ec2-user", "export COMPOSER_ALLOW_SUPERUSER=1", "git config --global --add safe.directory /var/www/[実行するディレクトリ]", "cd /var/www/[実行するディレクトリ]", "git checkout main", "git pull origin main", "composer install --no-dev --optimize-autoloader", "php artisan migrate --force", "php artisan config:cache", "php artisan route:cache", "php artisan view:cache", "npm install", "npm run build", "sudo systemctl reload nginx" ]}' \ --region ${{ secrets.AWS_REGION }} \ --output json) echo "Response from send-command: $response" # CommandIdを取得 command_id=$(echo $response | jq -r '.Command.CommandId') # CommandIdが空でないか確認 if [ -z "$command_id" ]; then echo "Error: Command ID is empty" exit 1 fi # コマンド完了を待機 aws ssm wait command-executed \ --command-id "$command_id" \ --instance-id ${{ secrets.INSTANCE_ID }} wait_status=$? if [ $wait_status -ne 0 ]; then echo "Waiter failed, fetching command details..." result=$(aws ssm get-command-invocation \ --command-id "$command_id" \ --instance-id ${{ secrets.INSTANCE_ID }} \ --output json) echo "Command Result:" echo "$result" # エラー内容を表示 stderr=$(echo "$result" | jq -r '.StandardErrorContent') echo "---- Standard Error ----" echo "$stderr" exit 1 fi echo "Command execution completed successfully." # $command_id を後続ステップで使えるようエクスポート echo "COMMAND_ID=$command_id" >> $GITHUB_ENV # エラー詳細と標準出力を表示 - name: Handle SSM Command Execution Result run: | # 結果を取得2 result=$(aws ssm get-command-invocation \ --command-id "$COMMAND_ID" \ --instance-id ${{ secrets.INSTANCE_ID }} \ --output json) # ステータスを取得 status=$(echo "$result" | jq -r '.Status') echo "Command Status: $status" # 標準出力を取得 stdout=$(echo "$result" | jq -r '.StandardOutputContent') echo "---- Standard Output ----" echo "$stdout" # ステータスがFailedの場合はエラーを返す if [ "$status" == "Failed" ]; then echo "Command execution failed." exit 1 fi echo "Command executed successfully."
AWS_ROLE_ARN等は[1. Secretsの設定]で設定した名前に合わせてください。
send-commandは実行できたけどアプリが反映されない事象が起こったのでログを出力するようにしました。
ログ表示はいらないよーという方は「# コマンド完了を待機」から下を削除してください。
ありがとうございました。