AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

カテゴリー: PHP

AWS ElasticSearch Service の認証にIAM Roleを使う [PHP編]


こんにちは、井上です。

AWS ElasticSearch Serviceを使ってみました。
ElasticSearchはVPC外に置かれるとのことで、アクセス管理はどうするんだろうと思っていたら、AccessPolicyにて何かしら制限しないといけないようです。(VPC内に置いて欲しいなぁ…)

制限方法としては、

  • IPアドレスによる制限
  • アカウントIDによる制限
  • IAM Roleによる制限

などができるようです。

試しに、IAM Roleで制限をかけたEndpointにcurlでアクセスするとエラーがでることは確認できました。

ではどうやって認証を通るようにするかを探していてたどり着いたページ、
Amazon Elasticsearch ServiceのIAM Roleによるアクセス制御 | Developers.IO を見ると、

と、書かれていてメンドクサそうだな、と思ったのですが、下記にライブラリと共存させるやり方が書いてありました。

Signing an Amazon Elasticsearch Service Search Request — AWS SDK for PHP documentation

ElasticsearchのClientBuilderのHandler を定義することで、リクエスト署名を挿入してリクエストを送ることが出来るようです。

これを es_aws_test.php というファイル名で保存します。

inoue_test というインデックスが作られていることが確認できました。
この一連の手続きは結構長いので、この部分は Clientを生成する共通処理として作っておくとよさそうです。

あと、Node.js で Lambdaから ElasticSearch を更新するサンプルが awslabs に上がっていました。

amazon-elasticsearch-lambda-samples/s3_lambda_es.js at master · awslabs/amazon-elasticsearch-lambda-samples

実際に社内でも、Lambda からElasticSearchを更新する処理は稼働中とのことでした。早い!

Lambdaと同様に、ElasticSearch もVPC対応、期待しています。

[2016/01/28 追記]
アイキャッチ画像がクラスメソッドさん作成の画像との指摘を受け変更いたしました。ご迷惑をおかけしました。


PHPカンファレンス福岡 2015 参加レポート


1週遅れになってしまいましたが、PHPカンファレンス福岡 2015に参加してきたので、レポートしたいと思います。

東京でのPHPカンファレンスは2000年より14回開催されていて、大阪でも5回開催されているのですが、今までは福岡での開催はありませんでした。
そんな中、ひとつのつぶやきを契機に盛り上がり、あれよあれよといううちに開催までこぎつけたのが今回の福岡初のPHPカンファレンスになります。

経緯とかは下記のtogetterにまとまっています。
PHPカンファレンス福岡が開催!? #fukuokaphp

そんなやりとりを見ていて、開催されたらぜひ参加したいなーと思っていたので、参加できて光栄でした。

会場は、祇園駅から徒歩1分とアクセスの良い、FFB HALL。

受付

01_junbi_03

01_junbi_02

赤いレスラーのようなマスコットが特徴的で、サイトもかっこ良かった!

今回は、聞きたいセッションがたくさんあったのですが、どうしても聞きたいセッションに絞って、それ以外は『Cakephpで学ぶ継続的インテグレーションハンズオン』をやっておりました。

続きを読む PHPカンファレンス福岡 2015 参加レポート


PHPカンファレンス2015関西に参加してきました。


qmailなどの作者の djb がまだ43歳だったということに衝撃を受けている井上です。

先日行われた、PHPカンファレンス2015関西に参加して来たので、その感想などを書いてみたいと思います。

IMG_5307

まず感じたのが、PHPの時期メジャーバージョンである PHP 7がとても期待できるということ。

基調講演の『PHP 7で変わること 言語仕様とエンジンの改善ポイント』
を聞いて、若干の遅れはありつつも、リリースに向けた作業は順調に進んでいるということ、また圧倒的なパフォーマンス改善ぶりに、早く使ってみたいと思える内容でした。
速度的には、Facebookが開発した別の処理系であるHHVMとほぼ互角であるとのことです。

改修の内容を見ても、今回のパフォーマンス改善だけではなく、今後、言語の構文の改善がしやすいような足場づくりもきっちり進められており、7の次のバージョンに向けても期待が持てるように感じました。

他のセッションでは、テスト、継続的インテグレーションや、スクラム開発などまだまだハンズラボとして取り入れられていない部分について刺激を受けました。
ひとっ飛びに発表されているような開発体制にはできないと思いますが、できることから1つずつ取り入れて行きたいと思います。

また、今回『PHP x AWSでスケーラブルなシステムをつくろう』という内容で発表を行いました。
サービスを成長させていく中で問題が起きがちなポイントと、AWSを使った解決方法についてストーリー仕立てでお話させて頂きました。

他社で当然のようにやっていることが、自社では出来ていなかったり、自社でできていることが、他社ではまだまだできていなかったりと、コミュニティで交流すると情報交換できてとても良かったです。

IMG_5316

懇親会もとても盛り上がりました。スタッフの方お疲れ様でした!

IMG_5315

なお、ハンズラボでは、PHPの他に Node.jsにも力を入れていこうと思っています。
もしAWSやNode.jsの開発もやってみたい、という方はぜひこちらから応募ください!!

AWSのフルマネージドで、アプリ構築するエンジニアWanted!


DynamoDB PHP SDKのMarshalerクラスを使った時にはでかい数値に気をつける


下記のblogで紹介されているように、AWS PHP SDKの 2.7.7 から PHPの型とjsonとDynamoDBの型の相互変換を行うクラス、Marshaler が追加されています。

DynamoDB JSON and Array Marshaling for PHP

この Marshaler クラスを使うと、型変換が行われるため、数値型に大きな値を入れている場合に注意が必要です。

以下に例を示します。

id = 1 のレコードに number = 9223372036854775808 という値が入っているレコードを取り出してみます。

結果

9223372036854775808 という値が取り出せました。

これを Marshaler でPHPの型に戻してみます。
使用するメソッドは、unmarshalItem です。

結果

9.2233720368548E+18 になってしまいました。/(^o^)\ ナンテコッタイ

原因

PHPでの整数の最大値はPHP_INT_MAXで定められており、9223372036854775807 になっています。(64bitの場合)
それを超えた数字を整数に変換しようとすると、指数表記になってしまいます。

参考:PHP>マニュアル>言語リファレンス>型>整数

一方、DynamoDBの方は、下記ドキュメントにて、最大 38 桁の精度とあるように、 99999999999999999999999999999999999999 まで投入できます。

参考:DynamoDB データモデル

この辺りの相互変換は、言語側の精度に依存する形になると思うので、使っている言語側の仕様を確認しておいた方がよさそうです。
たしか、rubyの場合には BigDecimal に変換されたと思います。

参考


【PHP】つらい配列操作と距離を置けるLINQライクなライブラリ、Ginqを使ってみた


配列のつらさ

PHPで、以下の様な配列の詰め直しのようなコード書いたりしてると、
クラシック過ぎてあー……という気持ちになります。

例えばPythonだと、リスト内包表記というのがあり、こういう処理がもうちょっと格好良く書けます。
上記の例より単純な算数っぽい例で以下に記します。

C#など.NET Framework環境だと、LINQというさらに格好良い構文があります。
LINQが良いのは記法だけじゃないので、ちょっと本質から外れますが。
MacやLinux系 環境でも、Monoをインストールしていれば、csharpコマンドでC#のREPLが起動して、簡単に試せます。

ずるい!!

というわけで、PHPで配列(及びIteratorが実装されているオブジェクト)を格好良く処理できる以下のライブラリを使ってみました。
akanehara/ginq · GitHub

Ginqのインストール

ReadMe にあるとおり、各自のComposerでライブラリが管理されているPHP実行環境にて、
composer.jsonに以下の記述を追加し、

以下でインストールできます。

Ginqを使ったコード例

この記事の冒頭のPHPでの処理は、Ginqを使って以下の等価な処理に書き換えられます。
ついでにSplFileObject を使ってファイル操作をしてみます。

(->がエスケープされて読みづらい……)
制御構文が減った分、だいぶ印象が違います。
LINQと一緒か?と問われると、無名関数をゴリゴリ書いている分記述量が多いですが、
O/Rマッパー位のノリで配列処理が出来ました。
このくらいの処理だと、foreach でもいいじゃん感があるのは否めませんがw

一応、上記のselectとmapの様なことは、array_filter(), array_map() を作用させても得られるのですが、

array_filter() で抽出した配列の返り値をそのままarray_map() に作用させると、好みの問題ですが、なかなか渋い感じです。
さらに、
array_map() : 第1引数が無名関数で第2引数が配列
array_filter() : 第1引数が配列で第2引数が無名関数
と地味にインターフェースが異なっているのが個人的にはうざいです。
これ以上作用させたらだいぶだるい感じがします。

まとめ

他にもjoin,zip,take,takeWhile,memoize などのメソッドがあるので、色々試してみます。
細かなドキュメントはありませんが、挙動は test/GinqTest.php にあるテストを読めば分かりそうです。
データ構造が配列くらいしかない分(SPLをまともに使ってる人いますか?) 、
PHPは配列と仲良くすることから避けられないので、配列操作のつらさを軽減していきたいですね。
便利な構文が言語仕様に入っていってくれるといいですねー。