CloudWatch Logsのロググループ内をCLI検索するメモ

やりたいこと

AWS CloudWatch Logsでグループ内を横断的に検索したい (そもそもこれってコンソール上からできないのか?)

AWS CLI

30分前からのログを検索

$ aws logs filter-log-events --log-group-name 'log-group' --filter-pattern '"hogehoge"' --start-time `date -d '30 minutes ago' +%s%3N` --profile my-profile --region ap-northeast-1

特定の時間のログを検索

$ aws logs filter-log-events --log-group-name 'log-group' --filter-pattern '"hogehoge"' --start-time `TZ=Asia/Tokyo date --date='2022-09-01 14:30:00.000' +%s%3N` --end-time `TZ=Asia/Tokyo date --date='2022-09-01 20:15:00.000' +%s%3N` --profile my-profile --region ap-northeast-1

AWS Lambdaをterraformで作成する際のエラー(ValidationException)

Lambdaのエラーに直面

  • terraformでLambdaを作成(aws_lambda_functionの作成)しようとしたときに以下のエラーに直面
 Error: error creating Lambda Function (1): ValidationException: 
       status code: 400, request id: hogehoge

結論(原因)

Lambdaの関数名に.が含まれていた

解説

このエラーが出る理由はいくつかあると思いますが、今回の場合、Lambdaの名称に不正な文字列が含まれているでした Lambdaに使える名前は([a-zA-Z0-9-_]+)のようですが、今回.を含んでおり、それに気づくのにひどく時間がかかりました。

たぶんほかの理由でもこれが出ることはあると思います。(Roleが不正とかでも出るらしい) 名称があっているかは確認しましょう

LaravelでGDを使って画像ファイル処理したいメモ(画像ファイルのfakerのイメージ)

概要

  • Laravelで画像ファイルを作成したい(テストなど)
  • PNG,JPEG,WebPなど作成したい
  • Dockerで使いたい

PHPの定番ライブラリGD

GDという定番ライブラリがあるようなのでそれを使用する

www.php.net

DockerファイルでのGDインストール

参考

tt-computing.com

www.php.net

結論

PNG, JPEG, WebPであれば、以下をDockerでビルドすればOK

RUN apt-get update && \
  apt-get install -y zlib1g-dev libpng-dev libjpeg62-turbo-dev libwebp-dev && \
  docker-php-ext-configure gd --with-jpeg --with-webp && \
  docker-php-ext-install -j$(nproc) gd

確認方法

上記Dockerfileをビルドし、PHP用コンテナに入り、tinker起動

php artisan tinker

tinkerでgd_info();を実行

gd_info();

=> [
     "GD Version" => "bundled (2.1.0 compatible)",
     "FreeType Support" => false,
     "GIF Read Support" => true,
     "GIF Create Support" => true,
     "JPEG Support" => true,
     "PNG Support" => true,
     "WBMP Support" => true,
     "XPM Support" => false,
     "XBM Support" => true,
     "WebP Support" => true,
     "BMP Support" => true,
     "AVIF Support" => false,
     "TGA Read Support" => true,
     "JIS-mapped Japanese Font Support" => false,
   ]

うまくいってそう。 ちなみに、Laravelで使う場合、たとえば以下のようなことができる。

use Illuminate\Http\UploadedFile;

UploadedFile::fake()->image('aaa.jpg');

これによってファイル作成してくれる模様(メモリ上で作成するだけ?)

テストコード

テストコードもこれを使って記載したい(実際のテストコードは別の内容で)

参考

tenrakatsuno.com

PHPStanについてのメモ(Laravel8への導入)

概要

  • Laravel8にPHPStanを導入したときのメモ

Larastanの選択

  • PHPStanを直接入れるのではなく、Larastanを使うほうがスタンダードなのかと思い、Larastanを選択

Larastan 1.x

Laravel8以前は、Larastanの1系となる模様

github.com

ちなみにLaravel9移行がLarastanの2系となる

github.com

isntall

composer require nunomaduro/larastan:^1.0 --dev

上記コマンドのインストールが終わったら、*.neonファイルを作成する(手動で) 自動で作成されそうな記載もあるが、作成されなかった

touch phpstan.neon

公式のサンプルのneonファイルはテストに通らなかったので、少し加工して以下のように。 ignoreErrorsの部分で、エラーが出てしまったので、その部分は削除。 また、testsディレクトリを追加してみた

includes:
    - ./vendor/nunomaduro/larastan/extension.neon

parameters:

    paths:
        - app
        - tests

    # The level 9 is the highest level
    level: 0

    excludePaths:
        - ./vender

    checkMissingIterableValueType: false

このように出ればOK

 42/42 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%



 [OK] No errors

他のフォルダも追加

includes:
    - ./vendor/nunomaduro/larastan/extension.neon

parameters:

    paths:
        - app
        - config
        - tests
        - database
        - routes

    # The level 9 is the highest level
    level: 0

    excludePaths:
        - ./vender

    checkMissingIterableValueType: false

エラーが発生する

上記のneonファイルで実行するとエラーが発生してしまった。 どうやら、$thisの解決ができないよ、というような感じ。

 ------ --------------------------- 
  Line   routes/console.php
 ------ ---------------------------
  18     Undefined variable: $this
 ------ ---------------------------

実際にエラーがでているroutes/console.phpファイルを見てみると

<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;

/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');

このようになっており、$thisがアカンらしい。

無視

解決できないようなので、無視するのがいいらしい

github.com

/* @phpstan-ignore-next-line */

このような感じでphpstanに無視を教えてあげることが可能(各種Linterと似たような感じ)

Artisan::command('inspire', function () {
    /* @phpstan-ignore-next-line */
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');

上記のようになりました。

PhpStormでLaravelのCLIをデバッグする(xdebug)

概要

参考

とてもわかりやすかったです。ありがとうございます

blog.junpeko.com

ざっくり手順

  • xdebugの設定をする
  • cli用のサーバ設定を作る(PhpStorm)
  • PHP_IDE_CONFIGを設定する
  • デバッグのconfigurationを設定する
  • 諸々のパラメータ付きでphp artisan実行

詳細

xdebugの設定をする

このあたり参考に

y-ni-shi.hatenablog.com

cli用のサーバ設定を作る(PhpStorm)

  • [File]->[Settings]のServerのところで新たにServerの設定を作る(今回作ったサーバはcliとします) f:id:y-ni-shi:20220408200840p:plain

  • Pathmappingを対応させる

    • 例えばこんな感じ
      • f:id:y-ni-shi:20220408200951p:plain

PHP_IDE_CONFIGを設定する

  • どうやらPHP_IDE_CONFIGを設定してサーバネームを教えてあげないといけないようです

pleiades.io

export PHP_IDE_CONFIG="serverName=cli"

デバッグのconfigurationを設定する

  • 先ほど作成したserverの設定を選ぶ(cli)
  • IDE keyを設定する(何か適当な文字列に)

f:id:y-ni-shi:20220408201919p:plain

諸々のパラメータ付きでphp artisan実行

  • php artisanをXdebug設定にあわせて実行します(IDE key, port, hostなどなど)
php -dxdebug.idekey=PHPSTORM -dxdebug.mode=debug -dxdebug.start_with_request=yes -dxdebug.client_host=host.docker.internal -dxdebug.client_port=9003 artisan hoge:fuga

これでブレークしてくれるはず!

PHPStormでXdebugを使うときのメモ(Docker)

前提

  • Docker
  • PHPStorm
  • Xdebug3系

参考

blog.junpeko.com

流れ

  • Docker内にXdebugをインストールする(3系をインストールする)
  • Xdebugを有効にする
  • PHPStormでRemoteDebugの設定をする(Dockerの内部のファイルとのPathMappingなど)

Dockerの準備

  • DockerにXdebugをインストールする
    • これはアプリケーション用(PHP用)のDockerコンテナであって、別途nginxを作っている

参考にさせていただいたサイト

qiita.com

Dockerfile

FROM php:8.1-fpm-bullseye
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

# timezone environment
ENV TZ=UTC \
  # locale
  LANG=en_US.UTF-8 \
  LANGUAGE=en_US:en \
  LC_ALL=en_US.UTF-8 \
  # composer environment
  COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:2.1 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
  apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  locale-gen en_US.UTF-8 && \
  localedef -f UTF-8 -i en_US en_US.UTF-8 && \
  mkdir /var/run/php-fpm && \
  docker-php-ext-install intl pdo_mysql zip bcmath && \
  composer config -g process-timeout 3600 && \
  composer config -g repos.packagist composer https://packagist.org

COPY ./infra/docker/8.1/php/php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
COPY ./infra/docker/8.1/php/php.ini /usr/local/etc/php/php.ini
COPY ./infra/docker/8.1/php/start-container /work/start-container/
COPY ./src/ /work/backend/

WORKDIR /work/backend

RUN mkdir -p storage/framework/cache/data && \
    mkdir -p storage/framework/app/cache && \
    mkdir -p storage/framework/sessions && \
    mkdir -p storage/framework/views && \
    mkdir -p storage/logs && \
    mkdir -p bootstrap/cache && \
    chmod -R 777 storage && \
    chown -R www-data:www-data /work/backend && \
    chmod +x /work/start-container/start-container && \
    composer install

# install xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

EXPOSE 9000

解説

こちらでXdebugのインストールと有効化をしている

# install xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug
余談

以下のstart-containerというファイルは、laravel sailのスタートアップ時のシェルをほぼ参考にしているが、Dockerコンテナ内と、ホスト側の所有権の解決をしている部分)
所有権のために、Dockerで使用するユーザのIDをあわせている

    chmod +x /work/start-container/start-container && \

以下がstart-container
WWWUSERが設定されている場合にはusermodによってユーザのIDを変更している

#!/usr/bin/env bash

if [ ! -z "$WWWUSER" ]; then
    usermod -u $WWWUSER www-data
fi

php-fpm

php.iniの準備

php.iniに以下を追記

[xdebug]
xdebug.mode=debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal

最初にxdebug.mode=debugだけを書いていてハマっていた。 xdebug.client_host = host.docker.internalが重要と思われる(デバッグ用ホスト)

PHPStormの設定

まずはDockerコンテナを起動冴えておく(上記のアプリケーション用のDockerコンテナ)

f:id:y-ni-shi:20220109172247p:plain

画面のように、PHPのバージョン、Dockerコンテナなどを設定する コンテナとのPath Mappingが重要(Xdebugブレークポイントとまらないケースはこのあたり確認)

参考

pleiades.io

CLI Interpreter

f:id:y-ni-shi:20220109172511p:plain

こちらも同様に設定する

f:id:y-ni-shi:20220109172529p:plain

このようにXDebugがコンテナ内で有効になっている場合にはXDebugのバージョンが表示される(表示されない場合にはXDebugが有効になっていないことになる)

XDebugの設定

f:id:y-ni-shi:20220109173100p:plain

ポートを注意する(XDebug3系から9003に変更されたらしい)

Run/Debug Configurationsの設定

f:id:y-ni-shi:20220116131349p:plain

このように、デバッグ対象のサーバを選ぶ(チェックボックスを一回いれてサーバを選択し、またチェック解除)

ブラウザのデバッグ

このあたり参考に

https://y-ni-shi.hatenablog.com/entry/2021/11/21/021438?_ga=2.201150766.1052439647.1641648968-1233221826.1641177067#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0

DockerfileのSHELLについての説明メモ

概要

  • DockerfileのSHELL構文について理解がなかったので、調査時のメモ

出発点

こちらのページで出てきたDockerfileの調査をしていた

qiita.com

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

参考

こちらのサイトが非常に参考になりました。ありがとうございます。

https://gist.github.com/mohanpedala/1e2ff5661761d3abd0385e8223e16425

qiita.com

SHELL命令

docs.docker.jp

SHELL 命令は、 シェル 形式で使われるデフォルトのコマンドを上書きできます。 Linux 上でのデフォルトのシェルは ["/bin/sh", "-c"] で、Windows は ["cmd", "/S", "/C"] です。Dockerfile では、 SHELL 命令を JSON 形式で書く必要があります。

  • SHELLという構文はDockerfile内で使用される(Dockerfileビルド時に使用される)コマンドラインに対して、上書きができる
  • デフォルトではDockerは["/bin/sh", "-c"]の設定になっている

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

  • 意味を紐解く(これはDockerの話ではなく、bashの話)
    • "/bin/bash"
      • これはこのまま"/bin/bash"を使うという意味
    • "-oeux"
      • -e
        • エラーが発生したらシェルの実行を停止してくれる(つまり、Dockerのビルドが止まる)
      • -u
        • 未定義の変数を使用した場合にエラーとする
      • -x
        • 実行したコマンドをターミナルに出力する
      • -o pipefail
        • -eオプションを設定していたとしても、パイプでつないだ際には止まってくれないが、-o pipefailというオプションを付けることによりとまるようになる(以下、具体例)
#!/bin/bash -e

false | true
echo do not stop

# 上記場合にはecho do not stopは実行される

#!/bin/bash -e

set -o pipefail

false | true
echo do not stop
# 上記場合にはecho do not stopは実行されない