ヤサイブログ

徒然と。I'll keep hacking on fun.

AWS Innovate Japan 2018でINNOVATE CHAMPION バッジを取得した話

書く場所が思いつかないからここで(´・ω・`)
PS3のトロフィーというのはご存知でしょうか。
トロフィーは達成項目のようなもので、ゲームタイトル毎に存在します。
例えば、ゲームを最初にクリアするとそれを表明するトロフィーが獲得できます。

このような達成項目システムは、ハマる人はハマりますし、興味がない人は全く興味がありません。
AWSが開催しているAWS Innovate Japan 2018でも、
同じような機能でバッジというものが獲得できます。


今回、INNOVATE CHAMPIONバッジを取得できました。13番目らしい。
f:id:yasay:20180925104945p:plain

どうやったら取得できるのか

AWS Innovate Japan 2018で全てのバッジを取得し、
全てのセッションアンケートに答えることで取得できるらしいです。

"らしい"というのは、どうもバッジ取得システムに不具合があるような気がしています。
取得タイミングに不具合があると見受けられるケースがあります。
そして、最高10000スコアで設計されてたのに、
不具合で9500しか取得できないようになっているように見えます・・。
※Virtual Summit Osakaバッジが3種類取得できるケースがあるようです。

なので、INNOVATE CHAMPIONバッジを取得している人自体が少ないような気がします。

修了証明証がメールでもらえる。

この修了証明証をどうすればビジネスに活かせるのか皆目検討がつきませんが、なんかもらえます。
f:id:yasay:20180925110754p:plain

Ask The Expertで質問した内容をここで共有してみる。

1. CloudFormationで既存リソースを管理したい

Q:

CloudFormationで質問になります。
やりたいことは、マネージメントコンソールで作成したAWSリソースもスタック管理したいです。
CloudFormationはスタック作成時に、AWSリソースのIDが払い出されるとの認識です。
マネージメントコンソールから作成した(CloudFormationではない)既存リソースには既にAWSリソースIDが存在します。
この場合に、既存リソースのIDを指定して既存リソースのスタックを作成することは可能でしょうか。

A:

CloudFormation外で作成した既存リソースをStackに含めることはできません。一旦削除の上、そのリソースも含めた上でStackを再作成ください。

2. Raspberry PIによるAWS IoTの利用について

Q:

AWSのIoTサービスを利用していみたいと思っているのですが、
入門としてRaspberry piを利用してIoT Coreの利用や、Greenglassによるエッジコンピューティングの利用は可能でしょうか?
Raspberry piを利用したハンズオン資料などがあれば共有頂ければ幸いです。

A:

Raspberry Piを利用してAWS IoT CoreとGreengrassを利用することは可能です。こちらにそれぞれのチュートリアルがありますので、参考にしてみてくださ。https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sdk-setup.html https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/gg-gs.html

3. FREERTOSが利用できる端末

Q:

FREERTOSが利用できる端末は御社のページなどで紹介されていますでしょうか?

A:

現在Amazon FreeRTOSでサポートされているハードウエアはこちらから確認できます。https://aws.amazon.com/jp/freertos/getting-started/

4. AWS IoT Device Managementの無料枠について

Q:

AWS IoT Device Managementは無料枠を設けていますでしょうか?Lambdaなどと同様の永年無料枠はありますか?

A:

AWS IoT Device Managementには、複数の機能があり、それぞれ、料金が設定されております。Jobの機能は、一部、無料枠で提供しております。以下のURLを確認ください。(https://aws.amazon.com/jp/iot-device-management/pricing/

5. フリートのインデックス利用について

Q:

AWS IoT Device Managementに関する質問をさせて下さい。
フリートのインデックス作成で作成したインデックスはどのように利用できますか?
主にマネージメントコンソールからAWS IoT Device Management起動しての利用になりますか?
例えば、プログラマブルにアクセス可能なAPIなどの提供はしていますか?

A:

APIは用意されております。 https://docs.aws.amazon.com/ja_jp/iot/latest/apireference/Welcome.html APIを利用する際には、呼び出しの制限にご注意ください。 https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_iot

Innovate Japan 2018自体はとても良いイベント

良質なセッションをどこでも閲覧することができ、
Ask The Expertにより疑問点を質問することができました。
特に最近の技術的トレンドであるマシンラーニング、コンテナ、IoTに関して
注力して学ぶことができるのは大きなメリットでしょう。


以上です!

Mac mini 2011をサーバーとして使っていた時の設定をまとめる!

数ヶ月の間、
Mac mini 2011を外出先からアクセスできる
Webアプリケーションサーバーとして稼働していました。
理由としては・・・

  • Mac miniは省電力
  • Iaasの仮想マシンを利用する場合、安いプランだと性能が貧弱だったりする。
  • だったらメモリ8GB積んでるMac miniをサーバーとして利用すればいいんじゃね。

的な内容でした。しかしながら、無線LANで運用している状況で、
WiFiネットワークの切断がよく発生しました。さらに言うと、
Macファイアウォール機能を無効にしないと外部からアクセスできない状況が確認でき、
セキュリティ的にもどうなのかなということで、今はサーバーを停止しています。

その時にどのように設定したのかをまとめます。

ルーターの設定

ルーターの機種によって変更箇所は異なると思います。あくまでご参考までに。

プライベートIPアドレスの固定

Mac miniMACアドレスとプライベートIPを紐づけて、プライベートIPアドレスを固定する。
参考画像:
f:id:yasay:20180923190848p:plain

ポート転送の指定

グローバルIPアドレスにアクセスした場合に、Mac miniの80番ポートに転送するように設定する。
参考画像:
f:id:yasay:20180923191022p:plain

Nginxの設定

リバースプロキシの変更

Nginxはbrewを使ってインストールしました。
当初はSpring Bootで稼働するWebアプリケーションと
Kibanaに外部からアクセスしたかったので、Nginxでリバースプロキシの設定をしました。

/user/local/etc/nginx/nginx.confの修正

# 下記のようにリバースプロキシの設定を行なっていた。
# "/sb"がSpring Boot
# "/kibana"がKibana
# server_nameにはドメインを設定(多分不要な設定)
    server {
        listen       80; 
        server_name  .xxx.xx;

        access_log  /var/log/nginx/host.access.log  main;

        location / { 
            root   html;
            index  index.html index.htm;
        }   

        location /sb {
            proxy_pass  http://localhost:8080/;
        }   

        location /kibana/ {
                proxy_pass http://localhost:5601;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                rewrite /kibana/(.*)$ /$1 break;
        } 
    }

Dynamic DNSの設定

MyDNSというサービスを使います。
www.mydns.jp

ドメインの登録

画像を参考に、ドメインを初期登録する。
f:id:yasay:20180924020041p:plain

IPアドレスの登録

グローバルIPアドレスを登録する。
※この時、IPv6アドレスは適当でしたがWANからのアクセスは問題なくいけました。
f:id:yasay:20180924020052p:plain

Mailの設定

MyDNSにIPアドレスを通知する仕組みを作る必要があります。
私の場合、IPv4アドレスは固定のようですが、IPv6アドレスが固定ではありませんでした。
ですので、設定します。Macのメールアプリを使ってアカウント登録します。
メールアプリは起動しっぱなしにします。

アカウントの登録

f:id:yasay:20180924020418p:plain

  • メールアドレス:myDNS.JP の ID@mydns.jp
  • ユーザー名:myDNS.JP の ID
  • パスワード:myDNS.JP の PASSWORD
  • アカウントの種類:POP
  • メールサーバ:mail.mydns.jp

ドメインの設定

ネームサーバーの変更

取得したドメインのネームサーバーを変更します。
私の場合はムームードメインを利用。
f:id:yasay:20180924020514p:plain

  • ネームサーバ1:ns0.mydns.jp
  • ネームサーバ2:ns1.mydns.jp

Mac miniの設定

Firewallのオフ

Firewallをオフにしないと外部ネットワークから接続できなかった。
「設定」→「セキュリティとプライバシー」から、「ファイアウォール」を選択。
ファイアウォールを切に設定する。
参考画像:
f:id:yasay:20180923192004p:plain

上記の設定によりWANからWebアプリケーションサーバーにアクセスできるようになりました!
LAN内だとドメインで名前解決できないという現象が発生していましたが、
その場合はプライベートIPでアクセスすればよかったので特に不便を感じていませんでした。

以上です!

Alexaスキル「五月雨(さみだれ)の音」がスキルストアに公開されてから3ヶ月が過ぎました。

実は2018年6月にAlexa Skillを公開していました。
早いもので、もう3ヶ月が過ぎました。
www.amazon.co.jp

北米だと審査のフローが自動化されているようですが、
日本用のスキルの場合、審査をAlexaチームの審査担当者が行ってくれました。

初めてのスキル公開だったので3回くらいリジェクトされましたが、
審査担当者の方がとても丁寧に対応してくれましたので、無事に公開までこぎつけました。

やっていることは簡単で、雨の音をループして流すだけです。
個人的に仕事に集中する時などに欲しかったので、作りました。

SlideShare

SlideShareでデプロイ方法や運用費なども共有していますので、よろしければご参照下さい!

www.slideshare.net

GitHub

スキルはGitHubでソースを公開していますので、
その気になれば同じようなスキルを複製できますよ。試してみてください。
※その際はご連絡頂けると嬉しいです。
github.com

スキルを公開していいこともあった。Echo Dotをもらえた!

初月に100人以上のユニークユーザーに使ってもらえたので、
Echo Dotを無料もらえるクーポンをゲットできました。
ありがとうございます、ありがとうございます。m(_ _)m
もらったEcho Dotは勉強会とかに持っていく用途にしようと思います。

実際にスキルの統計レポートとか見ていると、
自分が作ったスキルがどれくらい利用されているのか見れるので、
結構ワクテカなんですよねー。

個人的に思うことは、これ以上利用者が増えても運用費が増えるだけなので、
課金の仕組みとか作らない限り困ったことになりそうってこと
ですw

できれば今後も何かしらスキルを作っていければと思います。
コードが負債にならないよう、リファクタリングもしていきたい・・。

以上です!

Spring Boot 2.0で、組み込みTomcatのSecure設定を有効にする

本エントリーは下記バージョンで動作確認しています。

Java 9.0.4
Srping Boot 2.0.1.RELEASE

動機

ALBをリバースプロキシのように利用して、
SSL証明書をALBに適用していました。
この状況下でSpring Securityによるログイン処理を行った場合に、
httpページに遷移してしまう現象が発生しました。

解決策:組み込みTomcatのSecure設定を有効にする

組み込みではない場合はTomcatのserver.xmlを編集し、
Secure設定を有効にすればよいのですが、
組み込みの場合はSpring BootにConfigクラスを用意して定義しなければいけません。

Spring Boot 2.0だと記述方法が若干異なりますので、
ちゃんと動作したコードを下記に記します!

このコードの場合、appication.ymlファイルにフラグを定義しておき、
特定の環境の場合secure設定を有効にしています。

上記の設定で無事に現象を解消することができ、httpsページに遷移するようになりました!

以上です!

【2018年8月9日時点の話】ACMのCloudFormationテンプレートはDNS検証を選択できない話

この記事は2018年8月9日時点の情報になります。
最新の情報をご確認下さい。

本エントリーは下記バージョンで動作確認しています。

AWS CLI 2.121.1 aws-cli/1.15.71 Python/2.7.10 Darwin/17.6.0 botocore/1.10.70

ACMのCloudFormationテンプレートでDNS検証を選択できないんですね!
いやー、初めて知りました!今後のアップデートに期待ですね!

例えば、下記のテンプレート例:

# ※よくない記述例です。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  Certificate:
    Type: AWS::CertificateManager::Certificate
    DeletionPolicy: Retain
    Properties:
      DomainName: abc.net
      DomainValidationOptions:
        - DomainName: abc.net
          ValidationDomain: DNS

上記のように記述すると、"ValidationDomain"の項目で構文エラーが起きてロールバックされます。

試しに、ValidationMethodと追記した例:

# ※動かないです。
Resources:
  Certificate:
    Type: AWS::CertificateManager::Certificate
    DeletionPolicy: Retain
    Properties:
      DomainName: abc.net
      DomainValidationOptions:
        - DomainName: abc.net
          ValidationMethod: 'DNS'

上記のように記述した場合、
"Encountered unsupported property ValidationMethod"というメッセージを残しロールバックされました!

いろいろ調べたところ、2018年8月9日時点でもサポートされていないようで。

https://forums.aws.amazon.com/thread.jspa?messageID=821952

CloudFormationで全てのリソースを管理できそうにない話

CloudFormationによるインフラストラクチャーのテンプレート化はとても気に入ってるので、
基本的にHandson環境や仕事のProduction環境はテンプレートを作成しているのですが、
テンプレートでリソースを管理できないとなると、ちょっとつらたんですね。
確か、EC2で使用するキーペアもCfnテンプレートがなかったような。

と言っても、頻繁に更新するかはリソースによりけりなんですけどね。

AWS CLIも活用する

このような場合は、AWS CLIを活用してコード化してもよさそうです。
記述例:

aws acm request-certificate --domain-name <ドメイン名> \
--validation-method DNS --region us-east-1 --profile <プロファイル名>

以上、小ネタでした!

AWS VPCのCIDR範囲とIPの総数について

調べても載ってない or 探しにくいシリーズ的な。
先日、AWS認定試験のワークショップに参加したのですが、
その時に共有された情報です。エントリー残しておきます!

VPCで指定できるCIDR範囲

  • 指定できるプレフィックス長:/16から/28
  • CIDR/IPの総数
CIDR IPの総数
/16 65,536
/17 32,768
/18 16,384
/19 8,192
/20 4,096
/21 2,048
/22 1,024
/23 512
/24 256
/25 128
/26 64
/27 32
/28 16

通信のソースや送信先を指定する場合のCIDR範囲

  • すべてのプレフィックス長(/0 ~ /32)を指定可能
  • 特殊な表記

CIDRをIPアドレスに展開する便利サイト

AWSVPC設計時に下記のサイトを使うと便利かも?
ipvx.info

以上です!

Raspberry PIをモニタレスで使えるように無線LANからSSH接続できるまで設定した

個人的備忘録になります。
Raspberry Pi3 Model Bのコンプリートセットを購入しました。

https://www.amazon.co.jp/Raspberry-Pi3-%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88-Standard-16G/dp/B01MR4SQV5www.amazon.co.jp

コンプリートセットですので、OSは付属のSDカードにインストール済みですが、
多分また何回かセットアップすることになると思うので、備忘録がてらエントリーを残しておきます。
※お使いの製品バージョンによっては手法が異なる場合があります。

パッケージ更新

sudo apt-get update
sudo apt-get upgrade

※wolfman-engineでハッシュサムが適合しませんとメッセージが表示されたが、
今回はとりあえずスルー。後で使わないパッケージならpurgeする。

ssh有効化

sudo su
cd /boot/
touch ssh

ラズパイを再起動後、
メニューから「設定」->「Raspberry Piの設定」->「インターフェイス」を表示。
SSHが有効になっていることを確認する。

公開鍵・秘密鍵の生成とダウンロード

# rootユーザーを終了する
exit
# 鍵生成
ssh-keygen -t rsa
# authorized_keysに生成した公開鍵を記述する
vi ~/.ssh/authorized_keys
# 秘密鍵をクライアントにダウンロードさせるため、一時的にパスワード認証を有効にする
vi /etc/sshd/sshd_config
# 56行目付近 コメントアウトを外してyesにする
PasswordAuthentication yes

ラズパイを再起動後、
scpで秘密鍵をダウンロードする。今回はMacでダウンロード

# ifconfigでwlan0(無線LAN)のIPアドレス情報を確認し、SCPダウンロードする
scp pi@IPアドレス:/home/pi/.ssh/id_rsa ./

固定IPの設定

# dhcpcd.confファイルの編集
sudo vi /etc/dhcpcd.conf
# 下記を追記する
interface wlan0
static ip_address=192.168.3.83/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1
# セキュリティ強化のため、パスワード認証を無効にする
vi /etc/sshd/sshd_config
# 56行目付近 noにする
PasswordAuthentication no

「ip_address」の項は好きなIPアドレスを指定する。ただし、ルーターによってIP範囲が指定されている場合があるので要確認。
「routers」「domain_name_server」にはルーターIPアドレスを指定する。

私の場合は、ソフトバンク光なので下記のURLで管理画面にアクセスし、ルーターIPアドレスを確認した。

ssh接続の確認

ssh -i ./id_rsa pi@192.168.3.83

f:id:yasay:20180801050323p:plain
接続できました!

ついでにGUIをオフにしておく

使うことないと思うので。

sudo raspi-config

「3 Boot Options」->「B1 Desktop / CLI」から「B2 Console Autologin」を選択する。
再起動して、コンソール画面が表示されればOK。

以上です!