ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2017年2月12日日曜日

AWS Lambda RDSにデータをInsertするとError発生時にアラート通知

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

AWS Lambda RDSにデータをInsertするとError発生時にアラート通知 AWS LambdaでRDSにデータをインサートする処理を実現しています。
正しくインサートするときに何もしなく、そのまま終了、
インサートするときにエラーが発生した場合は、Alertメールで通知したい。

Sample Code

var mysql = require('mysql');
exports.handler = function(event,context,callback){
    var No = event.No
    var Birth = event.Birth
    var Email = event.Email
    var Name = event.Name

    if(No == null || Birth == null || Email == null || Name == null){
        context.done('FAILED');
    }

    var connection = mysql.createConnection({
      host     : 'rds endpoint url', //RDSのエンドポイント
      user     : 'root', //MySQLのユーザ名
      password : 'password', //MySQLのパスワード
      database : 'db'
    });

    connection.connect();

    var insert_sql = "insert into User (No, Birth, Email, Name) value ('" + No + "','" + Birth +"','" + Email +"','" + Name + "')"
    connection.query(insert_sql, function(err, rows, fields) {
      if (err)
      {
        console.log("--err");
        console.log(err);
        callback(new Error("FAILED"));
      }
    });

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

Lambdaモニタリング設定

「Lambda ⇒ 「関数」 ⇒ 「モニタリング」タブで【呼び出しエラー】というものがあります。
monitoring
これを設定すればエラー発生したら、設定したメールアドレスにメールが飛びます。
エラー(Errors)
が>=1
を1回連続した場合

間隔:5分間
統計:Standard
などの値を設定し、通知の送信先を選択する。
alert
これでうまくいくかと思いきゃ、実は成功のときも、エラーが通知されてしまいます。よくないね。いろいろ調べたところ、このエラーは以下の意味を示しています。
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/lam-metricscollected.html
- 処理された例外 (context.fail(error) など)
- コードの終了を起こす処理されない例外
- メモリ不足例外
- タイムアウト
- 権限エラー

解決

ソースコードの以下の部分が悪かった。
 connection.end(function(err) {
        context.done('SUCCESSED');  
    });
これだと、実行後常にエラーメッセージSuccessedで以上終了してしまいます。
以下のように変更すれば、正常に終了されます。
 connection.end(function(err) {
        context.done();  
    });
結構ハマりました。

2017年2月3日金曜日

AWS Lambda connect ETIMEDOUT

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

AWS Lambda connect ETIMEDOUT AWS LambdaでDB接続してデータをインサートするFunctionを書いていて、以下のような ETIMEDOUTエラーが出力されました。エラーがあったが、処理自体は正常に行われてデータがちゃんとDBに挿入されてます。
Error
2017-02-03T05:11:32.012Z    c31fa576-e9cc-11e6-85b4-5dea6b0e5632    { [Error: connect ETIMEDOUT] errorno: 'ETIMEDOUT', code: 'ETIMEDOUT', syscall: 'connect', fatal: true }
Code
var mysql = require('mysql');
exports.handler = function(event,context,callback){
    var No = event.No
    var Birth = event.Birth
    var Email = event.Email
    var Name = event.Name

    if(No == null || Birth == null || Email == null || Name == null){
        context.done('FAILED');
    }

    var connection = mysql.createConnection({
      host     : 'rds endpoint url', //RDSのエンドポイント
      user     : 'root', //MySQLのユーザ名
      password : 'password', //MySQLのパスワード
      database : 'db'
    });

    connection.connect();

    var insert_sql = "insert into User (No, Birth, Email, Name) value ('" + No + "','" + Birth +"','" + Email +"','" + Name + "')"
    connection.query(insert_sql, function(err, rows, fields) {
      if (err)
      {
        console.log("--err");
        console.log(err);
        callback(new Error("FAILED"));
      }
    });

    connection.end(function(err) {
        context.done('SUCCESSED');
    });
}
いろいろ調べたのですが、LambdaのTimeout値を超えたとか、RDSへのアクセス権ないとか、いろいろありました。
自分の場合は、connection.connect() の一番先頭に持っていたらうまくいった。よくわからんけど。
以下の様な感じです。
var mysql = require('mysql');
exports.handler = function(event,context,callback){
    var connection = mysql.createConnection({
      host     : 'rds endpoint url', //RDSのエンドポイント
      user     : 'root', //MySQLのユーザ名
      password : 'password', //MySQLのパスワード
      database : 'db'
    });

    connection.connect();

    var No = event.No
    var Birth = event.Birth
    var Email = event.Email
    var Name = event.Name

    if(No == null || Birth == null || Email == null || Name == null){
        context.done('FAILED');
    }

    var insert_sql = "insert into User (No, Birth, Email, Name) value ('" + No + "','" + Birth +"','" + Email +"','" + Name + "')"
    connection.query(insert_sql, function(err, rows, fields) {
      if (err)
      {
        console.log("--err");
        console.log(err);
        callback(new Error("FAILED"));
      }
    });

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

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月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連携できた。

2014年7月11日金曜日

AWS EC2の無料利用枠まとめ

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

AWSを触りたくて、無料アカウント作成しました。これからいろいろいじろうと思います。ちょっと使ってみた感じとしては、結構使いやすいという印象です。
で、今回は、AWS EC2(Virtual Machine)の無料利用枠について、まとめておきます。多分ほとんどの方がアカウント作成の前に、気になるところでしょう。

このページでいろいろ紹介がありましたが、ちょっとわかりづらいですね。
簡単に言いますと、以下の感じです。

・アカウント取得から1年間有効
・EC2関連の無料利用枠(毎月
     EC2
          Linuxマイクロインスタンス 750時間
          Windows Serverマイクロインスタンス 750時間

     EBS(Elastic Block Store)
          ストレージ 30GB
          I/O 200万
          スナップショット 1GB

     データ転送
          送信パケット量 15GB
          
EC2に関してはこれくらいわかれば十分だと思います。