AWS Workshop「Building CI/CD pipelines for lambda canary deployments using AWS CDK 」をTypeScriptで試してみる(前編)
AWS CDK を試してみたいと思っていたところ、以下のワークショップ資料を見つけたので、 今回はそちらに沿って、AWS CDK (TypeScript)で Lambda カナリアデプロイを試してみた記事になります。 catalog.us-east-1.prod.workshops.aws
ワークショップでは Python を使用していましたが、今回は TypeScript で実装してみました! 前編となる今回の記事では、CDK のインストールから Lambda カナリアデプロイまでを試してみます。
こんな人向け
「AWS Workshops」とは
AWSおよびAWSパートナーによって作成されたワークショップで、実践的なスキルやテクニックを紹介しており、現在100ものコンテンツが公開されています。
「AWS Cloud Development Kit(CDK)」 とは
AWS Cloud Development Kit (CDK) は、AWSインフラを Python, TypeSctipt, Java といったアプリケーション言語で定義し、AWS CloudFormation を通じてプロビジョニングできるツール。 同様なツールとして Terraform があげられますが、Terraform は独自言語を利用することから、使い慣れた言語で記述する AWS CDK と大きく違うところですね。
カナリアデプロイ とは
アプリケーションの新しいバージョンをデプロイする際に、最初に一部のユーザーでテストを行い、段階的に新しいバージョンのアプリケーションへ切り替えていく方式。 Lambda カナリアデプロイは AWS CodeDeploy を利用して実現します。
概要がわかったところで、さっそくワークショップの資料に沿って進めていきます!
事前準備
こちらのワークショップのリンクに沿って準備します↓
prerequisitesprerequisites
必要なもの
・An AWS account
・AWS CLI
・Node.js
・AWS CDK Toolkit
・Git
・An IDE for your programming language
AWS CDK Toolkit のインストールもこれだけ
$ npm install -g aws-cdk
無事インストールできたようです!
$ cdk --verion 2.37.1 (build f15dee0)
Create your AWS CDK project
$ mkdir cdk-ts-lambda-canary-deploy && cd cdk-ts-lambda-canary-deploy
ワークショップ用のディレクトリを作成した後、TypeScript の CDK プロジェクトを作成します。
$ cdk init cdk-ts-lambda-canary-deploy --language typescript
Project structure
ファイル構造
├── README.md ├── bin │ └── cdk-ts-lambda-canary-deploy.ts ├── cdk.json ├── jest.config.js ├── lib │ └── cdk-ts-lambda-canary-deploy-stack.ts ├── package.json ├── test │ └── cdk-ts-lambda-canary-deploy.test.ts └── tsconfig.json
Entry point
bin/cdk-ts-lambda-canary-deploy.ts
スタックの生成処理を行うためのエントリーポイントを記載するファイル
Main stack
lib/cdk-ts-lambda-canary-deploy-stack.ts
リソース定義を記載するファイル
Adding our app configuration
Adding stack code
メインスタックの lib/cdk-ts-lambda-canary-deploy-stack.ts
ファイルにリソース定義を記載していきます。
いくつかポイントを絞って解説していきます!(コード全体は最後に記載の github をご確認ください)
`const environmentType = this.node.tryGetContext('environmentType')`
this.node.tryGetContext
で cdk.json に定義した context を取得できます。
const myLambda = new NodejsFunction(this, 'MyFunction', { functionName: context['lambda']['name'], handler: 'main', runtime: Runtime.NODEJS_16_X, entry: path.join(__dirname, '../lambda/handler.ts'), currentVersionOptions: { description: `Version deployed on ${currentDate}`, removalPolicy: RemovalPolicy.RETAIN } })
Lambda 関数を TypeScript で作成する場合は aws-cdk-lib/aws-lambda-nodejs の
NodejsFunction
を使います。 NodejsFunction は自動的に JS ファイルにコンパイルしたものを Lambda にデプロイしてくれます!
Adding lambda code
次に Lambda 関数の実装を行いましょう。
$ mkdir lambda && touch lambda/handler.ts
ワークショップと同様に簡単なメッセージを返す function を作成します。
$ npm install -D @types/aws-lambda
import { Handler } from 'aws-lambda'; export const main: Handler = async () => { return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
Modifying cdk.json file
cdk.json
ファイルを以下のように修正します。
{ "app": "npx ts-node --prefer-ts-exts bin/cdk-ts-lambda-canary-deploy.ts", : "context": { : "prefix": "cdk-workshop-stack", "qa": { "region": "ap-northeast-1", "lambda": { "name": "cdk-workshop-function-qa", "alias": "live", "stage": "qa" }, "tags": { "App":"cdk-workshop", "Environment": "QA", "IaC": "CDK" } }, "prod": { } } }
Modifying cdk-ts-lambda-canary-deploy.ts file
エントリーポイントの bin/cdk-ts-lambda-canary-deploy.ts
ファイルを修正します。
#!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import { CdkTsLambdaCanaryDeployStack } from '../lib/cdk-ts-lambda-canary-deploy-stack'; const app = new cdk.App(); const environmentType = app.node.tryGetContext('environmentType'); const environmentContext = app.node.tryGetContext(environmentType); const region = environmentContext['region']; const account = app.node.tryGetContext('account'); const stackName = `${app.node.tryGetContext("prefix")}-${environmentType}` new CdkTsLambdaCanaryDeployStack(app, stackName, { env: { account, region, } });
上記の定義により、environmentType=qa
の context が指定された場合は以下のプロパティが渡されます。
"region": "ap-northeast-1", "lambda": { "name": "cdk-workshop-function-qa", "alias": "live", "stage": "qa" }, "tags": { "App":"cdk-workshop", "Environment": "QA", "IaC": "CDK" }
Deploy the app
Running cdk bootstrap command
スタック以外に Lambda 関数など外部ファイルを含んでおり、CDK はこれらを S3 にアップロードしますが、そのS3 バケットを作成します。 リージョンごとに必要となります!
$ cdk bootstrap aws://AWS_ACCOUNT/REGION
Running cdk deploy command
$ cdk deploy -c environmentType=qa
Lambda からレスポンスが返ってくることを確認できました↓
$ curl https://2uxvuqmdf4.execute-api.ap-northeast-1.amazonaws.com/qa/ {"message":"hello world"}%
次に Lambda のメッセージを変更して、カナリアデプロイを試してみます!
lambda/handler.ts
ファイルを少し書き換えてみます。
import { Handler } from 'aws-lambda'; export const main: Handler = async () => { return { statusCode: 200, body: JSON.stringify({ message: 'hello world ver2', -> ここを変更 }), }; };
再度デプロイ!
$ cdk deploy -c environmentType=qa
AWS コンソールから確認して、トラフィックの10%が新しいバージョンに割り当てられてることが確認できます。
実際にリクエストを送ってみると、新しいバージョンにもリクエストが送られていることが確認できました!
$ for i in {1..10}; do curl -w '\n' https://2uxvuqmdf4.execute-api.ap-northeast-1.amazonaws.com/qa/; done {"message":"hello world"} {"message":"hello world"} {"message":"hello world"} {"message":"hello world ver2"} {"message":"hello world"} {"message":"hello world"} {"message":"hello world"} {"message":"hello world"} {"message":"hello world"} {"message":"hello world"}
5分後・・デプロイが完了!
再度リクエストを送ってみると、今後は全てのリクエストが新しいバージョンに送られていることが確認できたのでカナリアデプロイがうまくいってそうです🎉
$ for i in {1..10}; do curl -w '\n' https://2uxvuqmdf4.execute-api.ap-northeast-1.amazonaws.com/qa/; done {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"} {"message":"hello world ver2"}
Cleanup
$ cdk destroy -c environmentType=qa Are you sure you want to delete: cdk-workshop-stack-qa (y/n)? y cdk-workshop-stack-qa: destroying... ✅ cdk-workshop-stack-qa: destroyed
最後に
上記のワークショップで実装したコードは github にも載せているのでよければ参考にしてください!
AWS workshops のサイトは他にもいろいろなワークショップが公開されていたので、試してみたいと思います!
aws-valutを使ってsam deployしたい!
セキュリティーの観点からAWSアクセスキー・シークレットキーの平文保存をやめて aws-vault を使っている方も多いのではないでしょうか?
aws-vault は AWS CLI や Serverless Framework, SAM などで利用できます。
今回、aws-vault を使って sam deploy した際につまづいたのでメモとして残しておきます。
sam deploy で何が起きたのか?
サンプルのアプリケーションを作り、いざデプロイ!
$ aws-vault exec dev -- sam deploy
むむ!エラーが出ました・・
CloudFormation events from stack operations (refresh every 0.5 seconds) ------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason ------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_FAILED AWS::IAM::Role HelloWorldFunctionRole The security token included in the request is invalid (Service: AmazonIdentityManagement; Status Code: 403; Error Code: InvalidClientTokenId; Request ID: e3901e5a-9d31-4cff-93d3-5b8 ed8ecfcaa; Proxy: null) ROLLBACK_IN_PROGRESS AWS::CloudFormation::Stack sam-app The following resource(s) failed to create: [HelloWorldFunctionRole]. Rollback requested by user. DELETE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - ROLLBACK_COMPLETE AWS::CloudFormation::Stack sam-app - ------------------------------------------------------------------------------------------------------------------------------------- Error: Failed to create/update the stack: sam-app, Waiter StackCreateComplete failed: Waiter encountered a terminal failure state: For expression "Stacks[].StackStatus" we matched expected path: "ROLLBACK_COMPLETE" at least once
エラーの内容は、Lambda にアタッチする IAM Role が作成できなかったようです。
何が原因だったか
aws-vault は AWS STS で発行された一時的な認証情報を使って、AWS リソースへアクセスします。
このとき GetSessionToken
の API リクエストで一時認証が発行されます。
この GetSessionToken
に IAM に関する制約があるようで、公式のドキュメントにも以下ように記載がありました。
Cannot call IAM API operations unless MFA information is included with the request.
リクエストにMFA情報が含まれていないと、IAM API オペレーションは呼び出せません
なるほど!
MFA を設定してリトライ!
原因がわかったところで、config ファイルを修正して・・
[profile dev] region=ap-northeast-1 mfa_serial=arn:aws:iam::<AWS Account ID>:mfa/<IAM User>
再度 deploy!
CloudFormation events from stack operations (refresh every 0.5 seconds) ------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason ------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPer - missionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc - 2d5f9d CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPer Resource creation Initiated missionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc Resource creation Initiated 2d5f9d CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc - 2d5f9d CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPer - missionProd CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - -------------------------------------------------------------------------------------------------------------------------------------
今度は無事にデプロイできたようです🎉
最後に
この STS GetSessionToken
の制約は SAM だけではなく、AWS CLI や Serverless Framework でも共通です。
aws-valut を使う際は MFA の設定をしておくことをおすすめします!
Postmanを利用してCookieをキャプチャする
APIテストを実施する際に便利な Postman ですが、テスト実行時に毎回 Cookie 情報をセットするのは面倒です・・。 そこで今回は Cookie 情報を持たせた状態でテストする方法(macOS)について書いていきます。
前提条件として、Postman のバージョンは 7.2 以降であることを確認してください。 Postman をダウンロードしていない方はこちら。
事前準備
Postman Interceptor Extension をインストールする
以下のリンクより、Postman Interceptor Extension をインストールします。 chrome.google.com
インストールするだけでOK!インストール後の設定は不要です!
Interceptor Bridge をインストールする
Interceptor Bridge をダウンロードします。
※リンクをクリックするとダウンロードが開始されます
https://go.pstmn.io/interceptor-bridge-macos
ダウンロードした zip ファイルを解凍すると、[install_host] というファイルがあるので、こちらを実行します。
$ cd InterceptorBridge_MacOS_1.0.0 $ ./install_host Native messaging host com.postman.postmanapp for 'Postman Native App < > Interceptor integration' has been installed.
事前準備は以上で終わりです!
Postman で Cookie をキャプチャする設定
画面右上の衛星マークをクリックします。
[Capture Cookies] を [ON] にして、[INTERCEPTOR CONNECTED] となればOKです!
Cookie情報を持たせた状態で API テストを実行する
API を実行するとHeader に Cookie がセットされているのがわかります。
以前までは Chrome 拡張機能の Postman でしか利用できない機能でしたが、ネイティブアプリでも利用できるようになりました! 設定も簡単なので、Postman で Cookie を利用する場合には非常に便利な機能ですね。
7/25 Slack Dev Meetup Tokyo #1 に参加してきました!
Slack API のデベロッパーコミュニティが立ち上がり、今回は記念すべき第 1 回目の開催ということで行ってきました!
めちゃくちゃおしゃれ〜
今回のテーマは「App ディレクトリにアプリを公開しよう」ということで4人の方が登壇していました!
Bolt⚡〜最も簡単な Slack アプリフレームワーク〜:瀬良 和弘さん(@seratch_ja)
Slack Japan 初のパートナーエンジニアとして活躍されている瀬良さんからは、今年 4 月末にリリースされた Slack アプリの作成をサポートするフレームワーク「Bolt」についてお話してくれました。
- Bolt は TypeScript で作られているフレームワーク
- とりあえず動かしたい場合は Heroku でやる方が簡単
- Lambda を使ってやるなら Serverless FW を使うのが良い
- Slack は 3 秒以内に応答しないとタイムアウトになってしまうので注意!
- 3秒以内にレスポンスを返すために・・
・メインの処理は別の Lambda を用意する
・StepFunction を使う
瀬良さんが作ったサンプルアプリがこちらです↓ qiita.com
失敗しない Slack アプリの作り方~高 UX 実現のためのBlock kit の使いどころ~:田辺 晋一さん
NAVITIME さんで初めての Slack アプリを作った話をしてくれた田辺さん。
- NAVITIME が Slack アプリを作成した理由
・ビジネスパーソンの移動簡略化
・ビジネスコミュニケーションコストの削減
・全世界での移動をサポート - ユーザーの入力した文章を AI で自然言語解析(LUIS)
- 要件として、ユーザーが使い慣れた UI を Slack でも実現する必要があった → Block Kit を使ってアプリと変わらない視認性を実現!
- Block Kit Builder でデザイン設計していくと良い
Block Kit api.slack.com
Block Kit Builder
https://api.slack.com/tools/block-kit-builder
田辺さんの資料はこちらです↓
www.slideshare.net質疑応答では、「現在位置を取得して乗り換え検索はできないのか?」という質問がありましたが、「Slack では現在位置を取れる機能はまだない」とのことでした。
Slack App を App Directory に公開するまで:合谷 拓樹さん
合谷さんからは、カオナビで行なっている全社アンケートや評価などを Slack で行えるようにした話をしてくださいました。
- Slack アプリを作成した理由は、メール通知しても担当者がメールを見ないという要望から
- Slack は今やただのチャットではなく、出退勤も経費精算など人事労務の業務を効率化できる
- 2週間くらいかかると言われた App Directory の申請は半日で通った!(でも余裕を持ったスケジュールにしておいた方がいい)
- 企画時よりも1.3倍の工数がかかった
Slack をチャットからワークスペースに替える活用方法+(多分世界最速) AWS Chatbot のデモ:吉田 真吾さん(@yoshidashingo)
なんとイベント当日に発表された AWS Chatbot の最速レポートをしてくれた吉田さん。
- AWS Chatbot は DevOps のために必要なアラートを「通知」する Bot を簡単に組み込めるサービス(現在はまだβ版)
- CloudWatch のアラームの通知ではグラフのキャプチャも Slack に送られる!
- サポート対象外の AWS サービスから SNS 通知は Slack に送信されない
- 自動作成される IAM では権限が足りないので追加する必要がある
番外編
以前下記のブログを書いた際・・ coxcox.hatenablog.com
Google Apps Script から Slack API を実行した時、 1️⃣の絵文字がなぜか「:1:」だとうまく表示されず「:one:」だと表示されるということがあり、瀬良さんに質問してみました!
瀬良さんからは以下のような回答をもらいました。
あくまで検索のときには「1」でマッチしているだけに見えますね。一応、リアクション絵文字でも「1」をつけようとしてみたけど、API は invaid_name というエラー応答になりますね。絵文字の名前としては「one」だけが正しいのではないかと。
ということで、Slack API を実行する時は、絵文字の名前を指定するようにしましょう〜!
Block Kit を利用することで、Slack 上のボタンをクリックするとダイアログが表示されたりとかなり複雑な UI を表現できるのが驚きでした!
仕事ではメールよりも Slack を使う機会が増えてきているので、自分でも Bolt を使って便利な Slack アプリを作ってみたいと思います!
Laravelでmigrate 実行時、"default character set utf8mb4 collate 'utf8mb4_unicode_ci'" エラーが発生した場合の対処法
Laravelでカラム名を変更しようとして、php artisan migrate
を実行したときに下記のようなエラーが出ました・・
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') default character set utf8mb4 collate 'utf8mb4_unicode_ci'' at line 1 (SQL: create table `magazines` () default character set utf8mb4 collate 'utf8mb4_unicode_ci')
抜粋すると・・
You have an error in your SQL syntax
') default character set utf8mb4 collate 'utf8mb4_unicode_ci''
なにやらSQLの構文が間違っている・照合順序がおかしいと言われているような感じだったので、
マイグレーションファイルに$table->collation('utf8_unicode_ci')
を追加してみるも上手くいかず・・
マイグレーションファイルを再度確認・・
Schema::create('magazines', function($table)
{
$table->renameColumn('title', 'magazine_title');
});
ん?何かがおかしい。気づきましたか?
そうです、Schema::create
になっていました・・。
Schema::createでrenameColumnメソッドを実行したのでエラーとなったようです。
正しくはSchema::table
です。
Schema::table('magazines', function($table)
{
$table->renameColumn('title', 'magazine_title');
});
これで問題なく動くようになりました!
それにしてもエラー内容から推測しづらいですね^^;
ということで、まずはマイグレーションファイルの中身を疑った方が良さそうだということがわかりました!
Laravelのコード補完が効かない問題を「laravel-ide-helper」で解決!
Laravelを使って開発を行っていたところ、コード補完が効かず、Undefined class
となって困りました。
同僚からlaravel-ide-helper
を入れるといいよ!と言われたので、早速導入してみました!
github.com
導入手順
composer で laravel-ide-helper をインストールする
composer.json
にbarryvdh/laravel-ide-helper
を追加します。
"require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", "laravel/tinker": "^1.0", "barryvdh/laravel-ide-helper": "^2.6.2" ★追加 ※2019/07/02時点のバージョンです },
composer.json に必要なパッケージを書いてcomposer update
をすると composer.json をもとに各パッケージを追加することができます。
$ composer update Loading composer repositories with package information Updating dependencies (including require-dev) : - Installing barryvdh/laravel-ide-helper (v2.6.2): Downloading (100%) : Package manifest generated successfully.
サービスプロバイダーに追加する
config/app.php
のproviders
にIdeHelperServiceProvider
を追加します。
'providers' => [
:
/*
* Package Service Providers...
*/
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, ★追加
:
]
Laravel 5.5 からは追加不要です!
サービスプロバイダーとは?
Laravelのライフサイクルでは、ビジネスロジックが実行される前にサービスプロバイダーのクラスが呼ばれます。 サービスプロバイダはサービス(機能)ごとに初期処理を行なう目的で用意されています。
ヘルパーファイルを作成する
artisan
コマンドでヘルパーファイルを作成します。
$ php artisan ide-helper:generate A new helper file was written to _ide_helper.php
ヘルパーファイルとは?
どこからでも呼べる汎用的な関数郡をもつファイルのこと。
Laravelでも多くのヘルパー関数が用意されています。 readouble.com
これでクラスが認識され、コード補完もできるようになりました!
ひと通りの補完はこれで効くようになったかと思いますが、Modelの補完も効くようにするにはphp artisan ide-helper:models
をやればOKのようです!
Laravelを使う際には初期設定には入れたいですね!
「第139回 PHP勉強会@東京」の参加レポート!
6/26(水)に行われたPHP勉強会@東京に初参加し、LTもしてきましたのでそのレポートです。
PHP勉強会とは?
PHP勉強会@東京はPHPで開発を行うエンジニアを対象とした勉強会です。
勉強会は月に1回のペースで行われています。
まずは自己紹介からスタート!
PHP勉強会では乾杯の後に自己紹介をするのが恒例になっているそう。
今日の自己紹介では「ソフトウェア開発手法(スクラム・モブプロ)の思い出」をテーマに話しました!
スクラム・モブプロをやったことがあるという人は半分よりちょっと少ないかなという印象でした。
また、PHP歴は2ヶ月〜20年と幅広い経験者の方が参加していました。
メイン発表
KubernetesでPHPを動かした話:Takahiro Fujitaさん
ゲームサーバの負荷試験の際、k8s上でPHPを動かしたところ、なんか遅いなーと思ったらApacheのパラメータ調整に問題が見つかった話をしてくださった、Takahiro Fujitaさん。
- Apacheのパラメータ調整は、今までインフラチームが担当していたがコンテナを導入したことで、アプリチームの担当範囲が変化。必要な知識はchefから拾っていった
- CPU100%の張り付き状態になってしまい、その原因はkube-systemのDNSの仕事が多かったため
- この問題はホストごとにDNSキャッシュをつけることで解決!(k8sのサイドカー方式を採用)
担当範囲が変わっていったということで、だんだんとインフラとアプリの境目がなくなっているんだなあと実感。 開発環境もk8sで構築していたということで、負荷試験で気づいたそう・・。負荷試験大事ですね。
スクラム開発の話:新倉 涼太さん
新倉 涼太さんからは、スクラムを導入した話から実践、成果までお話。
- 1人でプロダクトを成長させるのは無理なので、しっかりとしたチーム開発をやろう!ということになりスクラムを導入
- プランニングでは1人1日3P消化できるというのを基準にしている
- 振り返りではKPTではなく、YWK(やったこと・わかったこと・これからやること)というオリジナルの手法を取り入れている
- スクラムマスターは「イベントの挿入」「振り返りのデータ収集」「物品の購入」まで何でもやる!また、開発メンバーのモチベーションを維持するためにやってることの意味を伝え続ける必要がある
弊社でもスクラムを取り入れていますが、やはり色々試行錯誤しながらオリジナルのやり方でやってるんだなと思いました。正解はないので、これからも模索しながらいい開発手法を見つけていきたいです。
LT
FuelPHPのテストをjenkinsとdocker-composeで実行:Higuchi Masahiroさん
PHPのフレームワークの一つであるFuel PHPですが、最近バージョンアップの話を聞かないのでgolangに移行したらJenkinsでハマった話をしてくださったのは、Higuchi Masahiroさん。
- テストの実装が完了してマージしたらテストが失敗・・原因は、Jenkins SlaveではEC2にPHPをインストールして実行していたので、golangコンテナが無いため接続に失敗
- docker-composeをJenkins Slaveに立てることで解決!・・が、「git tokenの渡し方」「コンテナの立て方」「コンテナの更新」につまづいた・・
- 今後はPHPをコンテナ化したい!
やはり移行するときは色々な問題が出てきますね。樋口さんがお話してくださったように1つ1つ課題をクリアしていくことが大事だなと思いました!
PHPMailer 5.2.2-rc2 からのメール:さっぴー川原さん
さっぴー川原さんからは、PHP Maierを使ったフィッシングメールが飛んできた話。
- PHP MailerはPHP用のメール送信ライブラリ
- フィッシングメールが飛んできたPHP Mailerのバージョンは5.2.2・・このバージョンは脆弱性がある!
- セキュリティ対策はちゃんとやりましょう!
メールのソースは見たことなかったです!置き忘れPHP Mailerには気をつけないとですね。
Laravelで作るSign in with Apple:yu-jiさん
LaravelでSign in with Appleの機能を実装してみた話をしてくださったのはyu-jiさん。
- Sign in with Appleは安全性に重きをおいたシングルサインオンの仕組み
- Laravel Socialiteという外部認証/認可のパッケージを使って実装
- 使うにはApple Developer Portalの準備が必要
Signin with Appleは最近発表されたばかりのようで、これから目にする機会が増えていきそうです!
もう変数名・関数名で悩まなくて大丈夫!PhpStormで使えるネーミング生成ツール:私
私からは以前ブログでも紹介させてもらった「codic」というネーミング生成ツールについて紹介させてもらいました!
会場では10名くらい知っている人がいました。
codicは知っていてもPhpstormと連携できることは知らなかった!という声もありよかったです!
ブログはこちら↓ coxcox.hatenablog.com
モブプログラミングはいいぞ:杉山 祐一さん
杉山 祐一さんからは、以前はタスクを並列で行っていてレビュー合戦になったのでモブプロに移行した話をしてくださいました。
- 人間がマルチタスクが苦手なようにチームもマルチタスクが苦手
- モブプロのよかったことは「認識のずれがなくなったこと」「スイッチングコストが少なくなったこと」
- QAともモブプロ!テスト設計時ではなく、実装時に仕様の認識合わせができる
- モブプロで辛いことは「疲れる」「辛いタスクは辛さが2倍になる」
私のチームでもモブプロをやっているのでうなづける内容が多かったです。QAとのモブプロはやったことがなかったので取り入れてみたいです!
今回初めてPHP勉強会に参加しましたが、自己紹介や勉強会中に懇親会を挟むなど、会話が多く生まれる工夫もされていたことで場が温まり発表しやすかったです。
PHPだけではなく、スクラムやモブプロなど開発手法について話されているかたもいて共感できる内容が多く楽しかったです!