【Laravel】ECS Fargate環境上のLaravelのログをCloudWatchに出力させる

Laravelかどうかに関係なく、ECS Fargate上のアプリのログをCloudWatchに表示させるには、ログを標準出力させればOK。Laravelの場合、config/logging.phpの「channel」部分を以下のように調整してあげるだけでよい。

   'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single', 'stderr', 'stdout'],
            'ignore_exceptions' => false,
        ],

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
        ],

        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => 'critical',
        ],

        'papertrail' => [
            'driver' => 'monolog',
            'level' => 'debug',
            'handler' => SyslogUdpHandler::class,
            'handler_with' => [
                'host' => env('PAPERTRAIL_URL'),
                'port' => env('PAPERTRAIL_PORT'),
            ],
        ],

        'ecs' => [
            'driver' => 'stack',
            'channels' => ['stderr', 'stdout'],
        ],

        'stdout' => [
            'driver' => 'monolog',
            'handler' => StreamHandler::class,
            'formatter' => env('LOG_STDERR_FORMATTER'),
            'formatter_with' => [
                'dateFormat' => '%Y-%m-%d %H:%M:%S'
            ],
            'with' => [
                'stream' => 'php://stdout',
            ],
        ],

        'stderr' => [
            'driver' => 'monolog',
            'level' => 'error',
            'handler' => StreamHandler::class,
            'formatter' => env('LOG_STDERR_FORMATTER'),
            'formatter_with' => [
                'dateFormat' => '%Y-%m-%d %H:%M:%S'
            ],
            'with' => [
                'stream' => 'php://stderr',
            ],
        ],

        'syslog' => [
            'driver' => 'syslog',
            'level' => 'debug',
        ],

        'errorlog' => [
            'driver' => 'errorlog',
            'level' => 'debug',
        ],

        'null' => [
            'driver' => 'monolog',
            'handler' => NullHandler::class,
        ],

        'emergency' => [
            'path' => storage_path('logs/laravel.log'),
        ],
    ],

何をしているかというと、デフォルト設定になっている「'stack'」に標準出力となる「'stderr'」と「'stdout'」を追加してあげているだけ。「'stdout'」に関してはLaravelのバージョンによっては記述がないかもしれないが、その場合は追記してやればよい。ちなみに「'single'」は見ての通りLaravelプロジェクトフォルダ内にログを出力する設定項目。この設定でCloudWatchにLaravelのログを出力させることができる。とっても簡単。

【Laravel】APIでBasic認証を使う

LaravelにはデフォルトでBasic認証の仕組みが実装されているので、基本的には「route/api.php」で以下のようにmiddlewareを追加してあげるだけ。

Route::get('sampleapi', 'SampleApiController@index')->middleware('auth.basic');

これだけで「User」テーブルの「email」と「password」でBasic認証が実装される。 f:id:daylambsbecomelions:20220103210815p:plain

ただ、この「User」テーブルを参照しに行くのに、configフォルダ内の「auth.php」の以下の部分を見ているので、

f:id:daylambsbecomelions:20220103211023p:plain

自分もそうなのだが、このUserモデルのパスを変更している場合、その変更したパスに合わせてここも調整してやる必要がある。 f:id:daylambsbecomelions:20220103211204p:plain

これでGood to Go

f:id:daylambsbecomelions:20220103211306p:plain

【Laravel】The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode

storageフォルダは777に権限していて、welcome画面とかは普通に表示できているのに、apiのURLを呼び出すとなぜかこのエラーが発生。storageフォルダのオーナーを変更すると治るとのこと。

chown -R www-data:www-data storage

【AWS】CodeCommit(gitリポジトリ)を作成しローカルでcloneする


(STEP)
1.CodeCommitのリポジトリを作成
2.CodeCommitを操作するIAMユーザーを作成
3.IAMユーザーの認証情報を生成
4.ローカルにgitリポジトリをcloneする


1. CodeCommitのリポジトリを作成

1.1. AWSマネジメントコンソール ⇒ CodeCommit ⇒ リポジトリ ⇒ 「リポジトリを作成」ボタン押下 f:id:daylambsbecomelions:20211221210940p:plain

1.2.「リポジトリ名」を入力 ⇒ 「作成」ボタン押下 f:id:daylambsbecomelions:20211221211446p:plain

1.3. 左のメニューから「リポジトリ」 ⇒ 「設定」 ⇒ 「全般」タブ ⇒ 「リポジトリARN」をメモしておく f:id:daylambsbecomelions:20211222083522p:plain

2. CodeCommitを操作するIAMユーザーを作成

2.1. AWSマネジメントコンソール ⇒ IAM ⇒ ユーザー⇒ 「ユーザーを追加」ボタン押下 f:id:daylambsbecomelions:20211222210512p:plain

2.2. 「ユーザー名」を入力 ⇒ 「アクセスキー・プログラムによるアクセス」にチェック ⇒ 「次のステップ:アクセス権限」ボタン押下 f:id:daylambsbecomelions:20211222210723p:plain

2.3. 「既存のポリシーを直接アタッチ」ボタンを選択し、「ポリシーの作成」ボタン押下 f:id:daylambsbecomelions:20211222215840p:plain

2.4. ポリシーの作成画面で「サービスの選択」 f:id:daylambsbecomelions:20211222084542p:plain

2.5. 「CodeCommit」と入力し、表示された「CodeCommit」のリンクを選択 f:id:daylambsbecomelions:20211222084622p:plain

2.6. 今回は全権限を付与したいので「すべてのCodeCommitアクション」のチェックボックスにチェック f:id:daylambsbecomelions:20211222204514p:plain

2.7. リソースのセクションで「ARNの追加」のリンクを押下 f:id:daylambsbecomelions:20211222205241p:plain

2.8. 「1.3.」でメモしておいたリポジトリARNを「CodeCommit_repositoryのARNの指定」に貼り付け ⇒ 「追加」ボタン押下 f:id:daylambsbecomelions:20211222205522p:plain

2.9. 「次のステップ:タグ」ボタンを押下

2.10. 「次のステップ:確認」ボタンを押下

2.11. 「名前」を入力し、「ポリシーの作成」ボタン押下 f:id:daylambsbecomelions:20211222205831p:plain

2.12. IAMユーザー作成画面に戻り、「既存のポリシーを直接アタッチ」で先ほど自作したポリシーを検索、チェックボックスをチェック f:id:daylambsbecomelions:20211222215203p:plain

2.13. 同じ要領で「IAMUserChangePassword」を検索、チェックボックスをチェック ⇒ 「次のステップ:タグ」 f:id:daylambsbecomelions:20211222215248p:plain

2.14. タグの追加(オプション)はそのままスキップ ⇒ 「次のステップ:確認」ボタン押下

2.15. 確認画面で内容を確認し、「ユーザーの作成」ボタン押下

3. IAMユーザーの認証情報を生成

3.1. AWSマネジメントコンソール ⇒ IAM ⇒ ユーザー⇒ 「2」で作成したユーザーを選択

3.2. 「認証情報」タグを選択 ⇒ 「AWS CodeCommit の HTTPS Git 認証情報」にある 「認証情報の生成」ボタン押下 f:id:daylambsbecomelions:20211222222552p:plain

3.3. 画面に表示されたIDとパスワードをメモする

4. ローカルにgitリポジトリをcloneする

4.1. CodeCommitのリポジトリ一覧から対象のリポジトリの「HTTPS」のリンクを押下し、URLをクリップボードにコピーする f:id:daylambsbecomelions:20211222223222p:plain

4.2. 「3.3.」でメモしたパスワードを以下のような形でURL内に組込む

https://{ID}:{パスワード}@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/my-profile

4.3. 「4.2.」で作成したURLでgitをcloneする

【Laravel】FormRequestで「引数①があれば引数②を必須とする」のバリデーションの書き方

Laravelで例えば以下のようなリクエストパラメーターがあり、「start_date」があった場合は「end_date」を必須とする、というバリデーションをFormRequestで実装する場合、以下のような記述になる。

class SampleRequest extends FormRequest
{

    /** 中省略 */
    public function rules()
    {
        return [
            'start_date' => [
                'date',
            ],
            'end_date' => [
                'date',
                'required_with:start_date',
            ],
        ];
    }

【Laravel】URL内の引数に対してFormRequestでバリデーションをかける

Laravelで以下のようなURL内の引数に対して

Route::get('/sample/{param1?}/{param2?}', 'Sapmle\SampleController@index')->name('sample.index');

FormRequestの処理を使ってバリデーションを行おうとしたところ、以下のようにいつも通りに書いてもなぜかスルーされてバリデーションが実行されない。

namespace App\Http\Requests\Sample;
use Illuminate\Foundation\Http\FormRequest;

class SampleRequest extends FormRequest
{
  /** 中省略 */
  public function rules()
    {
        return [
            'param1' => [
                'integer',
            ],
            'param2' => [
                'string',
            ],
        ];
    }
  /** 中省略 */
}

調べたところ、どうやらURL内の引数はルート情報内のみに存在していてそのままではパラメーターとして拾ってくれず、継承元のFormRequestクラスにあるvalidationData()メソッドをオーバーライドして渡し直してあげる必要があるらしい。以下のように上書きメソッドを追記することで通常通り上記のようなrules()で拾うことができた。

namespace App\Http\Requests\Sample;
use Illuminate\Foundation\Http\FormRequest;

/** ↓↓ Routeを追記 ↓↓ */
use Illuminate\Support\Facades\Route;

class SampleRequest extends FormRequest
{
  /** 中省略 */
   /**
   * Override validationData() method in FormRequest to obtain parameters within URL.
   *
   * @return array
   */
    public function validationData()
    {
        return array_merge($this->request->all(), [
            'param1' => Route::input('param1'),
            'param2'   => Route::input('param2'),
        ]);
    }
  /** 中省略 */
}

【bash】How to solve : Syntax error: "(" unexpected

I wrote some shell scripts and try to execute in docker httpd environment by typing below command

sh sample.sh

then I got this error.

sample.sh: 13: Syntax error: "(" unexpected

Yes I have "(" in line 13 but what's wrong with that? The thing is if you are under Debian environment like Ubuntu, "sh" does not stand for "bash" but "dash" . You can see it by typing as below.

ls -ltra /bin/sh 
lrwxrwxrwx 1 root root 4 Dec  1 00:00 /bin/sh -> dash

Solution. In stead of "sh sample.sh", just use "bash" as below.

bash sample.sh

Then you get what you want without errors no more!