2017年1月27日金曜日

MatterMost hook executed successfully but returned http reponse 500

  • このエントリーをはてなブックマークに追加


MatterMost hook executed successfully but returned http reponse 500

Gitlab オンプレミス版インストールしたので、内蔵されているSlcakのクローン版MatterMostとの連携をしてみました。

MatterMostを有効にする

  • デフォルトではMatterMostが無効になっているため、有効にする必要がある。
# vi /etc/gitlab/gitlab.rb
mattermost_external_url 'http://mattermost.test.com'

Gitlabと違うドメイン名が推奨されてますが、同じドメイン名でポート番号だけ変えればOK。

例えば
http://10.10.100.1:9999

  • GitlabをReconfigure
sudo gitlab-ctl reconfigure

これでURLからアクセスできるようになる。Teamを作って、招待リングを作って関係者招待すればOK

参考
https://docs.gitlab.com/omnibus/gitlab-mattermost/

GitlabとMatterMost連携

MatterMostでWebHookを有効

Teamを右クリック → System console → Service Settings 以下の項目をTrueにする

  • Enable Incoming Webhooks: true
    When true, incoming webhooks will be allowed. To help combat phishing attacks, all posts from webhooks will be labelled by a BOT tag.
  • Enable Outgoing Webhooks: true
    When true, outgoing webhooks will be allowed.
  • Enable Slash Commands: true
    When true, user created slash commands will be allowed.
  • Enable Integrations for Admin Only: true
    When true, user created integrations can only be created by admins.
  • Enable Overriding Usernames from Webhooks and Slash Commands: true
    When true, webhooks and slash commands will be allowed to change the username they are posting as. Note, combined with allowing icon overriding, this could open users up to phishing attacks.
  • Enable Overriding Icon from Webhooks and Slash Commands: true

上記項目を有効にしないと、matterMostのIntegration画面が表示されない。

チャンネルごとにWebHook用URLを作成

Teamを右クリック → Account Settings → Integrations → Incoming Webhooks
対応チャネルを選択し、ADDで追加する。URLが表示されます。

GitlabでWebHook設定

最初に Gitlabプロジェクト → Settings → WebHooks画面でMatterMostのURLを追加したのですが、以下のエラーが表示されます。

Error

hook executed successfully but returned http reponse 500

色々調べたところ、どうやら、Webhooks画面ではなく、Services画面でSlackを有効にして、MatterMostのWebhook URLとチャンネル名入力してできました。

解決

DO NOT create webhook in Gitlab from Projects Settings > Webhooks page.
DO create webhook from Projects Settings > Services > Slack page

2017年1月23日月曜日

AWS Create API Gateway 手順

  • このエントリーをはてなブックマークに追加


AWS Create API Gateway 手順 AWS API Gateway とLambda連携してDBにデータPush用API作成しておりまして、APIGatewayの手順をメモしておきます。
Lambdaの手順はずいぶん省略されましたが、こちらご参照ください。
https://viewse.blogspot.jp/2017/01/aws-lambda-process-exited-before.html
  • API作成 ⇒ 新しいAPI, API名:push-api ⇒ API作成
  • リソースの作成 ⇒ リソース名:applicant、リソースパス:/applicant ⇒ リソース作成
  • メソッドの作成 ⇒ Post追加、統合タイプ:Lambda関数、Lambdaリージョン:eu-west-1、Lambda関数(入力):UpdateApplicantInfo ⇒ 保存
  • メソッド設定 ⇒ メソッドリクエスト、APIキーの必要性:true
  • APIデプロイ ⇒ デプロイされるステージ:新しいステージ、ステージ名:v1 ⇒ デプロイ
  • APIキー作成 ⇒ push-api-key
  • 使用プラン作成 ⇒ 名前:Usage Plan for push-api v1, スロットリングの有効化:無効、クオータを有効にする:無効 次へ ⇒ APIステージの追加、API:push-api、ステージ:v1、次へ ⇒ APIキーを使用量プランに追加、push-api-key、完了
大体こんな感じです。

Terraform Aws RDS parameter group 適用時エラー

  • このエントリーをはてなブックマークに追加


Terraform Aws RDS parameter group 適用時エラー TerrafromでAWS RDS作成時にDBパラメーターグループにパラメーターを指定してTerraform apply実行すると以下のエラーが出たりします。

sample .tf file

# Create parameter group for mariadb
resource "aws_db_parameter_group" "db-pg" {
    name = "test-mariadb10-1"
    family = "mariadb10.1"
    description = "mariadb parameter group for test project"

    parameter {
        name = "character-set-client-handshake"
        value = "0"
    }
    parameter {
        name = "character_set_client"
        value = "utf8"
    }
    parameter {
        name = "character_set_connection"
        value = "utf8"
    }
    parameter {
        name = "character_set_database"
        value = "utf8"
    }
    parameter {
        name = "character_set_results"
        value = "utf8"
    }
    parameter {
        name = "character_set_server"
        value = "utf8"
    }
    parameter {
        name = "log_bin_trust_function_creators"
        value = "1"
    }
    parameter {
        name = "max_allowed_packet"
        value = "10240000"
    }
    parameter {
        name = "skip-character-set-client-handshake"
        value = "1"
    }
}

terraform apply error

Error modifying DB Parameter Group: InvalidParameterCombination: cannot use immediate apply method for static parameter status code: 400

原因

DB再起動しないと適用できないパラメータの場合は、すぐ適用できないため、失敗する

解決策

apply_methodの値をpending-rebootに設定する。デフォルトではImmediateになっている
# Create parameter group for mariadb
resource "aws_db_parameter_group" "gmaridb-pg" {
    name = "test-mariadb10-1"
    family = "mariadb10.1"
    description = "mariadb parameter group for test project"

    parameter {
        name = "character-set-client-handshake"
        value = "0"
        //default is immediate
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "character_set_client"
        value = "utf8"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "character_set_connection"
        value = "utf8"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "character_set_database"
        value = "utf8"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "character_set_results"
        value = "utf8"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "character_set_server"
        value = "utf8"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "log_bin_trust_function_creators"
        value = "1"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "max_allowed_packet"
        value = "10240000"
        apply_method = "pending-reboot" 
    }
    parameter {
        name = "skip-character-set-client-handshake"
        value = "1"
        apply_method = "pending-reboot" 
    }
}

2017年1月20日金曜日

Laravelでファイルの種類を限定してファイルをアップロードする

  • このエントリーをはてなブックマークに追加


Laravelでファイルの種類を限定してファイルをアップロードする Laravelでファイルアップロードサイトを作っていて、アップロードできるファイルの種類(画像、エクセルとか)を制限したいと思って、色々調べたのですが、以下のように簡単にできます。

Form sample

{!! Form::open(['class' => 'form-upload', 'url'=>'/upload/submit','files'=>true]) !!}

{{ Form::label('file','Upload a file.',array('id'=>'','class'=>'')) }}
    <div class="input-group">         
        <label class="input-group-btn">
        <span class="btn btn-primary">
            Select File
            {!! Form::file('file', ['style' => 'display: none;', 'accept' => '.jpg,.jpeg,.png,.gif,.pdf']) !!}
        </span>
        </label>
        <input style="width:350px;" type="text" class="form-control" readonly>
    </div>
    <br>
    
    <button class="btn btn-lg btn-primary" type="submit">Upload</button>
{!! Form::close() !!}
以下の一行でファイルの拡張子を指定することで、jpg, jpeg, png, gif, pdfのファイルだけを制御できます
{!! Form::file('file', ['style' => 'display: none;', 'accept' => '.jpg,.jpeg,.png,.gif,.pdf']) !!}
実際にブラウザでHTMLソースをみてみたら、Inputに変換されていることがわかります。
<span class="btn btn-primary">
    Select file
    <input style="display: none;" accept=".jpg,.jpeg,.png,.gif,.pdf" name="file_1" type="file">
</span>

JavaScript

他にJavaScriptでも制御できます。
例、Excelファイル(.xls、.xlsx)だけをアップロードできるようにする
<script type="text/javascript">

    function SetAccept() {
        document.getElementById("file").accept = "application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    }
    SetAccept();
    </script>
imageだとimage/jpeg, image/gifなどを切り替えてよいです。
MIMEタイプ一覧をこちら参照できます。
http://www.geocities.co.jp/Hollywood/9752/mime.html

2017年1月16日月曜日

AWS Lambda Process exited before completing request error

  • このエントリーをはてなブックマークに追加


AWS Lambda Process exited before completing request error LambdaでRDS(mariadb)にデータをプッシュするAPIを作っています。

Nodejs sample code

var mysql = require('mysql');

exports.handler = function(event,context){

    var connection = mysql.createConnection({
      host     : 'xxx.xxx.eu-west-1.rds.amazonaws.com', //RDSのエンドポイント
      user     : 'xxxxxx', //MySQLのユーザ名
      password : 'xxxxxx', //MySQLのパスワード
      database : 'xxxxxx'
    });

    connection.connect();

    var name = event.Name
    var email = event.Email
    var birth = event.Birth

    var insert_sql = "insert into User (Name, Email, Birth) value ('" + name +"','" + email +"','" + birth + "')"
    connection.query(insert_sql, function(err, rows, fields) {
      if (err)
      {
        console.log("--err");
        console.log(err);
        throw err;
      }
    });

    connection.end(function(err) {
        context.done();
    });

}

Mac でコードをZIPする

$ mkdir lambda-func
$ cd lambda-func
$ brew install Nodejs
$ npm install mysql
$ ls
UpdateDB.js node_modules
$ zip -r lambda-func.zip UpdateDB.js node_modules/

Upload lambda-func.zip to lambda and set handler to UpdateDB.handler (UpdateDB.js  + exports.handler)

Error

RequestId: 1682cd4d-dbea-11e6-81d7-03af694d0c84 Process exited before completing request
Process exited before completing requestのエラーがよく出ています。
色々調べたのですが、原因は以下何種あります。
  • Time out DBに接続して処理に時間がかかった。
  • Memory 割り当てるMemoryが足りなかった。
    REPORT RequestId: 1682cd4d-dbea-11e6-81d7-03af694d0c84 Duration: 3658.20 ms Billed Duration: 3700 ms Memory Size: 128 MB Max Memory Used: 128 MB

解決策

[Configuration]タブでMemoryとTime outを上げる。
他の原因かもしれません。ただ言えるのは、スクリプト内でどこかでエラーになって処理終わらなくてこのエラーが出力されていると言う感じです。DebugにConsole.logをこまめに使ってデバックしましょう

2017年1月12日木曜日

AWS Centos6.5 nginx php-fpm インストール

  • このエントリーをはてなブックマークに追加


AWS Centos6.5 nginx php-fpm インストール AWSのEC2(CentOS 6.5)にnginx、PHP-fpmのインストール手順をメモしておきます。

nginx install

sudo sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
sudo yum install nginx

php-fpm install

sudo yum install php
yum list | grep php-fpm

php-fpm 設定

sudo cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org
sudo sed -i -e 's/user = apache/user = nginx/' /etc/php-fpm.d/www.conf

sudo sed -i -e 's/group = apache/group = nginx/' /etc/php-fpm.d/www.conf

直接viで編集してもよい。ユーザー、groupをnginxに変更

nginx 設定

例:rootディレクトリを/var/www/htmlにする
sudo cp -p /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org
以下の様な感じで変更
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /var/www/html;
        index  index.php index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

起動

sudo /etc/init.d/php-fpm start
sudo /etc/init.d/nginx start

自動起動を設定
sudo chkconfig nginx on
sudo chkconfig php-fpm on

動作確認

sudo echo '' > /var/www/html/phpinfo.php
この状態だと、アクセス拒否されてできないです。
AWSインスタンスで既定でiptables,ip6tablesが有効になっているからです。
無効にする
sudo /etc/init.d/iptables stop
sudo /etc/init.d/ip6tables stop
sudo chkconfig iptables off
sudo chkconfig ip6tables off
以上でnginxとphp連携できた。