ishikawa_pro's memorandum

情報学生の備忘録です.

Swift Docker AWS Delphi etc...色々やります。

Amazon Echo 買いました!

こんにちは。ちょっと前にAmazon Echoを買いました!Amazon echo dot ではなく無印のechoです。

f:id:ishikawa_pro:20171218223317j:plainf:id:ishikawa_pro:20171218222844j:plain
f:id:ishikawa_pro:20171218222849j:plainf:id:ishikawa_pro:20171218222859j:plain

招待メールをリクエストしたのは、リクエスト受付を開始した11月8日で、招待メールがきたのは12月4日だったので約1ヶ月かかりました。その代わり、11月17日までに招待メールのリクエストをしていたので¥4000オフの¥7980で買いました!
大体2週間くらい使ってみて、Unlimited Musicで今まで興味はあったけどCD買ったりできてなかったアーティストの曲を沢山聞くようになって音楽生活がより豊かになったなーと思いました。あと、Radikoが使えるので夜0時くらいからラジオを聞くのが最近の習慣になりました。機能面で言うと、スマートスピーカーとしても天気や予定を聞いたりと活躍してますが、Bluetoothスピーカーとしても使えるのでPCやスマホのスピーカーとしても活躍しており大変便利です。
音質に関しては、結構クリアな音の印象ですが、とにかく低音が超強いです。低音が強すぎるせいか、若干ボーカルが後ろ目聞こえる感じもします。(僕の部屋の壁が薄くてあまり大きな音を出せないのも原因かと思いますが)
アコースティックギターのインストの楽曲を流したらかなりいい感じだったので、アコースティックな楽曲とは相性が良いかもしれないです。
全体的な評価としては、僕は大満足でスマートスピーカーライフを満喫してます。

Amazon Echo (Newモデル)、チャコール (ファブリック)

Amazon Echo (Newモデル)、チャコール (ファブリック)

今後は、スキルの開発をしたいですが、node.jsは書けないのでnode.jsの勉強をしつつスキル開発もやっていきたいです。
今日は以上で失礼します。

Heroku Container RegistryにデプロイするサンプルをGitHubにあげた。

タイトルの通りで、これ以上書くことないですが、前回の書いたHeroku Container RegistryについてのサンプルをGitHubにあげました。
github.com

deploy to Heroku button を使いたかったのですが、どうも対応してないみたいなのでザックリ手順をREADMEに書いておきました。

Heroku Container Registryを使ってみた

こんにちは。
Heroku Container Registryを早速使ってみたので、まとめます。普通に、デプロイするだけだと他の人がたくさんやっていて面白くないので、ローカルの開発環境の構築からDeployするところまでやってみます。

今回の構成

Ruby on Rails のサンプルアプリを作ります。ローカルの開発環境はDocker上にRuby on Rails のコンテナとPostgreSQLのコンテナを立てて、docker-composeで管理します。dockerのimageは全部Docker Hubにある公式のリポジトリを使います。本番環境は、Heroku Container Registory と Heroku Postgresを使います。

ディレクトリ構成

HerokuSampleApp
├── .dockerignore
├── .env
├── Dockerfile
├── HerokuSampleApp
│   ├── .gitignore
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── README.md
│   ├── Rakefile
│   ├── app
│   ├── bin
│   ├── config
│   ├── config.ru
│   ├── db
│   ├── lib
│   ├── log
│   ├── public
│   ├── tmp
│   └── vendor
└── docker-compose.yml

手元の開発環境を構築

まずは、ローカルのDocker環境で動かせるように整備していきます。

Rails プロジェクトを作成

docker コマンドを使ってrailsのプロジェクトを生成します。

docker run -it --rm -w /HerokuSampleApp/ -v $(pwd)/:/HerokuSampleApp/ rails rails new HerokuSampleApp -TB --database=postgresql

ちょっと解説すると、-wオプション(--workdir)は作業ディレクトリを指定しており、-v(--volume)オプションはホストのHerokuSampleAppディレクトリをマウントしています。workdirを指定して、ホストのディレクトリをworkdir上にマウントすることで、rails newでホストのディレクトリにプロジェクトを生成することができます。

Rails用のDocker imageを作成

Dockerfileを下記のようにしました。

FROM rails:latest
MAINTAINER ishikawa_pro

ENV RAILS_ENV=production RACK_ENV=production
WORKDIR /usr/src/HerokuSampleApp
COPY ./HerokuSampleApp/Gemfile* ./
RUN bundle install
COPY ./HerokuSampleApp ./

CMD ["rails","s", "-b", "0.0.0.0"]

プロジェクトのGemfileとGemfile.lockだけを先にマウントしてbundle install しています。こうすることで、再度buildする際にGemfileが変更されていなければ、bundle installのキャッシュを利用してくれるので高速で buildが完了します。また、MOUNTでファイルをマウントせずにCOPYでrailsのプロジェクトをコピーするようにしています。これは、ホストのディレクトリをマウントしてしまうと手元の開発環境では問題ないですが、デプロイ先のコンテナでプロジェクトのディレクトリがマウントできないからです。
あと重要なことは、heroku container registryはENTRYPOINT コマンドに対応していないようなので、ENTRYPOINTではなくCMDを使わないといけないようです。

.dockerignoreの作成

docker-composeでrailsを手元で動かしている状態等でdocker buildし直してデプロイしてしまうと、railsプロジェクト内のtmp/pids/server.pidが残ったままになってしまい本番環境でrailsサーバーが起動しないという自体がよく起こるので、.dockerignoreにtmp/pids/server.pidを登録してbuildする際にdocker デーモンに送らないようにします。

./HerokuSampleApp/tmp/pids/server.pid

イメージをbuildする

docker build -t heroku_sample_app .

これで、heroku_sample_appというリポジトリ名のimageができます。

scaffold

作ったimageを使ってscafoldします。

docker run -it --rm  -v  $(pwd)/HerokuSampleApp/:/usr/src/HerokuSampleApp/ heroku_sample_app rails generate scaffold user name:string age:integer

テーブルスキーマは、

user
name:string
age:integer

です。

docker-composeによる管理

Railsコンテナの設定はここで一旦休憩です。ここからは、docker-composeでRailsコンテナとPostgreSQLコンテナを管理できるようにします。今回PostgreSQLコンテナに関しては、公式リポジトリを使うため特にDockerfileを書いたりはしません。 (PostgreSQLイメージの使い方はDocker HubのPostgreSQLのページを参照してください)
docker-compose.ymlは以下のようにしました。

version: '2'

volumes:
  pgdb:
      driver: 'local'
services:
  db:
    image: library/postgres
    ports:
      - "5432:5432"
    env_file: .env
    volumes:
      - pgdb:/var/lib/postgresql/data
    container_name: HerokuSamplePostgres
  web:
    build: .
    image: rails/heroku_sample_app:latest
    ports:
      - "3000:3000"
    env_file: .env
    environment:
      POSTGRES_HOST: db
      RAILS_ENV: development
      RACK_ENV: develobpment
    links:
      - db:postgres
    volumes:
      - ./HerokuSampleApp/:/usr/src/HerokuSampleApp/
    container_name: HerokuSampleApp
    restart: on-failure
    stdin_open: true
    tty: true

pgdbという名前のvolumeを作成して、/var/lib/postgresql/data にあるdatabase fileをvolumeにマウントさせることでデータベースのデータを永続させています。
詳しく過去の記事でまとめているので読んでみてください。
ishikawa-pro.hatenablog.com
railsコンテナの環境変数でRACK_ENVとRAILS_ENVの設定を、Dockerfile側ではproductionにしておき、docker-compose側ではdevelopmentにすることで、手元の開発環境はdevelopmentで動き、本番環境ではproductionで動くようにしています。
あと、.envファイルを読み込んでコンテナ間で共通の環境変数を設定しています。
とりえあず、postgreSQLのユーザー名とパスワードだけです。

POSTGRES_USER=ユーザー名
POSTGRES_PASSWORD=パスワード

データベース周りの設定

railsのdatabse.ymlを編集してとりあえず、postgreSQLコンテナに繋がるようにだけします。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  host: <%= ENV['POSTGRES_HOST'] %>
development:
  <<: *default
  database: HerokuSampleApp_development

.envにユーザー名とパスワードを書いているので、環境変数を使ってdatabase.ymlの中身を書きます。
docker-composeでコンテナ2つを立てて、rake db:createとmigrateして、データベースを作成します。

docker-compose up -d  
docker-compose exec web rails db:create
docker-compose exec web rails db:migrate

一旦動作確認

ここまでで、超雑なユーザー管理アプリ(?)みたいなものができてるはずなのでザックリ動作確認しましょう。あと、データが永続化できているか確認するためにコンテナを落として、立ち上げ直します。

docker-compose restart

データが消えてなければローカルの環境設定は完了です。

f:id:ishikawa_pro:20171214202651p:plainf:id:ishikawa_pro:20171214202655p:plain
f:id:ishikawa_pro:20171214202700p:plainf:id:ishikawa_pro:20171214202703p:plain
動作確認

Herokuへデプロイする

CLIインストール

mac 限定でいきます。Heroku CLIとContainer Registry用のプラグインをインストールします。
(mac 以外の人は、👉を参照。 https://devcenter.heroku.com/articles/heroku-cli )

brew install heroku/brew/heroku
heroku plugins:install heroku-container-registry

インストールが終われば、HerokuへのログインとContainer Registoryへログインします。

heroku login
heroku container:login

Herokuアプリの作成

プロジェクトのディレクトリで、Herokuアプリの作成をします。

heroku create

database.ymlのproduction部分を修正

Heroku postgresを使うので、database.ymlのproduction部分だけHeroku postgres用の設定に直します。

production:
  url: <%= ENV['DATABASE_URL'] %>

rails newするときに --database=postgresqlをつけておけば、databse.ymlが最初からpostgreSQL用の記述になっており、Herokuの場合の設定の仕方もコメントで書いてあるので細かい説明は省略します。

SECRET_KEY_BASE生成

SECRETE_KEY_BASEを生成して、herokuの環境変数に追加します。

SECRET_BASE_KEY=$(docker run -it --rm -v $(pwd)/HerokuSampleApp/:/usr/src/HerokuSampleApp/ rails/heroku_sample_app bundle exec rake secret)
heroku config:add SECRET_KEY_BASE=$SECRET_BASE_KEY

No app specifiedが出る場合は、--app オプションでアプリ名を入れる。アプリ名は、

heroku apps

で取得する。

リポジトリをpushする

下記のコマンドでbuildとpushをしてくれます。

heroku container:push web

Heroku Postgresの設定

Heroku Postgresを有効にするのはコマンド一発で終わりです笑

heroku addons:create heroku-postgresql:hobby-dev

Heroku Postgresの設定が終わると自動でDATABASE_URLの環境変数を追加してくれているので確認してます。ちゃんと環境変数が設定されていれば、テーブル作成します。

heroku config
heroku run rake db:migrate

動作確認

以上の作業でデプロイ完了です。ページを開いてみてうまく動いていれば完璧です。

heroku open

まとめ

記事が長くなりましたが、これで開発環境構築からデプロイまで完了です。
Heroku Container Registoryを使ってみて、自分の作ったdocker imageを使ってめちゃくちゃ簡単にデプロイできるので最高じゃん!という感じです。特にハマるところもなくすんなりデプロイできましたし、無料枠内でアプリ1つは動かせるので僕が今作ってるアプリもHerokuへデプロイしようと思います!
長くなりましたが、今日はこれで失礼します。

Heroku Container Registoryについてザックリ調べた

こんにちは。タイトルの通り今日は本当にザックリ調べました。今回は、コンテナを使ってデプロイできるPaaSサービスを調べてみた第2弾です。そして、今回調べたのは、Herokuです。よくHerokuは便利だという声は聞くので興味はあったのですが、AWSでインフラの勉強もしたかったのであえて手を出していませんでした。ですが、HerokuにDocker Containerを使ってデプロイできるサービスがあり、自分が開発してるアプリのDocker imageを使ってデプロイができそうだったので調べて見ました。

サービス

今回調べたサービスは、Heroku Container Serviceです。Google App Engineのようにコンテナを使ってデプロイできるサービスです。

料金

料金プランについてです。
www.heroku.com
freeプランがあるので、それだけ紹介しときます。

free プラン

料金については、クレジットカードを登録すれば 1000 free dyno hoursほど使えて、登録しなければ550 free dyno hoursほど使えます。クレカを登録しなくても550 free dyno hours使えるなら、開発期間中はクレカを登録せずに使っていても良いかもしれないですね。
憂慮すべきことは、30分間アクティブじゃない時間があるとsleepすることですね。New Relicというアドオンを使って定期的にpingでリクエスト送ってsleepしないようにするのが定番みたいなので、問題なさそうですが。
freeプランは、Heroku PostgresやHeroku Redisも無料枠が用意してありとりあえずサービスを一個立てられるようにはなっているみたいですね。

できること

次回、別の記事としてまとめると思いますが、簡単に紹介します。
Heroku Container Registry用のCLIツールがあり、それを使ってimageをpushしてデプロイするような感じのようです。あとは、オリジナルのimageが使えるようなのでかなり良さそうな印象です。

まとめ

前回と合わせて4つのサービスを調べてみて一番お金がかからずにサービスが立てられそうだったのは、やっぱりHerokuだと思います。しばしばHerokuは良いという話を聞くだけあるなと感じました。Heroku Container Registoryのできること的には、まさにこのサービスを探していた!という感じだし、たまたまDBもPostgreSQL使っていたので、そんなにAWSから移るの大変じゃなさそうだからもうHeroku使うことにします!
今日の内容は本当にこれだけです。次回は実際にdeployしてみて記事にまとめると思います。
それでは失礼します。

コンテナでデプロイできるサービスについて調べた

こんにちは。
前回の記事で書きましたが、先月AWSの$40のクレジットを使い切りました。それで、AWSから別のクラウドに乗り換えることを視野にいろいろクラウドサービスを調べてみました。

はじめに

現状の構成としては、AWS のECS + RDS + ALBという構成です。ECSはt2.microのEC2インスタンス1つをECSで管理して、コンテナとしてはRailsコンテナを1個置いているだけです。RDSでは、PostgreSQLを使っていました。ECSを使ってた理由としては、Dockerを使うのが好きで作ってるアプリの開発環境もDockerで管理しておりコンテナを使ってデプロイしたいなと思っていたのと、はてなサマーインターンAWSハンズオンでECSとかを使ってPerlのWEBアプリをデプロイした経験があって、ハンズオンで理解しきれなかった内容をしっかり理解したいなと思っていたからです。

ECS使ってて思った事

自動化するところまではやれてなかったけど、プログラム書き換えてdocker build と pushして、コンテナを立て直すだけで書き換えたプログラムが反映できたのは結構イケてるなと感じました。でも、EC2をクラスター管理してたわけでもなく、 オートスケールさせたわけでもないので、ECSじゃなくてもよかったのかなとちょっと思いました。

調べたこと

AWS, Azure, GCP、3サービスの無料利用枠について調べました。(僕は、すでに3サービスの無料利用期間は終わっているので、常に無料でできる枠を調べました。)
まずは、AWSから
aws.amazon.com
一部紹介すると、

  • AWS Lambda → 100万件/月の無料リクエス
  • Amazon CloudWatch → 10個のカスタムメトリクスおよび 10 件のアラーム
  • Amazon Cognito → 50,000 MAU/月
  • DynamoDB → 25 GB

などなど、23個の常に無料で利用できるサービスがありました。他2サービスと比べると、自分の作ったものをデプロイできるサービスが無くて若干物足りない感がありました。

続いてMicrosoft Azure
azure.microsoft.com
こちらも一部抜粋すると、

  • App Service → 10 Web、モバイル、API アプリ
  • Functions → 100万 回(1か月あたりの要求数)
  • Container Service 完全無料

などなど、29個のサービスが常に無料で使えました。App ServiceやContainer Serviceが無料で使えるのは一見良さそうに見えましたが、Linux / Windows Virtual Machinesは無料ではないため、実質無料ではなかったです。ですが、Machine Learningが2 sheet無料で使えたり、Face APIなどのCognitive Servicesに無料枠があるのは、色々遊び甲斐があるので良いなと感じました。

最後にGoogle Cloud Platform
cloud.google.com
こちらも無料枠を一部紹介すると、

などがありました。数としては、15個と少ない印象ですが、他のサービスと違い一番安いインスタンスが無料で使えるのと、GAEが無料で使えるのがかなり魅力でした。

比較してみて

これ以外にもHerokuなど色々サービスはありますが、今回は上記3サービスを比較しました。調べた感想としては、AWSが一番無料枠は寂しいような気がしました。あとは、どのクラウドサービスもデータべース系はNoSQLのサービスしか無料枠がないので、結局多少お金はかかってしまいそうですね。
一番良さそうだと感じたのは、Google App Engineでした。サービスが無料なのと、GAE用のdocker imageがあって、それを使ってimageを作ってデプロイするので、(間違ってたらすいません)、現状のDockerでの開発環境が活かせそうだったからです。
今後はもう少し別のサービスを調べて見てから(Herokuとか)、実際に使って見て記事を書きます。
なんか雑な調査だったし、雑な記事でしたが今日はこの辺で失礼します。

AWS Educateのクレジットを使い切った

こんにちは。
またお久しぶりです。ちゃんと更新するとか言って結局できてないです。
12月入ったので気合を入れ直して頑張ります。

今日はあんまりネタもないので、AWS Educateから発行してもらったクレジットを使い切ったことを書いときます。

10月くらいからiOS開発の勉強がてら技術ブログのニュースアプリみたいなものを作っています。(昔作りかけたものをやり直してる)
サーバーサイドはRailsを使っていて開発環境をDockerで構築して、AWSにデプロイしています。AWSの費用は、AWS Educate に登録して$40のクレジットを発行してもらって使っていたのですが、先月一気に使い切ってしまいました。笑
理由は先月からALB + ECS + RDSの構成でちゃんとアプリが動かせる段階まできて毎日1日中稼働させてたからです。ちゃんと料金を見積もらずに、t2.microだからそんなにお金かからないだろうと稼働させ続けてました。そうしたら、11月25日くらいの朝にスマホの通知欄に自分で設定していた料金アラートがメールで来ててめちゃくちゃ慌ててインスタンスとか全部削除しました(笑)。 料金アラートは$35ドルに設定していたのですが、11月までに$10近く使っていたので今月は初めてAWSに料金を払うことになります。

f:id:ishikawa_pro:20171201212747p:plain
今月の使用量(グラフの中の値はドル)
まあでも軽く個人で使うくらいなら月4000円くらいで収まるなら安いのかな?
来月から自腹を切るかどうか検討中
皆さんもご利用は計画的に!

Docker + PostgreSQL 永続化の話

こんにちは。ちゃんと更新しています。
一年くらい前に、DockerでPostgreSQLコンテナを立てる時に永続化させる方法を書いていました。
ishikawa-pro.hatenablog.com
僕のブログのアクセス先の8割は👆の記事なのですが、貼ってあるDockerfileを実行しても動かなかったり、色々変なことしててずっと書き直したいと思っていました。だからは今日はもっとシンプルでベターなやり方をメモっときます。

参考資料

Docker

Docker

使うイメージについて

今回使うイメージは、PostgreSQLの公式リポジトリです。
imageのバージョンは雑にlatestです。
https://hub.docker.com/_/postgres/

データコンテナの作成

まずは、データコンテナ作ります

docker create --name dbdata postgres

データコンテナは、起動する必要がないのでdocker createコマンドでコンテナだけ作っておきます。

データコンテナにpostgres imageを使う理由

データコンテナのためにbusyboxとかを使う人も多いと思います。今回postgresイメージでデータコンテナを用意している理由としては、

  • 同じイメージを使えば、別のイメージをpullする必要がないから余分な容量を消費しない
  • posrgres imageでデータコンテナを作っているからパーミッションが正しく設定されている

などのメリットがあるからです。

データコンテナをマウントしてpostgresコンテナを起動

--volumes-fromオプションでデータコンテナの名前を指定してマウントさせてpostgresコンテナを起動すれば永続化完了です。

docker run -d --rm -p 5432:5432 --volumes-from dbdata postgres

ユーザーとパスワードを指定しなければ、

  • user : postgres
  • password : mysecretpassword

です。
テーブル作ったりしてからコンテナを消して、データコンテナをマウントした違うコンテナを立てて見れば永続化されてることが確認できると思います。
詳しいpostgres imageの使い方とかは公式のdocumentを見てください。

終わりに

1年前の記事よりかなりスマートにできたと思います(笑)。docker-composeも活用すれば、いい感じの開発環境が構築できそうですね。
間違った解釈をしていたり異論があればコメントください🙇
今日はここら辺で失礼します。