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 CDK (TypeScript)を触ってみたい
  • Lambda カナリアデプロイを試してみたい

AWS Workshops」とは

AWSおよびAWSパートナーによって作成されたワークショップで、実践的なスキルやテクニックを紹介しており、現在100ものコンテンツが公開されています。

workshops.aws

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

create-the-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

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-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

deploy-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 にも載せているのでよければ参考にしてください!

github.com

AWS workshops のサイトは他にもいろいろなワークショップが公開されていたので、試してみたいと思います!

aws-valutを使ってsam deployしたい!

セキュリティーの観点からAWSアクセスキー・シークレットキーの平文保存をやめて aws-vault を使っている方も多いのではないでしょうか?

github.com

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 リソースへアクセスします。

このとき GetSessionTokenAPI リクエストで一時認証が発行されます。

この GetSessionToken に IAM に関する制約があるようで、公式のドキュメントにも以下ように記載がありました。

docs.aws.amazon.com

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 をダウンロードしていない方はこちら。

www.postman.com

事前準備

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 をキャプチャする設定

画面右上の衛星マークをクリックします。 f:id:aym413:20200308144253p:plain

[Capture Cookies] を [ON] にして、[INTERCEPTOR CONNECTED] となればOKです! f:id:aym413:20200308143925p:plain:w300

Cookie情報を持たせた状態で API テストを実行する

API を実行するとHeader に Cookie がセットされているのがわかります。

f:id:aym413:20200308145217p:plain


以前までは Chrome 拡張機能の Postman でしか利用できない機能でしたが、ネイティブアプリでも利用できるようになりました! 設定も簡単なので、Postman で Cookie を利用する場合には非常に便利な機能ですね。

7/25 Slack Dev Meetup Tokyo #1 に参加してきました!

Slack APIデベロッパーコミュニティが立ち上がり、今回は記念すべき第 1 回目の開催ということで行ってきました!

slack-dev-jp.connpass.com

場所はナビタイムさんのオフィス!

めちゃくちゃおしゃれ〜

今回のテーマは「App ディレクトリにアプリを公開しよう」ということで4人の方が登壇していました!

Bolt⚡〜最も簡単な Slack アプリフレームワーク〜:瀬良 和弘さん(@seratch_ja

Slack Japan 初のパートナーエンジニアとして活躍されている瀬良さんからは、今年 4 月末にリリースされた Slack アプリの作成をサポートするフレームワーク「Bolt」についてお話してくれました。

  • Bolt は TypeScript で作られているフレームワーク
  • とりあえず動かしたい場合は Heroku でやる方が簡単
  • Lambda を使ってやるなら Serverless FW を使うのが良い
  • Slack は 3 秒以内に応答しないとタイムアウトになってしまうので注意!
  • 3秒以内にレスポンスを返すために・・
    ・メインの処理は別の Lambda を用意する
    ・StepFunction を使う

slack.dev

瀬良さんが作ったサンプルアプリがこちらです↓ 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となって困りました。
f:id:aym413:20190702125517j:plain

同僚からlaravel-ide-helperを入れるといいよ!と言われたので、早速導入してみました!
github.com

導入手順

composer で laravel-ide-helper をインストールする

composer.jsonbarryvdh/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.phpprovidersIdeHelperServiceProviderを追加します。

'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


これでクラスが認識され、コード補完もできるようになりました! f:id:aym413:20190702133903p:plain


ひと通りの補完はこれで効くようになったかと思いますが、Modelの補完も効くようにするにはphp artisan ide-helper:modelsをやればOKのようです!
Laravelを使う際には初期設定には入れたいですね!

「第139回 PHP勉強会@東京」の参加レポート!

6/26(水)に行われたPHP勉強会@東京に初参加し、LTもしてきましたのでそのレポートです。

PHP勉強会とは?

PHP勉強会@東京はPHPで開発を行うエンジニアを対象とした勉強会です。
勉強会は月に1回のペースで行われています。

phpstudy.doorkeeper.jp

まずは自己紹介からスタート!

PHP勉強会では乾杯の後に自己紹介をするのが恒例になっているそう。
今日の自己紹介では「ソフトウェア開発手法(スクラム・モブプロ)の思い出」をテーマに話しました!

スクラム・モブプロをやったことがあるという人は半分よりちょっと少ないかなという印象でした。
また、PHP歴は2ヶ月〜20年と幅広い経験者の方が参加していました。

メイン発表

KubernetesPHPを動かした話: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さん。

Signin with Appleは最近発表されたばかりのようで、これから目にする機会が増えていきそうです!

もう変数名・関数名で悩まなくて大丈夫!PhpStormで使えるネーミング生成ツール:私

私からは以前ブログでも紹介させてもらった「codic」というネーミング生成ツールについて紹介させてもらいました!
会場では10名くらい知っている人がいました。
codicは知っていてもPhpstormと連携できることは知らなかった!という声もありよかったです!

ブログはこちら↓ coxcox.hatenablog.com

モブプログラミングはいいぞ:杉山 祐一さん

杉山 祐一さんからは、以前はタスクを並列で行っていてレビュー合戦になったのでモブプロに移行した話をしてくださいました。

  • 人間がマルチタスクが苦手なようにチームもマルチタスクが苦手
  • モブプロのよかったことは「認識のずれがなくなったこと」「スイッチングコストが少なくなったこと」
  • QAともモブプロ!テスト設計時ではなく、実装時に仕様の認識合わせができる
  • モブプロで辛いことは「疲れる」「辛いタスクは辛さが2倍になる」

私のチームでもモブプロをやっているのでうなづける内容が多かったです。QAとのモブプロはやったことがなかったので取り入れてみたいです!


今回初めてPHP勉強会に参加しましたが、自己紹介や勉強会中に懇親会を挟むなど、会話が多く生まれる工夫もされていたことで場が温まり発表しやすかったです。
PHPだけではなく、スクラムやモブプロなど開発手法について話されているかたもいて共感できる内容が多く楽しかったです!