デブキャンでBrefを使ってデプロイ試す冒険記

# 前おき
会社で行っているデブキャンでの作業ログです。
そしてBrefへのデプロイがうまくいかず**格闘中**です。解決したら追記します。


# 勤怠チェックツールを作成した
会社のslackで勤怠チャンネルというのがあり、出勤、退勤のログが流れてくる。

勤怠管理システムと拡張機能を入れておけば自動でpostされる。ただし入れていない人はslackのワークフローを使い、postをする必要がある。
中にはpostし忘れる人がいる。その忘れた人を抽出するツールをphpで作ってみた。

![スクリーンショット 2023-04-30 11.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190685/439d4121-0d84-284c-0a01-1f139fd1b17d.png)
チョッ○ーBotが教えてくれます。チョッ○ーなのに文章はガチガチの固さですね。

これをサーバレスで動かします。

# Bref

Lambdaで動かしますが、phpはサポートされていない為、Brefを使用しようと思います。

Brefとは
> Brefは、AWS Lambda上でPHPを実行するためのオープンソースのフレームワークです。
AWS Lambdaは、イベントドリブンなサーバーレスコンピューティングサービスであり、Brefを使うことでPHPのコードをLambda上で実行することができます。Brefは、Lambda上でPHPを実行するための一連の機能を提供することで、PHP開発者がLambdaを簡単に使えるようにすることを目的としています。Brefは、PHPのライブラリやフレームワークをLambda上で使えるようにしたり、Lambdaでのログ出力やデプロイメントを簡単にしたりする機能を提供しています。


僕自身使ったことはなく、初見だったのですが、2018年に公開されたものらしいです。

https://bref.sh/docs/


cronもあるので今回のユースケースに合います。

https://bref.sh/docs/web-apps/cron.html



# インストール
## 事前準備
インストール手順に沿って進めていきます。

https://bref.sh/docs/installation.html

まずはserverlessというコマンドをインストールします。
```zsh
npm install -g serverless
```


## Brefをインストール
次にBrefをインストールします。
composerでインストールする必要があるみたいです。

```
composer require bref/bref
```
composer以外にinstall方法がないか気になりChatGPTさんに聞いてみたところ
> Brefを使うためには、AWS Lambda上でPHPを実行するためのランタイムや、Lambdaの設定を管理するためのAWS CLIなど、いくつかのツールが必要です。しかし、これらのツールを手動でインストールすることはできますが、簡単にセットアップするためにBrefにはbref-initというCLIツールが提供されており、これを使用するとBrefのテンプレートを使って、必要なファイルやディレクトリを自動的に生成することができます。ただし、bref-initを使用するためには、Composerがインストールされている必要があります。

と仰っていました。定かではないですが、まぁcomposerでインストールします。

```zsh
% composer require bref/bref
Info from https://repo.packagist.org: #StandWithUkraine
Using version ^2.0 for bref/bref
./composer.json has been created
Running composer update bref/bref
Loading composer repositories with package information
Updating dependencies
Lock file operations: 11 installs, 0 updates, 0 removals
  - Locking bref/bref (2.0.4)
  - Locking crwlr/query-string (v1.0.3)
  - Locking hollodotme/fast-cgi-client (v3.1.7)
  - Locking nyholm/psr7 (1.7.0)
  - Locking php-http/message-factory (1.1.0)
  - Locking psr/container (2.0.2)
  - Locking psr/http-factory (1.0.2)
  - Locking psr/http-message (1.1)
  - Locking psr/http-server-handler (1.0.2)
  - Locking riverline/multipart-parser (2.1.1)
  - Locking symfony/process (v6.2.10)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 11 installs, 0 updates, 0 removals
  - Downloading symfony/process (v6.2.10)
  - Downloading riverline/multipart-parser (2.1.1)
  - Downloading psr/http-message (1.1)
  - Downloading psr/http-server-handler (1.0.2)
  - Downloading psr/http-factory (1.0.2)
  - Downloading php-http/message-factory (1.1.0)
  - Downloading nyholm/psr7 (1.7.0)
  - Downloading hollodotme/fast-cgi-client (v3.1.7)
  - Downloading crwlr/query-string (v1.0.3)
  - Downloading bref/bref (2.0.4)
  - Installing symfony/process (v6.2.10): Extracting archive
  - Installing riverline/multipart-parser (2.1.1): Extracting archive
  - Installing psr/http-message (1.1): Extracting archive
  - Installing psr/http-server-handler (1.0.2): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing psr/http-factory (1.0.2): Extracting archive
  - Installing php-http/message-factory (1.1.0): Extracting archive
  - Installing nyholm/psr7 (1.7.0): Extracting archive
  - Installing hollodotme/fast-cgi-client (v3.1.7): Extracting archive
  - Installing crwlr/query-string (v1.0.3): Extracting archive
  - Installing bref/bref (2.0.4): Extracting archive
Generating autoload files
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found
```

次に以下コマンドを実行
```
vendor/bin/bref init
```

```zsh
% vendor/bin/bref init
What kind of application do you want to create? (you will be able to add more functions later by editing `serverless.yml`)
  [0] Web application (default)
  [1] Event-driven function
> 1 # 今回作ったのはWEBアプリではないので、1のイベント駆動を選んでおきました。どっちを選んでもあとで設定を変えられるみたいです。

Creating index.php

index.php successfully created and added to git automatically.
Creating serverless.yml

serverless.yml successfully created and added to git automatically.
Project initialized and ready to test or deploy.
```

プロジェクトに次のファイルができました
- index.php: アプリケーションのコードが含まれています
- serverless.yml  # AWS にデプロイするための構成が含まれています

index.phpの中は以下のようになってました。
```php:index.php
<?php declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

return function ($event) {
    return 'Hello ' . ($event['name'] ?? 'world');
};

```

# デプロイ
とりあえずデプロイをしてみようと思います。

デプロイするには、次のコマンドでできるっぽいです。
```zsh
serverless deploy
```


エラーになりました。
```
% serverless deploy

Deploying app to stage dev (us-east-1)

✖ Stack app-dev failed to deploy (1s)
Environment: darwin, node 16.13.2, framework 3.30.1, plugin 6.2.3, SDK 4.3.2
Credentials: Local, "default" profile
Docs:        docs.serverless.com
Support:     forum.serverless.com
Bugs:        github.com/serverless/serverless/issues

Error:
The security token included in the request is invalid.
```

会社で用意してあるAWSのユーザに以下が存在し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190685/fa1582fc-5737-5219-0146-8e3f56295ade.png)
このCommand line or programmatic accessをクリックして表示されるモーダルに記載されているアクセスキーとシークレットキーを使っていたのですが、それではダメでした。(権限が足りないと思われる。)

Brefに記載の方法で、IAMユーザを作成し、AWSアクセスキーを作成。

https://bref.sh/docs/installation/aws-keys.html


~/.aws/credentialsファイルがあるので、作成したアクセスキーとシークレットキーをセットしました。

再度デプロイ実行。
```zsh
% serverless deploy

Deploying app to stage dev (us-east-1)
Warning: Not authorized to perform: lambda:GetFunction for at least one of the lambda functions. Deployment will not be skipped even if service files did not change.

✖ Stack app-dev failed to deploy (61s)
Environment: darwin, node 16.13.2, framework 3.30.1, plugin 6.2.3, SDK 4.3.2
Credentials: Local, "default" profile
Docs:        docs.serverless.com
Support:     forum.serverless.com
Bugs:        github.com/serverless/serverless/issues

Error:
CREATE_FAILED: HelloLogGroup (AWS::Logs::LogGroup)
Resource handler returned message: "User: XXXX is not authorized to perform: logs:CreateLogGroup on resource: XXXXX: with an explicit deny in a service control policy (Service: CloudWatchLogs, Status Code: 400, Request ID: XXXXX)" (RequestToken: XXXXX, HandlerErrorCode: GeneralServiceException)

View the full error: XXXXXXXX
```

ポリシーを見直してみる。がそもそもAministratorAccessをつけているので、弾かれることはないはず。

IAM Policy Simulatorで試してみてもCreateLogGroupはAllowとなるので外部からのアクセスができていない。
さて、なんだろうか。

今回の作業はここでタイムアップでした。またわかったら追記します。