Need to Setup WHM and Cpanel on AWS AMI and host website

さらに表示: whm cpanel drupal setup, cpanel aws ami, cpanel amazon aws ami, need setup database website, setup ruby rails shared web host, whm cpanel curl, recover deleted files whm cpanel, migrating name servers whm cpanel, host website local, need setup mail server mails website, whm … 続きを読む

Fix AWS CloudFormation Script with conditional resource

さらに表示: fix sides website script, fix mail sender script, fix error php script, connect aws java script, need fix error php script, fix twitter api script database, fix linux test script, fix user login script, fix bugs gen3 script, fix website java script, fix form mailer script, fix error flv script, fix price acution script, free … 続きを読む

Cognitoユーザープールからの送信メールをカスタマイズする

サービスの認証にCognitoユーザープールを使用する際、確認コードや、初回ログインパスワードなどをメールでお知らせする場合があると思います。

Cognitoのデフォルト設定だとこんなメールが届きます。

Your confirmation code is 927173
Your username is xxxx and temporary password is xxxxxx.

このメールタイトル、本文をカスタマイズする方法です。

カスタムメッセージが設定できるイベント

公式ドキュメントからの抜粋です。
以下がカスタムメッセージが設定できるイベントの一覧です。

AWS Lambda トリガーのリクエストおよびレスポンスパラメータ

triggerSource 値 トリガーイベント
CustomMessage_AdminCreateUser カスタムメッセージ – 新規ユーザーに一時パスワードを送信するため.
CustomMessage_ResendCode カスタムメッセージ – 既存ユーザーに確認コードを再送するため.
CustomMessage_ForgotPassword カスタムメッセージ – 忘れたパスワードのリクエスト用の確認コードを送信するため.
CustomMessage_UpdateUserAttribute カスタムメッセージ – ユーザーの E メールまたは電話番号が変更されると、このトリガーは確認コードをそのユーザーに自動的に送信します。他の属性には使用できません。
CustomMessage_VerifyUserAttribute カスタムメッセージ – ユーザーが手動で新しい E メールや電話番号の認証コードをリクエストすると、このトリガーからユーザーに認証コードが送信されます。
CustomMessage_Authentication カスタムメッセージ – 認証時に MFA コードを送信するため.

今回はtriggerSource値がCustomMessage_AdminCreateUserの場合(Cognitoユーザープールのポリシーに「管理者のみにユーザーの作成を許可する」を設定していて、管理者がユーザーを作成した際にユーザーに送信されるメール)のカスタマイズを例にします。

手順

  1. Lambdaファンクションの作成
  2. Cognitoユーザープールに1.で作成したファンクションを登録

1. Lambdaファンクションの作成

Python3.6での例です。
ファンクションのIAMロールにはCloudwatchログ出力権限の付与だけでOKです。以下IAMポリシーの例です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}

Lambdaファンクションで受け取るイベントをログ出力するとこのような感じ。

{
    "version": "1",
    "region": "ap-northeast-1",
    "userPoolId": "ap-northeast-1_xxxxxxxxx",
    "userName": "hogee",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-js-2.176.0",
        "clientId": "CLIENT_ID_NOT_APPLICABLE"
    },
    "triggerSource": "CustomMessage_AdminCreateUser",
    "request": {
        "userAttributes": {
            "sub": "bf6e9c66-0a69-476e-bfd8-724d38e6555f",
            "cognito:email_alias": "hoge@example.com",
            "email_verified": "True",
            "cognito:user_status": "FORCE_CHANGE_PASSWORD",
            "name": "hoge",
            "email": "hoge@example.com"
        },
        "codeParameter": "{####}",
        "usernameParameter": "{username}"
    },
    "response": {
        "smsMessage": "None",
        "emailMessage": "None", # ここをカスタムした本文に変える
        "emailSubject": "None" # ここをカスタムしたタイトルに変える
    }
}

このイベントをそのままreturn eventとするとデフォルト設定が適用されたメールが送られます。カスタマイズするにはresponseのフィールド内をカスタマイズしたい内容に書き換えてリターンします。

cognito_custom_message.py
# -*- coding:utf-8 -*-

def handler(event, context):
    if event['triggerSource'] == 'CustomMessage_AdminCreateUser':
        customed_event = custom_message_admin_create_user(event)

    return customed_event


def custom_message_admin_create_user(event):

    email_message = '''
{username} 様
<br>
<br>
管理者から招待されました。
<br>
<br>
ログインメールアドレス:{mail}
<br>
初回ログインパスワード:{password}
'''.format(username='{username}',
           mail=event['request']['userAttributes']['email'],
           password='{####}')

    event['response']['emailSubject'] = '仮パスワード発行のお知らせ'
    event['response']['emailMessage'] = email_message

    return event

{username}にユーザーネーム、{####}にパスワードが入ってメールが送信されることになります。
triggerSourceによって本文に含めなくてはいけないコードパラメータは異るため先ほどの公式ドキュメントで確認してください。
triggerSourceがCustomMessage_AdminCreateUserの場合、メッセージ本文に{username}{####}が入っていないとエラーになります。

もし追加で他のカスタムメッセージイベントにも対応したい場合、handler()

    elif event['triggerSource'] == 'CustomMessage_ForgotPassword':
        customed_event = custom_message_forgot_password(event)

とやると対応できます。

2. Cognitoユーザープールに1.で作成したファンクションを登録

Lambdaファンクション作成後はCognitoユーザープールのコンソールにいき、トリガーカスタムメッセージから作成したLambdaファンクションを指定します。

スクリーンショット 2018-02-03 20.03.27.png

serverless frameworkではこのようになります。

serverless.yml
<略>
functions:
  cognitoCustomMessage:
    handler: functions/cognito_custom_message.handler
    role: CognitoCustomMessageRole
    events:
      - cognitoUserPool:
          pool: UserPool
          trigger: CustomMessage
resources:
  Resources:
    CognitoUserPoolUserPool:
      <以下略>

設定後、アプリケーションからユーザーを登録してみると、

スクリーンショット_2018-02-03_20_27_35.png

カスタマイズされたメールが届きました。

以上です。

続きを読む

Setup AWS server with SSL + other related setting

さらに表示: aws server setup, setup email server aws, aws setup smtp server, smtp server setup aws, setup proxy server aws, aws setup mail server, setup web server amazon aws, setup aws server, setup php server verification email, webmin setup sendmail server, dedicated server ssl installation, … 続きを読む

Athenaで入れ子のjsonにクエリを投げる方法が分かりづらかったので整理する

Kinesis FirehoseでS3に置かれた圧縮したjsonファイルを、それに対してクエリを投げる、というのを検証してたのですが、Hive素人なのでスキーマの作り方もクエリの投げ方も正直あんまり良くわかってませんでした。

そこで下記を参照しながらスキーマの作成とクエリ投入をやってみて、最終的にうまくいきました。

日本語記事
https://aws.amazon.com/jp/blogs/news/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/

元記事
https://aws.amazon.com/jp/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/

ずーっと日本語記事を読みながらやっていたのですが、これがめちゃくちゃわかりづらい!!!
※理解度には個人差があります

多分知っている人が見たら何となくわかるんでしょうが、恐らくこれを見るのは自分みたいにあまり良く知らないので参考にしながら実際にやってみている、という層だと思います。
最終的に上手く行ってから思ったのは、前提知識がないと読むのがしんどい、ということですね…。
ただもう少し書いといてくれるだけで十分なのに…。
原文も軽く見ましたが、そっちにも書いてないのでそもそも記述されてません。

調べてもまだ中々情報が出てこない上に、クエリ投入時にエラーが出た場合もエラーメッセージが淡白すぎてどこが問題でエラーになってるのかさっぱりわからなくて悪戦苦闘してました。

そんなわけで、今後同じところで困る人が一人でも減るように、自分用メモも兼ねてハマったところについて補足をしておきたいと思います。

概要

リンク先で書いてあることの流れは大まかに下記のとおりです。

  1. FirehoseでSESの送信イベントログをS3に保存する
    送信イベントログはjson形式で、それをFirehoseでS3に保存しています。
  2. Athenaのテーブルを作成して、クエリを投げる
    • ただテーブル作成して投げる場合
    • 入れ子になっているjsonに対してテーブル作成してクエリを投げる場合
    • 禁止文字を含んでいるものに対してテーブルを作成してクエリを投げる場合
      わかりづらいですが、禁止文字を含む項目をマッピングする項目とクエリを投げる項目が分かれています。)
  3. hive-json-schemaの紹介
    jsonからテーブル作成のためのクエリを生成するツールっぽいのですが、紹介してるわりにちっとも使い方が書いてません…。
    使い方の解説をどなたか…。

ハマったところ

入れ子になったjsonに対するテーブル作成について

ハマったところといいつつ、自分はこの辺は割とスムーズに行ったのですが、ちょっとわかりづらいかもしれないので念のため。
サンプルにもありますが、jsonの中にまたjsonとか配列とかが入っている、みたいなケースは多くあります。
そういった場合、内部にあるjsonに対してstruct型を使って、その下の項目について型を定義してやればOKです。
その中にさらにjsonがある場合はさらにその中にstruct型で定義をすればOK。
例にあるものだと、内部にmail{~}とjsonがあり、その中にさらにいくつかのjsonがあるので、それぞれに対してstruct型で定義をしています。
以下引用(全文は貼っていないので、元はリンク先を見てください。)
※一部バッククオート(`)で囲われている項目がありますが、予約語として使われている言葉をそのまま使用するとエラーになるそうです。
そのため、バッククオートで囲うことによってエスケープしてるようです。

抜粋した入れ子の部分
 mail struct<`timestamp`:string,
              source:string,
              sourceArn:string,
              sendingAccountId:string,
              messageId:string,
              destination:string,
              headersTruncated:boolean,
              headers:array<struct<name:string,value:string>>,
              commonHeaders:struct<`from`:array<string>,to:array<string>,messageId:string,subject:string>
              > 

禁止文字そのものについて

まず、禁止文字が色々あることを最初大して理解してませんでした。
項目名(↑の例だと、timestampとかsourceとかのところ)の定義に使用できない文字があります。
記事中だと「:」(コロン)が禁止文字列なので、それがクエリ中の該当箇所に入っているとエラーになります。
あとは「-」(ハイフン)なんかも禁止文字のようです。
例えばHTTPリクエストのログを見たとき、ヘッダとかはハイフンを使った項目がいくつもあったりするので困りますよね。
一応記事中の例では両方「_」(アンダースコア)に変換しています。(コロンにしか触れてませんが…。)
最初は禁止文字があると知らず、なぜエラーになっているかわからずにハマってました。
この辺どっかにまとまってるのかな…?
どうやって回避するかというと、それがWITH SERDEPROPERTIESの部分です。

禁止文字を含む場合のマッピングの仕方について

最初見た時はなんでこんなことをするのかわかりませんでしたが、上記の通り項目名を定義するときに禁止文字が入っているとエラーになります。
なので、WITH SERDEPROPERTIESの項目で、禁止文字列を含んだ項目名を、禁止文字列のない文字列にマッピングし、元のjsonのkeyでは禁止文字列を含んでいたものに対し、テーブル上ではカラム名として別の文字列をあてがうことができます。
記事中では、コロンやハイフンをアンダースコアに変換した文字列にマッピングしています。
式の左側がカラム名に使いたい文字列で、それに対して右側がデータの元の実際の名前です。
"mapping.カラム名に使いたい文字列"="実際の名前" みたいに記述してます。

マッピングの仕方

WITH SERDEPROPERTIES (
  "mapping.ses_configurationset"="ses:configuration-set",
  "mapping.ses_source_ip"="ses:source-ip", 
  "mapping.ses_from_domain"="ses:from-domain", 
  "mapping.ses_caller_identity"="ses:caller-identity"
  )

クエリの投げ方

これもまあおまけで書いておくと、ここまでしっかりと下の項目までテーブルを定義しておくと、下の項目までクエリで引っ張ることが出来ます。
記事中では下記のような例が出ています。

元記事にある例
SELECT eventtype as Event,
         mail.timestamp as Timestamp,
         mail.tags.ses_source_ip as SourceIP,
         mail.tags.ses_caller_identity as AuthenticatedBy,
         mail.commonHeaders."from" as FromAddress,
         mail.commonHeaders.to as ToAddress
FROM sesblog2
WHERE eventtype = 'Bounce'

mail{〜}の下の項目を参照する時は上記のようにドットをつけて該当項目の名前を指定しています。
さらにその下の項目を参照する時はその後ろにさらにドットをつけています。
この辺は直感的にわかりやすいかもしれません。

おまけとかtipsとか

Firehoseで配置されたフォルダ構成ではパーティションを自動で切ってもらえない

hiveではフォルダが/bucketname/path/to/log/year=YY/month=MM/day=dd/foo
みたいな構成だと自動でパーティション設定してくれるらしいのですが、FirehoseでS3にデータ配置すると/bucketname/path/to/log/YYYY/MM/DD/fooみたいになるので、自分でパーティションを作成する必要があります。
パーティションがない状態でクエリを投げても1件も引っかかりません。
これを作るには下記のようなクエリを投げる必要があります。

elbログを対象としたテーブルにパーティションを作成する場合
ALTER TABLE database_name.table_name
ADD PARTITION (year='2016',month='08',day='28')
location 's3://elb-access-log/AWSLogs/00000000000000/elasticloadbalancing/ap-northeast-1/2016/08/28/';

※参考
https://qiita.com/r4-keisuke/items/d3d339b76d4368b6b30a

上記の例だと1日ずつパーティションを設定する必要があるのですが、
パーティション数には上限があるらしい(1テーブル20000まで)ので、1日ずつとか、1時間ずつとかフォルダ分けしている場合はちょっと注意が必要かもしれないです。
※パーティションの上限については下記
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_glue
さすがに対象が多すぎとなるとしんどいので、シェルスクリプトとかで回すといいと思います。
ただ、シェルスクリプト自体も1つ1つの処理実行だとそこそこ時間かかるのと、パーティションを設定するためのクエリでクエリ履歴が埋め尽くされるのが難点です。

データ元にない項目を定義しても値がnullになるだけで問題はない

jsonの出力が一定じゃなくて、いくつかの似たような型のjsonが混ざっていたり、ものによって存在しない項目があったりしても、それらのキーを全て網羅するようにまとめて定義しちゃって問題ないみたいです。
定義したけどデータ元に項目がない場合はnullが入るだけのようで。
逆に元データにある項目を全部定義する必要はないので、元データにあっても使わないような項目はテーブル作成の段階で定義しないようにしてもいいみたいですね。

ざっと書いたので、わかりづらいとか、もっとこうすればみたいな指摘があればいただけると嬉しいです。

続きを読む

近況 – eigokun

今はクラウド市場はAWSと他のサービスがシェアを分け合ってるけど、コンピュータアーキテクチャの常として、必ずその上のレイヤーに独占的なサービスを築く企業が出てくる気がする。 by eigokun 2017/12/27 17:30:19 from mail 返信. 書き込むには、ログインまたはユーザー登録を行ってください。 初めての方へ · 規約違反 … 続きを読む

カテゴリー 未分類 | タグ

AWS Cloud9 で Ruby on Rails を試してみた

2017/11/30にAWSにて、クラウド型統合IDE Cloud9がローンチされましたので。
さっそく、Railsアプリケーションで試してみました。
AWS Cloud9 – クラウド開発環境

今回使用した環境

クライアントPC:mac book pro
ブラウザ:chrome
AWS使用サービス:
 CodeStar、EC2(t2.micro)、Cloud9

前提

以下の手順は、IAMユーザで行っています。
AWSは、ルートアカウントとは別に管理アカウントを複数作成できます。
これらのアカウントをAWSでは、IAMユーザと呼んでいる様ですが、
こうして作成した、IAMユーザは、クレジット情報などへの
アクセスをさせずに、管理業務だけを委任したりできるため、大変便利です。
AWS アカウント内での IAM ユーザーの作成

CodeStarによる環境セットアップ

まず、EC2にnginx+railsの環境を作成するため、CodeStarを使用します。
EC2のインスタンスを起動して一から必要なものをインストールしても良いのですが、
CodeStar使用すると、その辺の事をよしなにやってくれます。

まず、キーペアがひとつ必要です。
無い場合は、下記の手順で作成しておきます。
Amazon EC2 のキーペア

作成し終えたら、CodeStarのコンソールにアクセスします。
AWSにログインした状態で、以下のアドレスです。
CodeStarコンソール

スクリーンショット 2017-12-19 22.34.37.png

「Start a project」をクリックして、テンプレート選択画面に遷移しましょう。

スクリーンショット 2017-12-19 22.37.31.png

作成可能なテンプレートがたくさん並んでいます。
Railsに関しては、AWS Elastic Beanstalk版とEC2版がありますが、
今回は、簡易的な動作確認ですので、EC2版を選択します。
おそらく、Sqlite3を使った1インスタンスの最小構成で作成されるはずです。
mysqlなどのRDBを使ったり、ロードバランサを置いたりしたい場合は、
AWS Elastic Beanstalk版を選択すると良いと思います。

次はプロジェクト名とリポジトリ名を入力します。

スクリーンショット 2017-12-19 22.44.17.png

両方ともに「RailsSample」にしました。
リポジトリ管理には、AWS CodeCommit か GitHub のどちらかを選択できます。
どちらを選んでも、Gitでのバージョン管理になります。
CodeCommitは、GitHubの簡易版の様な位置づけでしたが、
2017年11月には、pullリクエストの作成もサポートされたらしく
徐々に使える様になってきている感じでしょうか。

今回は、CodeCommitを選択しました。

Create Project を選択すると、キー選択画面がポップアップされますので、
はじめに作成したキーペアを選択します。

スクリーンショット 2017-12-19 22.55.12.png

使用するIDEを選択する画面になりました。
ここで、本題のAWS Cloud9が出てきます。

スクリーンショット 2017-12-19 22.57.18.png

ここは当然、Cloud9を選択してみました。

スクリーンショット 2017-12-19 23.00.43.png

Cloud9を動作させるためのインスタンスの種類を選択します。
無料枠で試すには、t2.micro を選択します。

スクリーンショット 2017-12-19 23.03.24.png

環境の準備中です。
至るところクルクルしてますので、
しばし、待ちます。(5分くらいかな…)

スクリーンショット 2017-12-19 23.10.37.png

デプロイステータスが上記の様になり、
ヘッダ部が以下の様に変わったら、準備OKだと思います。

スクリーンショット 2017-12-19 23.12.29.png

View your app でRailsのサンプル・アプリケーションにアクセスできます。

スクリーンショット 2017-12-19 23.14.42.png

しゃれおつ。

Start coding の方を選択すると、Cloud9の画面に遷移します。

AWS Cloud9

スクリーンショット 2017-12-19 23.23.59.png

IDEっぽいです。
ブラウザだけでこれだけできるなんて、時代が進んだのを感じます。

ディレクトリツリーを見ると、Railsっぽい環境になっているのがわかります。
下部のペインは、EC2のコンソールになっていて、
シェルコマンドはここから実行できます。

RailsUser01:~/environment/railssample (master) $ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
RailsUser01:~/environment/railssample (master) $ gem list

*** LOCAL GEMS ***

actioncable (5.1.4)
actionmailer (5.1.4)
actionpack (5.1.4)
actionview (5.1.4)
activejob (5.1.4)
activemodel (5.1.4)
activerecord (5.1.4)
activesupport (5.1.4)
arel (8.0.0)
bigdecimal (default: 1.3.0)
builder (3.2.3)
bundler (1.15.4)
bundler-unload (1.0.2)
concurrent-ruby (1.0.5)
crass (1.0.2)
did_you_mean (1.1.0)
erubi (1.7.0)
executable-hooks (1.3.2)
gem-wrappers (1.3.2)
globalid (0.4.1)
i18n (0.9.0)
io-console (default: 0.4.6)
json (default: 2.0.2)
loofah (2.1.1)
mail (2.6.6)
method_source (0.9.0)
mime-types (3.1)
mime-types-data (3.2016.0521)
mini_portile2 (2.3.0)
minitest (5.10.1)
net-telnet (0.1.1)
nio4r (2.1.0)
nokogiri (1.8.1)
openssl (default: 2.0.3)
power_assert (0.4.1)
psych (default: 2.2.2)
rack (2.0.3)
rack-test (0.7.0)
rails (5.1.4)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.0.3)
railties (5.1.4)
rake (12.0.0)
rdoc (default: 5.0.0)
rubygems-bundler (1.4.4)
rvm (1.11.3.9)
sprockets (3.7.1)
sprockets-rails (3.2.1)
test-unit (3.2.3)
thor (0.20.0)
thread_safe (0.3.6)
tzinfo (1.2.3)
websocket-driver (0.6.5)
websocket-extensions (0.1.2)
xmlrpc (0.2.1)

現環境では、rubyは2.4.1、railsは、5.1.4の様です。
何か機能を足してみましょう。

RailsUser01:~/environment $ cd ./railssample
RailsUser01:~/environment/railssample (master) $ rails g scaffold blog title:string body:text
Usage:
  rails new APP_PATH [options]

Options:
  -r, [--ruby=PATH]                                      # Path to the Ruby binary of your choice
                                                         # Default: /usr/local/rvm/rubies/ruby-2.4.1/bin/ruby
  -m, [--template=TEMPLATE]                              # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                              # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)

...以下略

おや?
エラーです。。。Usageが出ますね。。。

お気付きでしょうか?
ディレクトリツリーを見てわかる様にbinフォルダが存在しませんね。。。
なぜかは、わかりませんが、
rakeで作成できるはずなので、やってみます。

RailsUser01:~/environment/railssample (master) $ rake app:update:bin
Could not find gem 'passenger' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.

ん?
gem ‘passenger’ がいない?
確かに前述の gem list とGemfileの内容が一致していない様に思います。

bundle isntall します。

RailsUser01:~/environment/railssample (master) $ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Fetching rake 11.2.2
Installing rake 11.2.2
Fetching concurrent-ruby 1.0.2
Installing concurrent-ruby 1.0.2
Fetching i18n 0.7.0
Installing i18n 0.7.0
Fetching minitest 5.9.0
Installing minitest 5.9.0
Fetching thread_safe 0.3.5
Installing thread_safe 0.3.5
Fetching builder 3.2.2
Installing builder 3.2.2
Fetching erubis 2.7.0
Installing erubis 2.7.0
Fetching mini_portile2 2.1.0
Installing mini_portile2 2.1.0
Fetching pkg-config 1.1.7
Installing pkg-config 1.1.7
Fetching rack 2.0.1
Installing rack 2.0.1
Fetching nio4r 1.2.1
Installing nio4r 1.2.1 with native extensions
Using websocket-extensions 0.1.2
Using mime-types-data 3.2016.0521
Fetching arel 7.1.1
Installing arel 7.1.1
Using bundler 1.15.4
Fetching byebug 9.0.5
Installing byebug 9.0.5 with native extensions
Fetching coffee-script-source 1.10.0
Installing coffee-script-source 1.10.0
Fetching execjs 2.7.0
Installing execjs 2.7.0
Fetching method_source 0.8.2
Installing method_source 0.8.2
Fetching thor 0.19.1
Installing thor 0.19.1
Fetching debug_inspector 0.0.2
Installing debug_inspector 0.0.2 with native extensions
Fetching ffi 1.9.14
Installing ffi 1.9.14 with native extensions
Fetching multi_json 1.12.1
Installing multi_json 1.12.1
Fetching libv8 3.16.14.19 (x86_64-linux)
Installing libv8 3.16.14.19 (x86_64-linux)
Fetching rb-fsevent 0.9.7
Installing rb-fsevent 0.9.7
Fetching puma 3.0.0
Installing puma 3.0.0 with native extensions
Fetching ref 2.0.0
Installing ref 2.0.0
Fetching sass 3.4.22
Installing sass 3.4.22
Fetching tilt 2.0.5
Installing tilt 2.0.5
Fetching spring 1.7.2
Installing spring 1.7.2
Fetching sqlite3 1.3.11
Installing sqlite3 1.3.11 with native extensions
Fetching turbolinks-source 5.0.0
Installing turbolinks-source 5.0.0
Fetching tzinfo 1.2.2
Installing tzinfo 1.2.2
Fetching nokogiri 1.6.8
Installing nokogiri 1.6.8 with native extensions
Fetching rack-test 0.6.3
Installing rack-test 0.6.3
Fetching passenger 5.1.12
Installing passenger 5.1.12 with native extensions
Fetching sprockets 3.7.0
Installing sprockets 3.7.0
Fetching websocket-driver 0.6.4
Installing websocket-driver 0.6.4 with native extensions
Using mime-types 3.1
Fetching coffee-script 2.4.1
Installing coffee-script 2.4.1
Fetching uglifier 3.0.1
Installing uglifier 3.0.1
Fetching rb-inotify 0.9.7
Installing rb-inotify 0.9.7
Fetching therubyracer 0.12.3
Installing therubyracer 0.12.3 with native extensions
Fetching turbolinks 5.0.0
Installing turbolinks 5.0.0
Fetching activesupport 5.0.0
Installing activesupport 5.0.0
Fetching loofah 2.0.3
Installing loofah 2.0.3
Fetching mail 2.6.4
Installing mail 2.6.4
Fetching listen 3.0.5
Installing listen 3.0.5
Fetching rails-dom-testing 2.0.1
Installing rails-dom-testing 2.0.1
Fetching globalid 0.3.7
Installing globalid 0.3.7
Fetching activemodel 5.0.0
Installing activemodel 5.0.0
Fetching jbuilder 2.5.0
Installing jbuilder 2.5.0
Using rails-html-sanitizer 1.0.3
Fetching spring-watcher-listen 2.0.0
Installing spring-watcher-listen 2.0.0
Fetching activejob 5.0.0
Installing activejob 5.0.0
Fetching activerecord 5.0.0
Installing activerecord 5.0.0
Fetching actionview 5.0.0
Installing actionview 5.0.0
Fetching actionpack 5.0.0
Installing actionpack 5.0.0
Fetching actioncable 5.0.0
Installing actioncable 5.0.0
Fetching actionmailer 5.0.0
Installing actionmailer 5.0.0
Fetching railties 5.0.0
Installing railties 5.0.0
Fetching sprockets-rails 3.1.1
Installing sprockets-rails 3.1.1
Fetching coffee-rails 4.2.1
Installing coffee-rails 4.2.1
Fetching jquery-rails 4.1.1
Installing jquery-rails 4.1.1
Fetching web-console 3.3.1
Installing web-console 3.3.1
Fetching rails 5.0.0
Installing rails 5.0.0
Fetching sass-rails 5.0.6
Installing sass-rails 5.0.6
Bundle complete! 17 Gemfile dependencies, 67 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

入ったっぽい。
再度、rakeにトライ。
今度は。bundle execつき

RailsUser01:~/environment/railssample (master) $ bundle exec rake app:update:bin                                                                               
/usr/local/rvm/gems/ruby-2.4.1/gems/rake-11.2.2/lib/rake/ext/fixnum.rb:4: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:206: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:47: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:51: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:110: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:111: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
      create  bin
      create  bin/bundle
      create  bin/rails
      create  bin/rake
      create  bin/setup
      create  bin/update
RailsUser01:~/environment/railssample (master) $ 

できた。
再度、scaffold。

RailsUser01:~/environment/railssample (master) $ rails g scaffold blog title:string body:text
/usr/local/rvm/gems/ruby-2.4.1/gems/rake-11.2.2/lib/rake/ext/fixnum.rb:4: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:206: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:47: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:51: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:110: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:111: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/core_ext/numeric/conversions.rb:138: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
      invoke  active_record
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
      create    db/migrate/20171219144809_create_blogs.rb
      create    app/models/blog.rb
      invoke    test_unit
      create      test/models/blog_test.rb
      create      test/fixtures/blogs.yml
      invoke  resource_route
       route    resources :blogs
      invoke  scaffold_controller
      create    app/controllers/blogs_controller.rb
      invoke    erb
      create      app/views/blogs
      create      app/views/blogs/index.html.erb
      create      app/views/blogs/edit.html.erb
      create      app/views/blogs/show.html.erb
      create      app/views/blogs/new.html.erb
      create      app/views/blogs/_form.html.erb
      invoke    test_unit
      create      test/controllers/blogs_controller_test.rb
      invoke    helper
      create      app/helpers/blogs_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/blogs/index.json.jbuilder
      create      app/views/blogs/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/blogs.coffee
      invoke    scss
      create      app/assets/stylesheets/blogs.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
RailsUser01:~/environment/railssample (master) $ 

migrateも成功。

RailsUser01:~/environment/railssample (master) $ bundle exec rails db:migrate
/usr/local/rvm/gems/ruby-2.4.1/gems/rake-11.2.2/lib/rake/ext/fixnum.rb:4: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:206: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:47: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/digest_utils.rb:51: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:110: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/sprockets-3.7.0/lib/sprockets/processor_utils.rb:111: warning: constant ::Bignum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/activesupport-5.0.0/lib/active_support/core_ext/numeric/conversions.rb:138: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
== 20171219144809 CreateBlogs: migrating ======================================
-- create_table(:blogs)
   -> 0.0009s
== 20171219144809 CreateBlogs: migrated (0.0017s) =============================

/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated
/usr/local/rvm/gems/ruby-2.4.1/gems/concurrent-ruby-1.0.2/lib/concurrent/map.rb:230: warning: constant ::Fixnum is deprecated

このまま、コミットして、masterにpushします。

RailsUser01:~/environment/railssample (master) $ git add .
RailsUser01:~/environment/railssample (master) $ git commit -m 'blogs追加'
[master c39da40] blogs追加
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 28 files changed, 454 insertions(+), 1 deletion(-)
 create mode 100644 app/assets/javascripts/blogs.coffee
 create mode 100644 app/assets/stylesheets/blogs.scss
 create mode 100644 app/assets/stylesheets/scaffolds.scss
 create mode 100644 app/controllers/blogs_controller.rb
 create mode 100644 app/helpers/blogs_helper.rb
 create mode 100644 app/models/blog.rb
 create mode 100644 app/views/blogs/_form.html.erb
 create mode 100644 app/views/blogs/edit.html.erb
 create mode 100644 app/views/blogs/index.html.erb
 create mode 100644 app/views/blogs/index.json.jbuilder
 create mode 100644 app/views/blogs/new.html.erb
 create mode 100644 app/views/blogs/show.html.erb
 create mode 100644 app/views/blogs/show.json.jbuilder
 create mode 100755 bin/bundle
 create mode 100755 bin/rails
 create mode 100755 bin/rake
 create mode 100755 bin/setup
 create mode 100755 bin/update
 create mode 100644 db/migrate/20171219144809_create_blogs.rb
 create mode 100644 db/schema.rb
 create mode 100644 test/controllers/blogs_controller_test.rb
 create mode 100644 test/fixtures/blogs.yml
 create mode 100644 test/models/blog_test.rb
 create mode 100644 tmp/restart.txt
RailsUser01:~/environment/railssample (master) $ git config --global user.name "RailsUser01"
RailsUser01:~/environment/railssample (master) $ git config --global user.email test@test.com
RailsUser01:~/environment/railssample (master) $ git push
Counting objects: 47, done.
Compressing objects: 100% (44/44), done.
Writing objects: 100% (47/47), 8.65 KiB | 632.00 KiB/s, done.
Total 47 (delta 7), reused 0 (delta 0)
To https://xxxxx/v1/repos/RailsSample
   01dc390..c39da40  master -> master

すると、CodeStarの方で、pushを検知して、再びデプロイが始まります。
デプロイが終わったら、/blogsでアクセス。

スクリーンショット 2017-12-20 0.01.55.png

できたっぽい。
layoutが、しゃれおつのままなので、逆に見た目がアレですが、
一応、これで、コーディングして行けるっぽいです。

この先のこと

この環境では、EC2(Cloud9開発環境) -> EC2(動作確認環境)にいちいちデプロイして
確認することになるので、ちょっと面倒。
実用的に使うには、EC2(Cloud9開発環境) だけで、動作確認できる様にして、
ステージングやプロダクション環境には、必要に応じてデプロイ出来る様にしたいですね。

EC2(Cloud9開発環境)側にenginxを入れるか、
何かしらの制限付きでpumaのポートを開放するかになるのかな?
まだまだ、いろいろ試せそうな感じですが、
Cloud9ともども、おいおい試していきたいです。

試すだけなら無料枠で出来るので、皆様もいつかの機会にどうでしょうか?
今回はここまでです。

続きを読む

スマートホームスキルの作成 – Cognito User Poolsを使って

スマートホームスキルとは

スマートホームスキルは、カスタムスキルと異なり、ユーザーが発話した内容を、プログラム用意なパラメーターにまで分解して呼び出してくれます。例えば、照明をつける場合、「Alexa、端末名をオンにして」といういうと、以下のようなDirectivesという形でスマートホームスキルが呼び出されます。

{
  "directive": {
    "header": {
      "namespace": "Alexa.PowerController",
      "name": "TurnOn",
      "payloadVersion": "3",
      "messageId": "1bd5d003-31b9-476f-ad03-71d471922820",
      "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg=="
    },
    "endpoint": {
      ...
}

一般的なWebAPIの呼び出しと変わらない形で呼んでくれますので、会話の組み立てなどを考える必要がなく開発する側は非常に楽です。

image.png

カスタムスキルの場合は、会話が分解されて文字列としてスキル側に渡されます。そののため各言語ごとの処理が必要になります。しかしスマートホームスキルの場合は、その辺りの処理はAlexaが行ってくれるので、他言語化対応ができます。

以下の照明のON/OFFの場合、英語(米国)、英語(英国)、英語(インド)、ドイツ語、日本語の5ヶ国語に対応が可能です。
https://developer.amazon.com/ja/docs/device-apis/alexa-powercontroller.html

やりたいこと

自前デバイスを制御するためのスマートホームスキルの作成方法を理解する。デバイスは自前クラウド経由で制御が可能。自前クラウドはCognito User Poolsでアカウント管理を行っており、AlexaのAmazonアカウントと連携して制御可能とする。(アカウントリンク)

開発者コンソールでスキルの登録

Amazon開発者コンソールでスキルを登録します。
https://developer.amazon.com/home.html

スクリーンショット 2017-12-17 12.30.01.png

以下のように設定してスキルを作成します。後からLambdaなどの設定をするので、まずははアプリケーションIDだけ取れれば良いです。
スクリーンショット 2017-12-17 12.30.41.png

AWS Lambdaでスマートホームスキルの作成

AWSコンソールでスマートホームスキルをLambdaで作成します。Lambdaには、スマートホームスキルの雛形が用意されていますので、まずはそれを利用します。”設計図”、”alexa-smart-home-skill-adapter”を選択します。Amazonに確認したわけではないですが、tokyoリージョンにLambdaを作成した時は後にエラーになりました。us-east-1を選択して下さい。
スクリーンショット 2017-12-17 16.42.19.png

以下のようにLambdaの設定をします。アプリケーションIDは先ほど作成したスマートホームスキルのIDを設定します。
スクリーンショット 2017-12-17 16.57.45.pngスクリーンショット 2017-12-17 16.57.53.png

Lambdaが作成されました。後ほどARNをスキルの設定で利用します。
スクリーンショット 2017-12-17 17.03.40.png

Cognito User Poolsの設定

次にアカウント管理のためのCognito User Poolsの設定をしていきます。AWSコンソールよりユーザープールを作成します。ステップに従って設定するを選択します。
スクリーンショット 2017-12-17 17.07.23.png

スクリーンショット 2017-12-17 17.08.28.png

基本的な仕組みを確認するためなので、属性などはここでは必要ありません。以下のように設定をしていきます。

  • 属性

    • 標準属性 – なし
    • カスタム属性 – なし
  • ポリシー
    • パスワード強度:デフォルト 8文字
    • ユーザーの自己サインアップ:デフォルト 許可する
    • 有効期限:デフォルト 7日間
  • MFA
    • MFA:OFF
    • 検証:e-mailのみ
  • メッセージのカスタマイズ
    • E メール検証メッセージをカスタマイズ:デフォルト
    • ユーザー招待メッセージをカスタマイズ:デフォルト
    • E メールアドレスをカスタマイズ:デフォルト
  • タグ/デバイスはスキップして次へを選択
  • 「アプリクライアント」で「アプリクライアントの追加」

スクリーンショット 2017-12-17 17.34.02.png

あとは次へを選択してプールを作成。次にスマートホームスキルに設定するための以下の二つの情報を取得。

  • アプリクライアントID
  • 「アプリの統合」「ドメイン名」をクリックして、適当なドメインを設定
    スクリーンショット 2017-12-17 17.45.42.png

スクリーンショット 2017-12-17 21.45.48.png

スキルの設定

Alexaのコンソールの設定に戻って、以下の設定をします。

  • LambdaのARNの設定
  • アカウントリンクの設定

スクリーンショット 2017-12-17 21.47.49.png

スクリーンショット 2017-12-17 21.48.01.png

コールバックURIは次の設定で利用します。

スクリーンショット 2017-12-17 21.49.00.png

Cognito User PoolsにコールバックURIの設定

先ほど取得したOAuthのコールバックURIを以下のように設定します。

スクリーンショット 2017-12-17 22.00.35.png

動作確認

後ほどアップデートします

続きを読む

Solve a AWS IoT script problem

さらに表示: aws linux script, aws bash script, youtube clone script problem upload, aws download script, php script price details products ebay amazon, linux php send mail script problem, instal script login details website dreamweaver, connect aws java script, shell script file details, telebid script … 続きを読む