KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

Atomでphpmd+Atom-beautify(php-cs-fixer)の静的解析とコード整形を簡単実行

ソース開発の最後に必ずあるソースレビュー。ソースレビューの時はできる限り処理が正しいか、性能はでるかなど本質的なレビューをしたい。使用していない変数とか、ネスト深すぎるとか、インデントが、、、とかどうでもいいコメントはできる限りしたくない!レビュー項目に残すのも嫌だし、直ったら確認するもの嫌!
そういう方にオススメしたいプラグインが、phpmdAtom-beautify(php-cs-fixer)です。
というわけでAtomで簡単にPHPの静的解析とコード整形を実行できるパッケージのインストール手順を紹介します。

目次

Atomにphpmd+php-cs-fixer+Atom-beautifyをインストールする

前提条件

コマンドプロンプトよりパッケージをインストールする

コマンドプロンプトよりphpmdをインストールをする。

C:\Users\user>composer global require phpmd/phpmd=*
Changed current directory to C:/Users/<ユーザ名>/AppData/Roaming/Composer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/filesystem (v3.1.2)
    Downloading: 100%

  - Installing symfony/dependency-injection (v3.1.2)
    Downloading: 100%

  - Installing symfony/config (v3.1.2)
    Downloading: 100%

  - Installing pdepend/pdepend (2.2.4)
    Downloading: 100%

  - Installing phpmd/phpmd (2.4.3)
    Downloading: 100%


コマンドプロンプトよりphp-cs-fixerをインストールをする。

C:\Users\user>>composer global require friendsofphp/php-cs-fixer
Changed current directory to C:/Users/morik/AppData/Roaming/Composer
Using version ^1.11 for friendsofphp/php-cs-fixer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing sebastian/diff (1.4.1)
    Loading from cache

  - Installing symfony/stopwatch (v3.1.3)
    Loading from cache

  - Installing symfony/process (v3.1.3)
    Loading from cache

  - Installing symfony/finder (v3.1.3)
    Loading from cache

  - Installing symfony/event-dispatcher (v3.1.3)
    Loading from cache

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Loading from cache

  - Installing symfony/console (v3.1.3)
    Loading from cache

  - Installing friendsofphp/php-cs-fixer (v1.11.6)
    Downloading: 100%

symfony/event-dispatcher suggests installing symfony/http-kernel ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files


・phpmd,php-cs-fixerのバージョンを確認する。

C:\Users\user>phpmd --version
PHPMD 2.4.3

C:\Users\user>php-cs-fixer --version
PHP CS Fixer version 1.11.6 by Fabien Potencier


atomにlinter、linter-phpmdなどをインストールする。
パッケージ名が分かっているのでコマンドプロンプトからインストールするのが楽です。

C:\Users\user>apm install linter
Installing linter to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install linter-phpmd
Installing linter-phpmd to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install php-cs-fixer
Installing php-cs-fixer to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install atom-beautify
Installing atom-beautify to C:\Users\<ユーザ名>\.atom\packages done

ATOMから直接インストールする場合はファイル⇒環境設定⇒インストール⇒search packagesの入力欄に以下を入力して以下4つをインストールする。
linter
linter-phpmd
php-cs-fixer
atom-beautify

パッケージの設定

上部メニューファイル⇒環境設定⇒パッケージのコミュニティパッケージにインストールしたパッケージ名が表示される。それぞれの設定より設定を行う。
・linter-phpmdの設定
PHPMD Executable Path:C:\Users\<ユーザ名>\AppData\Roaming\Composer\vendor\bin\phpmd
PHPMD Rulesets:cleancode,codesize,controversial,design,unusedcode

php-cs-fixerの設定
PHP-CS-fixer executable path:C:\Users\<ユーザ名>\AppData\Roaming\Composer\vendor\bin\php-cs-fixer

Ctrl+Sで保存するとPHP-CSPHP-MDがソースを解析してくれます。
以下画像のように該当箇所にフォーカスさせると原因が表示されます。
f:id:jainders:20160802224317j:plain

またCtrl+Alt+Bか、ソース上で右クリック「Beautify editor contents」を実行することでソースの自動整形が実施されます。

boto3でS3に接続しようとして"The bucket you are attempting to access must be addressed using the specified endpoint."エラー

目次

概要

boto3でS3に接続しようとして"The bucket you are attempting to access must be addressed using the specified endpoint."のエラーが発生。

環境情報

OS:Linux ip-172-31-28-146 4.4.11-23.53.amzn1.x86_64 #1 SMP Wed Jun 1 22:22:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

pythonPython 2.7.10

ライブラリ:boto3

事象

$ python getObjectFromS3.py

test.test.test.3
Traceback (most recent call last):
File "getObjectFromS3.py", line 13, in <module>
ContentType='text/plane'
File "/usr/local/lib/python2.7/site-packages/boto3/resources/factory.py", line 518, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 258, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 548, in _make_api_call
raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (PermanentRedirect) when calling the PutObject operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

原因

エンドポイントのデフォルトがUSリージョンのため、東京リージョンのバケットにアクセスしようとしてエラー。

対処方法

API gatewayのエンドポイントを指定する。

・ソースを修正する。
s3 = boto3.resource('s3')

s3 = boto3.resource('s3', endpoint_url='<エンドポイント>')

"botocore.exceptions.NoCredentialsError: Unable to locate credentials" 認証情報エラーの対処方法

目次

 

概要

boto3でpythonコードを記述して実行しようとしたらエラーが発生。

環境情報

OS:Linux ip-172-31-28-146 4.4.11-23.53.amzn1.x86_64 #1 SMP Wed Jun 1 22:22:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

pythonPython 2.7.10

ライブラリ:boto3

事象

getObjectFromS3.pyのソース

----------------------------
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('test.test.test.3')
print(bucket.name)

obj = bucket.Object('test.txt')
body ="Helloworld."

response = obj.put(
Body=body.encode('utf-8'),
ContentEncoding='utf-8',
ContentType='text/plane'
)
----------------------------

上記ソースを実行
$ python getObjectFromS3.py
test.test.test.3
Traceback (most recent call last):
File "getObjectFromS3.py", line 13, in <module>
ContentType='text/plane'
File "/usr/local/lib/python2.7/site-packages/boto3/resources/factory.py", line 518, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 258, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 537, in _make_api_call
operation_model, request_dict)
File "/usr/lib/python2.7/dist-packages/botocore/endpoint.py", line 117, in make_request
return self._send_request(request_dict, operation_model)
File "/usr/lib/python2.7/dist-packages/botocore/endpoint.py", line 142, in _send_request
request = self.create_request(request_dict, operation_model)
File "/usr/lib/python2.7/dist-packages/botocore/endpoint.py", line 126, in create_request
operation_name=operation_model.name)
File "/usr/lib/python2.7/dist-packages/botocore/hooks.py", line 227, in emit
return self._emit(event_name, kwargs)
File "/usr/lib/python2.7/dist-packages/botocore/hooks.py", line 210, in _emit
response = handler(**kwargs)
File "/usr/lib/python2.7/dist-packages/botocore/signers.py", line 90, in handler
return self.sign(operation_name, request)
File "/usr/lib/python2.7/dist-packages/botocore/signers.py", line 124, in sign
signer.add_auth(request=request)
File "/usr/lib/python2.7/dist-packages/botocore/auth.py", line 626, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials

原因

AWSに繋ぐための認証情報が設定されていない。

対処方法

"aws configure"コマンドを使ってAWSの認証情報を設定する。

AWSの認証情報を設定する。
$ aws configure
AWS Access Key ID [None]:<アクセスキー>
AWS Secret Access Key [None]:<シークレットキー>
Default region name [None]:<リージョン>
Default output format [None]:<json/table/textのどれか>

 

EC2でAmazonnLinuxを5分で作成

今やAWSを使えばボタンをポチポチするだけで簡単に仮想サーバが作成できてしまういい時代になりました。ちょっと前まではサーバにVMを構築して複数OSを動かしていたのに、、、OSインストールに時間がかかるため短くても初めは1~2時間くらいかかったのは遠い昔(一度作成すればVMコピーできますが)。
AWSを使えば煩雑な操作は不要!Linuxの作成は5分で完了します!本当に超カンタンです!
ちょっとLinuxサーバを立てたいとき、複数台数を一気に用意したいときなど。これからはAWSで!
一度AWSで作成方法を試したらサーバにOS入れて構築。。。なんて面倒すぎる!
ということで今回はAWSのEC2(Amazon Elastic Compute Cloud)でAmazonLinuxを作成する手順を紹介します。

EC2サービスで仮想サーバを作成する

では早速仮想サーバを作成しましょう。AWSでは仮想サーバをEC2(Amazon Elastic Compute Cloud)というサービスを用いて構築します。ということでまずはEC2を選択します。

f:id:jainders:20160707194842j:plain

 

左のメニューから[インスタンス]を選択し、上部メニューから[インスタンスの作成]ボタンを押します。これから作成するEC2はインスタンスという単位で管理されています。仮想サーバ1台=インスタンス1コと考えてください。インスタンス1コにそれぞれ一意のインスタンスIDが割り当てられます。

f:id:jainders:20160707194846j:plain

 

Amazonマシンイメージ(AMI)から好きなイメージを選択します。今回はAmazonLinuxを使います。右横にある[選択]ボタンを押しましょう。
AmazonLinuxはざっくり言うとCentOS 6+AWS CLIという組み合わせです。他リポジトリAmazon独自のものだったり、コマンドが一部異なったりします。細かいところは私も調べきれてないので気になる方は独自に調べてみてください。
とにかくAmazonLinuxはAWSをフル活用するならAWS CLIが最初から入っているのでオススメです。S3と連携してデータを取ってきたりする処理を簡単に作成することができます。また何か問題があったとき、他のディストリビューションの問題はAmazonは対応してくれません。特別な希望がなければAmazon Linuxを選択しとくのが無難です。

f:id:jainders:20160707194856j:plain

 

インスタンスタイプを選択します。ここで選ぶのはマシンスペックです。基本的にマシンスペック(CPUとメモリ)の性能が高いほど1h当たりの利用料金も高くなります。今回は1か月の無料枠があるt2.microを選択して、[次の手順 インスタンスの詳細の設定]ボタンを押します。

f:id:jainders:20160707194903j:plain

 

インスタンスの詳細の設定をします。ここで自動割り当てパブリックIPを「有効化」に変更します。これで外部からEC2へアクセスするためのパブリックIPアドレスを起動時に割り当ててくれます。[次の手順 ストレージの追加]ボタンを押します。

f:id:jainders:20160707194908j:plain

 

次にストレージの追加の設定をします。今回はデフォルト8GBで問題ないのでそのまま何もせず、[次の手順 インスタンスのタグ付け]ボタンを押します。ストレージ容量はEC2作成後に変更することが可能です。

f:id:jainders:20160707194913j:plain

 

インスタンスのタグ付けは特に作成する必要はありませんが、サーバ名を割り当てたい場合はデフォルトタグの「Name」の値にサーバ名を割り当てるとEC2のインスタンス一覧画面で表示されます。[次の手順 セキュリティグループの設定]ボタンを押します。

f:id:jainders:20160707194918j:plain

 

セキュリティグループの設定は今回はデフォルトのssh(22)のポートを空けただけのものを使用します。実際に立てる時はhttp(80),https(443)などや、送信元のIPアドレス設定を行って、不正アクセスされないような値を設定してください。セキュリティグループ設定は後で簡単に変更することが可能です。[確認と作成]ボタンを押します。

f:id:jainders:20160707194924j:plain

 

今までの設定を確認して[作成]ボタンを押します。

f:id:jainders:20160707194933j:plain

 

キーをダウンロードします。端末からEC2にログインするために必要なものです。ここでキーをダウンロードしないとEC2に接続できなくなりますので必ずキーをダウンロードしてください。今回はキーペア名に「test_key」と入れました。[キーペアのダウンロード]ボタンからtest_key.pemをダウンロードして任意の場所に保存してください。ダウンロードしたら[インスタンスの作成]ボタンを押してEC2を作成します。

f:id:jainders:20160707194939j:plain

 

完了画面です。そのまま[インスタンスの表示]ボタンを押してインスタンス一覧画面に戻ります。

f:id:jainders:20160707194945j:plain

 

インスタンス画面に戻るとインスタンスの状態のところが「pending」、ステータスチェックが「初期化しています」の状態になっています。そのまましばらくお待ちください。

f:id:jainders:20160707194949j:plain

 

しばらくすると、インスタンスの状態が「running」、ステータスチェックが「2/2のチェックに合格しました」と表示されます。これでEC2インスタンスが作成完了しました。

f:id:jainders:20160707194955j:plain

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その3~

前回の記事はこちら。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~ - KAROUSHI -Japanese Engineer Blog-

API Gatewayの設定

さて3回目は最後にAPI Gatewayの作成と接続テスト実施を行います。

APIGatewayを作成する

lambdaの画面を開いて前回作成した[s3create]を選択します。

f:id:jainders:20160606201721j:plain

タブから[API endpoints][Add API endpoint]を押下します。

f:id:jainders:20160606201724j:plain

 

Add API endpoint画面が開きますので以下のように設定しましょう。
(今回はメソッドはPOSTで設定します)

 

API endpoint type:API Gateway(そのまま)
API name: LambdaMicroservice(そのまま)
Resource name: /s3create(そのまま)
Method: POST
Deployment stage: prod(そのまま)
Security: AWS IAM(そのまま)

[Submit]を押下します。

f:id:jainders:20160606201726j:plain

API endpointが作成され表示されることを確認しましょう。

APIをテストする

確認したらMethodの[POST]を選択してAPI Gatewayの画面へ遷移します。[クライアント]という文字の上にある[テスト(雷マーク)]を選択しましょう。

f:id:jainders:20160606201729j:plain

f:id:jainders:20160606201732j:plain

すると下図のようなテスト画面に遷移するので、リクエスト本文に以下のJSONをコピペして[テスト]をクリックしましょう。

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

f:id:jainders:20160606201735j:plain

以下のようにレスポンス本文、レスポンスヘッダー、ログが表示されればOKです。

f:id:jainders:20160606201740j:plain

 

これで一通りの流れを終えました。

今回はlambda処理を自作せずにblue printから選んで作成しました。どうでしょうか?APIが簡単にできましたね。URLも生成されているのでEC2などからURL+POSTデータを実行してあげれば、EC2上で動くサービスとの連携も可能です。

pythonの場合はbotoというlambdaのライブラリがあるようなので、次回はそれを使ってもう少し高度で実践的なことをやろうと思います。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~

API Gateway→lambda→S3の続きです。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~ - KAROUSHI -Japanese Engineer Blog-

 

今回はlambdaです。

pythonのlambda作成手順をあまりネット上で見かけなかったので、pythonの手順を紹介します。

lambdaの設定

Lambdaを作成する

上部タブから[サービス][Lambda]を選択します。

f:id:jainders:20160603222457j:plain

[Create a Lambda function]をクリック→"Select blue print"画面が表示されます。
(初回はcreate functionボタンが中央に表示されます)

f:id:jainders:20160603222459j:plain


検索ボックスの隣にあるプログラム選択ボックスから[Python 2.7]を選択すると、python関連のblue printが一覧で表示されます。
今回は[s3-get-object-python]を選択します。

f:id:jainders:20160603222500j:plain

 

Configure event sources画面が表示され、以下を設定して[Next]をクリックします。
Event source type: S3
Bucket: <S3に作成済みのバケット>
Event type: Object Created(All)
Prefix: 任意(空でもOK)
Suffix: 任意(空でもOK)

f:id:jainders:20160603222502j:plain

Configure function画面表示されます。
以下を設定して下へスクロールします。

Name:任意(今回はs3test)
Description: (そのまま)
Runtime: Python 2.7
Lambda function code: (そのまま)

f:id:jainders:20160603222504j:plain

以下の設定をします。

Hadnler: (そのまま)
Role: <S3 execution role>を選択します。
 →別ウィンドウが開くので以下を設定し[許可]をクリックする。
  IAMロール: lambda_s3_exec_role
  ポリシー名: 新しいロールポリシーの作成
Memory(MB): (そのまま)
Timeout: (そのまま)
VPC: (そのまま)

f:id:jainders:20160603222506j:plain

f:id:jainders:20160603222507j:plain

Review画面が表示されます。
そのまま[Create function]を押下します。

f:id:jainders:20160603222511j:plain

すると以下のような画面に遷移しfunctionの作成に成功したことが上部に表示されます。

f:id:jainders:20160603222513j:plain

 

functionのテストを実行する

[Actions][Configure test event]を押下します。

f:id:jainders:20160603222515j:plain

 

するとInput test event画面が表示されます。
すでに長いjsonが載っていますが、わかりづらいので下記に変更します。

テストコード

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

[Save and test]でテストを実行します。

f:id:jainders:20160603224904j:plain

すると先ほどの画面に戻ります。
その画面の下部へ移動し「Execution result:succeeded(logs)」と表示されていればOKです。正常にオブジェクトが取得できています。
レスポンスとして"text/html"が返ってきていることが確認できます。
ビルド時間、応答時間などがSummaryに、ログはLog outputに表示されます。

f:id:jainders:20160603222518j:plain

 

これでlambdaの設定は完了です。

次回最後にAPI Gatewayの設定を行います。

koboldtodragon.hatenablog.com

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~

AWS流行ってるね!ノンサーバって響きがかっこいいー!でも何したらいいか分からん! 
という感じなエンジニアです。(笑)
今回は3回に分けて

API Gateway→イベントキャッチしてlambdaからS3オブジェクトを取得する処理を実行

を実装してみます。

s3の設定

S3に新しいバケットを作成する

まずはS3に新しいバケットを作成します。
サービスから[S3]を押下します。

f:id:jainders:20160602204935j:plain

 

[バケットを作成]を押下します。

f:id:jainders:20160602204956j:plain

以下を設定して[作成]を押下します。
バケット名:teset.test.test.3(任意)※1 
リージョン:Oregon(任意)※2

※1 バケット名は一意に設定する必要があります。他ユーザが既に作成しているバケットは作ることができません。
※2 リージョンにより料金設定が異なります。

f:id:jainders:20160602205024j:plain


これで新しいバケットが作成されました。

バケットにポリシーを設定する

では次にバケットポリシーを設定して、オブジェクトを取得できるようにしましょう。
以下のようにバケット名が一覧で表示されているので、バケット名[test.test.test.3]を押下します。

f:id:jainders:20160602205025j:plain

右上にある[プロパティ]を押下すると、右からウィンドウが出てきます。
[アクセス許可][バケットポリシーの追加]を押下します。

f:id:jainders:20160602205026j:plain

バケットポリシーエディターがポップアップして表示されるので以下を追記して[保存]を押下します。

バケットポリシー

{
  "Version": "2012-10-17",
  "Statement": [
  {
    "Sid": "AddPerm",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::test.test.test.3/*"
  }
  ]
}

f:id:jainders:20160602205028j:plain

これでバケットポリシーの設定は完了です。
今回設定したポリシーは

test.test.test.3配下に存在するオブジェクトの取得をすべて許可する

という設定です。

S3にファイルをアップロードする

では最後にオブジェクトをアップロードします。
まずはindex.htmlを作成します。
以下の内容のindex.htmlを作成してください。

index.html

<html>
<body>
  <p>Hello</p>
</body>
</html>

左上の[アップロード]を押下すると、アップロード画面がポップアップして表示されます。

f:id:jainders:20160602205029j:plain

ドラッグ&ドロップか、[ファイルを追加する]を押してindex.htmlを選択し、[アップロードの開始]を押下します。

f:id:jainders:20160602205030j:plain

右側に転送ステータスが表示され「完了」と表示されると、左側の一覧に表示されます。
これでオブジェクト(index.html)のアップロードは完了です。

f:id:jainders:20160602205032j:plain

S3の設定は以上です。

 

今回S3にアップロードしたindex.htmlをlambdaからアクセスして取得できるようにします。

 lamdaの設定は次回。

koboldtodragon.hatenablog.com