やーまんぶろぐ

気が向いた時にだけ書くブログ

5.X系のElasticSearch + KibanaをMacにインストール

本日、Elastic{ON}Tour 2016に参加します。
Tokyo 2016 | Elastic

準備として、5.X系のElasticSearch + KibanaをMacをインストールしたので手順をメモしておきます。

こちらを参考にしながらインストールしました。
innu.hateblo.jp

最新版の5.1.1をMacにインストールしました。

ElasticSearchダウンロード

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gz
$ tar xvzf elasticsearch-5.1.1.tar
$ cd elasticsearch-5.1.1
$ ./bin/elasticsearch
$ open http://localhost:9200

JSONが表示されたらOKです。

Kibanaダウンロード

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.1.1-darwin-x86_64.tar.gz
$ tar xvzf kibana-5.1.1-darwin-x86_64.tar.gz
$ cd kibana-5.1.1-darwin-x86_64
$ ./bin/kibana
$ open http://localhost:5601

リッチなUIが表示されたらインストールOKです。

最後に

だいぶ昔のバージョンと、AWSのマネージドなElasticSearchしか触ったことがないので最新版でどんなことができるのか楽しみです。
本当はもっと触ってから参加する予定だったのですが、時間取れなかったです。。

会場に向かう電車でAdvent Calendar 2016くらい目を通してから参加したいと思います。
qiita.com

Serverless Web Application Workshop をCLIでやってみた Lab2: Beta Sign-up Mailing List

サーバーレスアーキテクチャ Advent Calendar 2016 の13日目の記事です。

「Serverless Web Application Workshop をCLIでやってみた Lab 1: Static Website Hosting」 の続きになります。
yamano3201.hatenablog.jp

大枠はこちらで紹介されています。
qiita.com

コンソールでの手順はREADMEに記載されています。
github.com

(できるだけ)CLIに置き換えてみたものをメモしていきます。
作業はMacで、リージョンはバージニアを想定して書いてます。

ワークショップは全部で4つあります。

  • Lab 1: Static Website Hosting
  • Lab 2: Beta Sign-up Mailing List
  • Lab 3: Administrative Interface
  • Lab 4: Product Update Blog

今回はLab 2: Beta Sign-up Mailing Listについて書いていきます。

やること

ベータサービスにユーザがサインアップするメーリングリストを作成。認証のいらないユーザなので、Cognito identity poolとIAM policyを使って、DynamoDBにメールアドレスが書き込まれ、DyanmoDB StreamsからのLambda連携で確認メールをSESを使って配信する。一般ユーザがサインアップ後、確認メールが自身のメールアドレスに届く事を確認する。

送信元メールアドレス検証

  • XXX@XXXXXX.XXXにはメールが受け取れる自分のアドレスを設定しましょう。
  • 登録した送信元メールアドレスに検証要求メールが届くので、リンクをクリックして検証しましょう
$ export EMAIL_ADDRESS=XXX@XXXXXX.XXX
$ aws ses verify-email-identity --email-address ${EMAIL_ADDRESS}

LambdaとSESにアクセス可能なIAMロールの作成

  • LambdaとSESにアクセスできるIAMロールを作成しておきます。
  • ロールを作成してからポリシーをアタッチします。
  • 後半のLambda作成まで出番はありません。
$ export ASSUME_ROLE=assume_role.json
$ cat << EOF > ${ASSUME_ROLE}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
$ aws iam create-role --role-name LambdaSESRole --assume-role-policy-document file://${ASSUME_ROLE}
$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonSESFullAccess --role-name LambdaSESRole
$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole --role-name LambdaSESRole

Emailの値を取得するためのAmazon DynamoDBテーブルを作成

  • DynamoDBテーブルを作成します。
  • 後で使うのでTableArnをレスポンスから取得しておきます。
$ aws dynamodb create-table --table-name Wildrydes_Emails --attribute-definitions AttributeName=Email,AttributeType=S --key-schema AttributeName=Email,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 > dynamodb.json

$ export TABLE_ARN=$(cat dynamodb.json | jq -r '.TableDescription.TableArn')

認証のいらないユーザがアクセス可能なAmazon Cognito IDプールの作成

$ aws cognito-identity create-identity-pool --identity-pool-name wildrydes --allow-unauthenticated-identities > cognito.json
export COGNITO=$(cat cognito.json | jq -r '.IdentityPoolId')

認証のいらないユーザ用のIAMロールの作成とポリシーの付与

  • 手順通りコンソールからだと自動で作成されてセットされるので圧倒的にラクできます。無理やりCLIからIAMロール作成してみました。
  • Unauth Role(認証のいらないユーザ用のロール)につけるポリシーで、DynamoDBにPUTアクションを許可する設定を追加します。
  • READMEの手順で作るとAuth Roleにのみつくので注意しましょう。ここでの手順はUnauth Roleのポリシーも変更する手順としているので順番にコピペすれば大丈夫です。
  • 直接は使わないけどAuth_Roleも作成しておきます。おそらく作成してアタッチしないとダメな気がする。
$ export COGNITO_AUTH_ROLE=cognito_auth_role.json
$ cat << EOF > ${COGNITO_AUTH_ROLE}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "${COGNITO}"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
EOF

$ aws iam create-role --role-name Cognito_wildrydesAuth_Role --assume-role-policy-document file://${COGNITO_AUTH_ROLE}
$ export COGNITO_POLICY=cognito_policy.json
$ cat << EOF > ${COGNITO_POLICY}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "dynamodb:PutItem",
      "Resource": "${TABLE_ARN}"
    }
  ]
}
EOF
$ aws iam put-role-policy --role-name Cognito_wildrydesAuth_Role --policy-name oneClick_Cognito_wildrydesAuth_Role --policy-document file://${COGNITO_POLICY}
  • 認証のいらないユーザ用のIAMロールの作成とポリシーの付与
$ export COGNITO_UNAUTH_ROLE=cognito_unauth_role.json
$ cat << EOF > ${COGNITO_UNAUTH_ROLE}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "${COGNITO}"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}
EOF
$ aws iam create-role --role-name Cognito_wildrydesUnauth_Role --assume-role-policy-document file://${COGNITO_UNAUTH_ROLE}
$ aws iam put-role-policy --role-name Cognito_wildrydesUnauth_Role --policy-name oneClick_Cognito_wildrydesUnauth_Role --policy-document file://${COGNITO_POLICY}

作成したAWS Cognito IDプールに作成したロールをセット

  • けっきょくCLIからAuthenticated role, Unauthenticated roleのアタッチがわかりませんでした。。
  • コンソールからアタッチしてください。。

ワークショップ用に用意されたlab2のファイルをS3にsync

  • アプリコードは用意されたものを使います。
  • regionとIDプールを今回のものに書き換えてからsyncします。
$ sed -i -e "s/region: \'\'/region: \'us-east-1\'/" lab2/scripts/config.js
$ sed -i -e "s/identityPoolId: \'\'/identityPoolId: \'${COGNITO}\'/" lab2/scripts/config.js
$ aws s3 sync lab2/ s3://${BUCKET_NAME}

CloudFront経由でアクセスしてSIGN UP

  • Lab1で作成したCloudFront経由でアクセスしましょう。
  • 画面の下のほうにあるSIGN UP画面からSIGN UPしましょう。
$ open https://$(cat cloudfront.json | jq -r '.Distribution.DomainName')

f:id:yamano3201:20161213004224p:plain

  • 最初に検証したメールアドレスを入力、エンターして、[SIGN UP]の文字が[THANK YOU]に変化することを確認しましょう。
  • これでDynamoDBにPUTされたことを確認しましょう。
  • PCのSafari, Chromeの場合はSUBMITボタンが押せなかったのでenterを押しましょう。
  • iPhoneSafariの場合はSUBMITボタンを押せました。

SESを使ってメールを送信するLambdaを作成

  • 最初に作ったLambdaSESRoleのARNを使います。
  • ロジックはREADMEに書かれているコードをコピーします。変更後のDynamoDBテーブルの値宛にメールを送信するコードになっています。
  • 環境変数で最初に検証したメールアドレスを渡しています。
  • コードはzip化して渡します。
$ export LAMBDA_SES_ROLE=$(aws iam get-role --role-name LambdaSESRole | jq -r  .'Role.Arn')
$ cat << EOF > index.js
var AWS = require('aws-sdk');
var ses = new AWS.SES({apiVersion: '2010-12-01'});

exports.handler = (event, context, callback) => {
  event.Records.forEach((record) => {
    var params = {
      Source: process.env.EMAIL_ADDRESS,
      Destination: {
        ToAddresses: [record.dynamodb.NewImage.Email.S]
      },
      Message: {
        Body: {
          Html: {
            Data: '<html><h1>Thank you!</h1><p>Wild Rydes is coming soon! Stay tuned for more info about unicorns near you!</p></html>'
          },
          Text: {
            Data: 'Wild Rydes is coming soon! Stay tuned for more info about unicorns near you!'
          }
        },
        Subject: {
          Data: 'Wild Rydes Limited Private Beta Confirmation'
        }
      }
    };

    ses.sendEmail(params, (err, data) => {
      if (err) context.fail(err);
      else     context.succeed(null);
    });
  });
};
EOF
$ export EMAIL_FUNCTION=email_function
$ zip -r ${EMAIL_FUNCTION}.zip index.js
$ aws lambda create-function --region us-east-1 --function-name ConfirmationEmail --role ${LAMBDA_SES_ROLE} --runtime nodejs4.3 --handler index.handler --zip-file fileb://${EMAIL_FUNCTION}.zip --environment Variables={EMAIL_ADDRESS=${EMAIL_ADDRESS}}

DynamoDBのトリガーを作成

  • Stream ARNを取得して使用します。
  • Lambdaコマンドからストリームをイベントソースとして設定します。
  • イベントソースにはAmazon KinesisストリームかAmazon DynamoDBストリームしか指定できません。
$ export STREAM_ARN=$(aws dynamodbstreams list-streams | jq -r '.Streams | map(select(.TableName == "Wildrydes_Emails"))' | jq -r '.[].StreamArn')
$ aws lambda create-event-source-mapping --event-source-arn ${STREAM_ARN} --function-name ConfirmationEmail  --enabled --batch-size 1 --starting-position LATEST

電子メールが送信されることを確認

  • 再度CloudFront経由でアクセスしてSIGN UPしましょう。
  • 手順の例では最初に検証したアドレスに+1の文字列を付与して、XXX+1@XXXXXX.XXX と入力してenterを押しています。
  • SIGN UPしたアドレス宛に、最初に検証したメールから送信されていたら完成です。

最後に

毎回思いますけどLambdaのデバッグが大変ですね。Lambda開発のベストプラクティスも調べて実践してみたいです。

残りもやっていきたいと思います。

Serverless Web Application Workshop をCLIでやってみた Lab 1: Static Website Hosting

サーバーレスアーキテクチャ Advent Calendar 2016 の10日目の記事です。Advent Calendar初参加になります。

先日、AWS re:Invent 2016 Recap に参加しました。
jawsug-yokohama.connpass.com

各スピーカーからAWS re:Invent 2016 の体験記を聞くことができました。今年は大量のサービスが出ていてキャッチアップが大変ですね。。

勉強会の中でAWS re:Invent 2016でサーバレスのワークショップが開催されてたことを知りました。
qiita.com

手順は英語ですがREADMEに詳細に書かれているので、読みながら簡単にできそうです。サーバレスならお金も安いので、個人アカウントで試せて安心ですね。
github.com

コンソールでの作業を、(できるだけ)CLIに置き換えてみたのでメモを載せていきます。
作業はMacで、リージョンはバージニアを想定して書いてます。

ワークショップは全部で4つあります。

  • Lab 1: Static Website Hosting
  • Lab 2: Beta Sign-up Mailing List
  • Lab 3: Administrative Interface
  • Lab 4: Product Update Blog

今回はLab 1: Static Website Hostingについて書いていきます。

やること

静的なウェブサイトをホストする為にS3 bucketを作成・設定。グローバル展開をする為にCloudFrontの設定・配信する。CloudFrontのURLからサイトが表示される事を確認。

Setup

  • AWSCLIやjqなど入ってなければインストールしておきましょう。
  • AWS configureでAccessKey, SecretAccessKeyは自分のもの、regionはus-east-1を指定しておきましょう。
git clone https://github.com/awslabs/aws-serverless-website-workshop.git
cd aws-serverless-website-workshop

バケット作成

  • バケットはユニークでなければダメなので、XXXXXXは読み替えて下さい。
$ export BUCKET_NAME=XXXXXX-wildrydes
$ aws s3 mb --region us-east-1 s3://${BUCKET_NAME}

・ポリシー追加

$ export PUBLIC_POLICY=public.json
$ cat << EOF > ${PUBLIC_POLICY}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::${BUCKET_NAME}/*"
    }
  ]
}
EOF
$ aws s3api put-bucket-policy --bucket ${BUCKET_NAME} --policy file://${PUBLIC_POLICY}

Static Website Hostingを有効にする

$ aws s3 website s3://${BUCKET_NAME} --index-document index.html

ワークショップ用に用意されたlab1のファイルをS3にsyncする

  • アプリコードは用意されているものを使います。

- 自分で作成したアプリコードがあれば、そちらをsyncするのも良いと思います。

  • Lab2も続きになるので用意されてるものを使いましょう。
$ aws s3 sync lab1/ s3://${BUCKET_NAME}

ブラウザで開く

  • SPAで動いているサービスを確認できると思います。
open http://${BUCKET_NAME}.s3-website-us-east-1.amazonaws.com

CloudFront作成

  • CloudFrontのCLIはまだプレビューになるので、まずは有効にしましょう。
$ aws configure set preview.cloudfront true
  • 次の設定変更に使用したいので、作成時に出力されるjsonをファイルに出力しておきます。
$ aws cloudfront create-distribution --origin-domain-name ${BUCKET_NAME}.s3-website-us-east-1.amazonaws.com > cloudfront.json

TTL変更

  • update用のjsonがうまく作れなかった。。
  • 作成時に出力されたjsonをうまく修正して、DefalutTTLを5に変更して、下のコマンドでアップデートできそうなのですが。。
$ aws cloudfront update-distribution --cli-input-json file://cloudfront.json
  • うまくいかないのでコンソールから手動で変更してコマンドは無視して下さい。

CloudFront経由で開く

  • StatusがDeployedになってから開いてください。2, 3分かかります。
  • 作成時のjsonからDomainNameを取り出して、ブラウザで開きます。
  • CloudFront経由で確認できたら完成です。
$ open https://$(cat cloudfront.json | jq -r '.Distribution.DomainName')

f:id:yamano3201:20161210080015p:plain

  • めんどいからやらないけど、S3に直接アクセスできる状態で終わりなの気持ち悪いな。。

最後に

ほとんどコピペでできるようになったのではないでしょうか。
あまりCLI触ったことない人は試してみてはどうでしょう。

残りも順番にやっていきたいと思います。

待ってました!Fire TV Stickを1250円オフの3730円で購入

待ってました!Fire TV Stickを1250円オフの3730円で購入しました!12/12までセールみたいです。
f:id:yamano3201:20161207224832j:plain

Amazon ファミリーに加入

前から欲しかったFire TV Stickを安く買えるということで、これを機にAmazon ファミリー(Amazon Prime)に加入しました。

Amazon ファミリーに加入すれば、年会費分のポイントがもらえるのでお得ですね。
Amazon.co.jp ヘルプ: Amazonファミリー特典の3,900円クーポンについて

購入

amazonのリンクから購入しました。

Fire TV Stick

Fire TV Stick

セットアップ

同梱の説明書とテレビ画面上の指示に従えば、簡単にセットアップ可能です。
リモコン操作もしやすいですね。
f:id:yamano3201:20161207224924j:plain

iOSアプリもインストールしておきました。

Amazon Fire TV Remote

Amazon Fire TV Remote

  • AMZN Mobile LLC
  • ユーティリティ
  • 無料

プライムビデオ視聴

さっそくプライムビデオ限定配信の松本人志のドキュメンタルというお笑い番組をみてみました。
Amazon CAPTCHA

限定配信の映像作品がみれるのも良いところですね。

最後に

PCをテレビにつないで見れば同じことはできていたのですが、やはり操作の簡単さが違いますね。

他にもFire TV Stick用のアプリでYoutubeの視聴やゲームなどもできるみたいですね。もう少し触ってみたいと思います。

LINEスタンプが8個から販売可能になりました

LINEスタンプが8個から販売可能になりました。
creator-mag.line.me

16個作成した時点で挫折していたので嬉しい変更です!

新作スタンプ

このブログのタイトルでもあるやーまんのためのスタンプです。
store.line.me

過去スタンプ

前回は40個作成して申請しました。なかなか大変でした。。
yamano3201.hatenablog.jp

自作ツール

以前スマホから画像をアップロードするアプリと、LINEスタンプ登録用画像に変換する仕組みを使っていたので使用してみました。
yamano3201.hatenablog.jp
yamano3201.hatenablog.jp

使い勝手は微妙でした。。
自動リサイズは嬉しかったのですが、自動で透過画像にするところでノイズが乗りまくりでけっきょく手作業になってしまいました。。

最後に

写真が使用可能になったので、次回は写真のスタンプを作成してみたいと思います。

AmazonDashButtonでワンプッシュで商品購入してみた

12/5にAmazon Dash Buttonが発売されました。

ボタンを通じた初回注文時に500円差し引かれるので実質無料になるということで、
ちょうど洗剤がなくなりかけてたのでジョイ Dash Buttonをさっそくポチってみました。

ジョイ Dash Button

ジョイ Dash Button

届いたAmazonDashButtonはこちらになります。
f:id:yamano3201:20161207205649j:plain

設定方法は下のリンクを参考にしました。わかりやすくて簡単に設定することができました。
umedasuki.com

私はこちらの商品を紐付けました。

さっそくワンプッシュしてみると緑色のランプが点灯して購入完了のようです。

スマホで購入情報を見てみるとちゃんと500円引きで購入できていることがわかります。
f:id:yamano3201:20161207210547p:plain

簡単ですね。無料なので試してみてはいかがでしょうか。

AWS認定試験の無料問題集一覧

認定試験を受けようと考えているのですが、良くある資格の問題集らしきものが見当たりませんでした。

そこでネットにあった数少ない無料の問題集をまとめてみました。

AWS認定試験の無料で受けられる問題集

AWS公式のサンプル問題集

aws.amazon.com

  • 問題数8 + 6 + 10 + 9 + 10 => 43問
  • アソシエイトだけでなくプロフェッショナルの問題もあり
  • プロフェッショナルの問題は問題文が長め

Amazonクラムメディアの試用版

www.japancert.com

  • 問題数6問
  • 有料版PDFは5925円

AWS WEB問題集で学習しよう」のサンプル問題集とフリープランの問題集

サンプル問題集 – AWS WEB問題集で学習しよう

  • サンプル問題12問 + フリープラン問題21問 + 試験問題
  • 問題はオリジナル
  • 試験問題は問題集からの抜粋
  • シルバープランは1580円/30日で問題数は159問
  • ゴールドプランは3080円/60日 or 3680円/90日で問題数は641問以上で随時追加

最後に

まずは無料の82問に挑戦したいと思います。

模擬試験が2000円かかることを考えると、「AWS WEB問題集で学習しよう」のシルバープラン1580円が魅力的に見えてきますね。。

いきなり本番に挑戦するか、2000円の模擬試験に挑戦するか、1580円払って追加で159問受けるかは一通り無料の問題が終わってから考えたいと思います。