Megaportが世界トップのCRMへの直接接続を立ち上げ

ビンセント・イングリッシュ氏が率いるMegaportは大規模な世界規模のキャリアーネットワークを構築する幅広い知識を備える極めて経験豊富なチームによって創設され、世界の185のデータセンターの850以上の顧客と接続している。MegaportはAlibaba Cloud Technology Partner、Oracle Cloud Partner、AWS Technology … 続きを読む

基幹系を動かせるよう機能強化、巨大クラウド事業者の取り組み

AWSやMicrosoftに加え、GoogleやIBM、Oracleなども、基幹系システムの動作環境としてクラウドサービスの拡充に注力している。クラウドと同様の環境をオンプレミスで利用可能にする製品やサービスも続々登場している。 続きを読む

カテゴリー 未分類 | タグ

初めてのAWS Lambda(どんな環境で動いているのかみてみた)

月曜日から3日間、AWSアーキテクト研修でした。そこではじめてLambdaに接しまして、ひととおり驚いてきたところです。自分なりのまとめです(ご存知の方には釈迦に説法)。

Lambdaとは?

恥ずかしながら私は「サーバーレス」という言葉を聞いてもいまいちピンと来ていませんでした。ですが、これは文字通りなんですよね。プログラムが動作する環境なんてどうだっていいんです。OSがなんだとか、ミドルウェアがなんだとか、メモリがどれくらいでCPUがいくらで、NWがどうで、トポロジーがなんでとか、そんなことはどうでもいいんです。
とにかく、「トリガー」と呼ばれる”きっかけ”を契機に、コード(プログラム)が動くんです。JavaならJVMがおもむろに立ち上がって、アップロードしておいたjarが実行されるんです。「トリガー」はAWSサービスと高度に統合されていて、例えば

  • ファイルストレージサービスであるところのS3(もはや単なるストレージの域を超越していますが)にファイルがアップロードされた
  • メッセージがキューにputされた
  • API Gatewayにリクエストがきた
  • EC2インスタンスが起動した
  • 3時になった
  • おなかがすいた(とAmazon echoに話した)
  • e.t.c.

MDBならぬTDB(Trigger Driven Bean)でしょうか。Beanである必要もないので、TBC(Trigger Driven Code)とでも言ったほうがいいのかもしれません。

うごかしてみる

研修の間、実習時間に余裕があったので、研修端末に入っていたEclipseで簡単なコードを書いて動かしてみました。テストはAWS Consoleからキックできるので、特に「トリガー」を定義しなくても動かすだけなら簡単に試せます。

お作法

基本的にどんなJavaプログラムでも必要なライブラリを組み込んでおけば動きますが、コールするメソッドにはお約束があるようです。それは引数です。第一引数にObjectをもらい、第二引数にContextをもらいます。メソッド名はなんでもいいです。型もなんでもいいです(ただし第一引数と戻り値の型ともにSeriarizableである必要あり。プリミティブ型もOK)。

第一引数に入るのは、具体的には「トリガー」からの情報です。メッセージがキューにputされたことをトリガーとするのであれば、そのメッセージ自体を渡してあげたり。戻り値は同期呼び出しであればほぼそのまんまでしょう。インタフェース要件に従って、Serializeして返してあげればよいだけです。

第二引数のContextですが、これはjavax.naming.Contextではなく、com.amazonaws.services.lambda.runtime.Contextです。というわけで、AWSが提供するjarファイルをビルドパスに追加する必要があります。1

作る

まだ意味のあるコードを書くほどの技量もアイディアもないので、インフラ屋っぽくどんな環境(システムプロパティ、環境変数、渡されたContextオブジェクト)で動いているのかみてみることにしました。

SystemInfo.class
package net.mognet.aws.lambda;

import java.util.Map;
import java.util.Properties;

import com.amazonaws.services.lambda.runtime.Context;

public class SystemInfo {

    public static String printSystemInfo(int i, Context context) {
            StringBuilder sb = new StringBuilder();
            //ヘッダを追加
            sb.append("name,value\n");

            //システムプロパティ取得
            Properties prop = System.getProperties();
            for(Object key : prop.keySet()) {
                String name = (String) key;
                String value  = prop.getProperty(name);
                sb.append(name + "," + value + "\n");
            }
            //環境変数取得
            Map<String, String> env = System.getenv();
            for(String key : env.keySet()) {
                String value = env.get(key);
                sb.append(key + "," + value + "\n");
            }
            //Contextの情報を取得
            sb.append("context" + "," + context.toString());
            return sb.toString();
    }

    public static void main(String[] args) {
            System.out.println(printSystemInfo(1, null));
    }
}

mainはテスト用です。1個目の引数こそ本来は大事なんでしょうけど今回は何もしません。

乗せる

AWSコンソールを開いてLambdaの関数を作ります(関数という単位で動きます。複数の関数をオーケストレーションするサービスもあるようです(詳細未調査))。
スクリーンショット 2018-01-31 21.39.16.png
適当に名前とランタイム(今回はJava8)を選んで「関数の作成」を押します。
標準出力はCloudWatchLogsへ流れるので、事前にCloudWatchLogsへのWrite権限のあるロールを作って必要に応じてここでアタッチしてください。
スクリーンショット 2018-01-31 21.39.50.png
スクリーンショット 2018-01-31 21.39.57.png
本来ならここでトリガーを選んで云々となりますが、とにかくテストしてみたいだけなので、その辺の条件だけいれます。
スクリーンショット 2018-01-31 21.40.05.png
関数コードのところで、「アップロード」からjarファイルをアップロード、大事なのが「ハンドラ」でここに実行するメソッドを入力します。書き方が決まっていて、”.”表記でクラスのフルパスの後ろに”::“をつけてメソッド名です。
今回は”net.mognet.aws.lambda.SystemInfo::printSystemInfo“となります。ついでに環境変数もつけてみました。一旦「保存」すると実際にファイルがアップロードされます。
スクリーンショット 2018-01-31 21.41.03.png
次にテストの準備です。テストケース(入力設定=第一引数設定)です。画面上部の「テストイベントの設定」を選びます。
スクリーンショット 2018-01-31 21.41.19.png
実行するメソッドpublic static String printSystemInfoの第一引数がintなので、1とだけ書いて終わりです。下の方にある「保存」を押します。これでテスト準備完了です。

いざ実行!

おもむろに「テスト」を押します。
スクリーンショット 2018-01-31 21.42.15.png
動きました。今回はログ出力(標準出力)なしなので、ログは見ませんが開始と終了のメッセージが出ていました。String型のメソッドを実行したので、returnした文字列がそのまま画面上に表示されています(改行コードは改行してほしかったけど実行結果表示コンソールとしてはこれが正しいあり方ですね)。

付録

付録で実行結果を載せておきます。

name value
java.runtime.name OpenJDK Runtime Environment
sun.boot.library.path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/amd64
java.vm.version 25.141-b16
java.vm.vendor Oracle Corporation
java.vendor.url http://java.oracle.com/
path.separator :
java.vm.name OpenJDK 64-Bit Server VM
file.encoding.pkg sun.io
user.country US
sun.java.launcher SUN_STANDARD
sun.os.patch.level unknown
java.vm.specification.name Java Virtual Machine Specification
user.dir /
java.runtime.version 1.8.0_141-b16
java.awt.graphicsenv sun.awt.X11GraphicsEnvironment
java.endorsed.dirs /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/endorsed
os.arch amd64
java.io.tmpdir /tmp
line.separator
java.vm.specification.vendor Oracle Corporation
os.name Linux
sun.jnu.encoding UTF-8
java.library.path /lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name Java Platform API Specification
java.class.version 52.0
sun.management.compiler HotSpot 64-Bit Tiered Compilers
os.version 4.9.77-31.58.amzn1.x86_64
user.home /home/sbx_user1066
user.timezone UTC
java.awt.printerjob sun.print.PSPrinterJob
file.encoding UTF-8
java.specification.version 1.8
java.class.path /var/runtime/lib/LambdaJavaRTEntry-1.0.jar
user.name sbx_user1066
java.vm.specification.version 1.8
sun.java.command /var/runtime/lib/LambdaJavaRTEntry-1.0.jar
java.home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre
sun.arch.data.model 64
user.language en
java.specification.vendor Oracle Corporation
awt.toolkit sun.awt.X11.XToolkit
java.vm.info mixed mode, sharing
java.version 1.8.0_141
java.ext.dirs /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/resources.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jfr.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/classes
java.vendor Oracle Corporation
file.separator /
java.vendor.url.bug http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding UnicodeLittle
sun.cpu.endian little
sun.cpu.isalist
PATH /usr/local/bin:/usr/bin/:/bin
AWS_XRAY_DAEMONADDRESS 169.254.79.2
LAMBDA_TASK_ROOT /var/task
AWS_LAMBDA_FUNCTION_MEMORY_SIZE 128
TZ :UTC
AWS_SECRET_ACCESS_KEY secret
AWS_EXECUTION_ENV AWS_Lambda_java8
AWS_DEFAULT_REGION ap-northeast-1
AWS_LAMBDA_LOG_GROUP_NAME /aws/lambda/SystemInfo
XFILESEARCHPATH /usr/dt/app-defaults/%L/Dt
_HANDLER net.mognet.aws.lambda.SystemInfo::printSystemInfo
LANG en_US.UTF-8
LAMBDA_RUNTIME_DIR /var/runtime
AWS_SESSION_TOKEN tokenString
AWS_ACCESS_KEY_ID accessKeyId
LD_LIBRARY_PATH /lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib
X_AMZN_TRACEID Root=1-5a71b98c-393aaa7b51f5612a348586c0;Parent=3ff8164301e3ccd4;Sampled=0
AWS_SECRET_KEY secretKey
hogehoge gehogeho
AWS_REGION ap-northeast-1
AWS_LAMBDA_LOG_STREAM_NAME 2018/01/31/[$LATEST]29640ec0ac8e426ab2b0a041b3a1b1f4
AWS_XRAY_DAEMON_ADDRESS 169.254.79.2:2000
AWS_XRAY_DAEMONPORT 2000
NLSPATH /usr/dt/lib/nls/msg/%L/%N.cat
AWS_XRAY_CONTEXT_MISSING LOG_ERROR
AWS_LAMBDA_FUNCTION_VERSION $LATEST
AWS_ACCESS_KEY accessKey
AWS_LAMBDA_FUNCTION_NAME SystemInfo
context lambdainternal.api.LambdaContext@604ed9f0

アクセスキー等の情報も環境変数に乗っていましたのでそこはマスクしてます。そういう仕様だということは理解しておくべきかもしれません。この辺のキーを使ってAWS API呼び出したりするのかな?あと、ちゃんと設定した環境変数も出て来てます(あたりまえですが)。
OpenJDK on Amazon Linuxで動かしているみたいですね。こればっかりは実際に本稼働したときにどうなるかわかりませんけれども。あくまでこのテスト実行時はこうでした、というだけです。なんといってもサーバーレスですので、繰り返しになりますが実行環境(HW、OS、MW等々)はどうでもいいです。というか、どうでもいい前提でコードを書いてください、というのがLambda的な使い方と認識しました。

参考

Lambda 関数ハンドラー(Java) – AWS Lambda


  1. EclipseにはAWSのツールキットプラグインがあるので、この環境をセットアップしておくだけでも可です。 

続きを読む

KMSがRDS for OracleとRDS for SQL Serverの暗号化にも使えるようになりました | Developers.IO

KMSがRDS for OracleとRDS for SQL Serverの暗号化にも使えるようになりました | Developers.IO. 1 users テクノロジー 記事元: クラスメソッド発のAWS/iOS/Android技術者必読メディア | Developers.IO … 続きを読む

オンプレDBをAWSに移行しよう

RDS for OracleはAWSが運用管理を実施するマネージドサービスである。同じOracle Databaseを利用できるとはいえ、オンプレミスで導入する際とは大きく異なる点が五つある。導入前にシステム要件に合っているかどうかを、十分に確認することが重要だ。 続きを読む

AWSとAzureとGCPを比較してみる – DB編

DBについて、AWSとAzureとGCPを比較してみました。

1. 新世代DB

AWS Azure GCP
新世代DB Aurora Cosmos DB Cloud Spanner
DBの種類 MySQL,
Postgresql
SQL (document DB),
MongoDB (document DB),
Gremlin (graph DB),
Azure Table(KVS),
Cassandra
オリジナルのリレーショナルDB
サーバレスか否か サーバあり サーバレス サーバレス
高可用性構成 / 負荷分散 Auroraレプリカ,
クロスリージョンレプリカ(MySQLのみ)
リージョン間フェイルオーバー,
予約済みスループット
リージョン内レプリケーション,
マルチリージョンレプリケーション
地理的範囲 リージョン(MySQLは別リージョンにレプリケーション可) グローバル グローバル
マルチマスター シングルマスター,
マルチマスター*
マスターになるリージョンは1個 マルチマスター

*プレビュー

DBの種類ですが、Auroraは手堅くMySQLとPostgresql、Cosmos DBはバラエティーにとんでいてドキュメントDB・KVS・グラフDBとCassandra、Cloud SpannerはオリジナルのリレーショナルDBとなっています。
Cloud Spannerはクライアントライブラリが各言語(C#,GO,Java**, node.js**,PHP**, Python**, Ruby)に対し用意されていますが、ORMの対応が気になるところです。
**ベータ

Cosmos DBとCloud Spannerはサーバレスですが、Auroraはインスタンスタイプを指定してインスタンスを構築します。また、拡張機能というよりは別物として、サーバレスタイプのAurora serverless*がプレビュー中です。

高可用性構成と負荷分散ですが、Auroraはリージョン内ではリードレプリカが障害時にマスターに昇格することで対応しています。MySQL版はクロスリージョンレプリケーション構成を取ることができますが、リージョン間で自動フェイルオーバーする仕組みはありません。
また、Auroraはマルチマスター機能であるAurora Multi-Master*が現在プレビュー中ですが、リージョン間でも利用可能になる予定があるとアナウンスされています。リリースされればグローバルで高可用性と負荷分散が簡単に実現できそうです。
Cosmos DBは、1個の書き込みリージョンを持つリージョン間フェイルオーバー***の仕組みで高可用性を実現しています。
Cloud Spannerはリージョン内レプリケーションとマルチリージョンレプリケーションの仕組みで高可用性を実現しています。1つのリージョンで構築する場合は、3個のread-writeレプリカを保持します。複数リージョンで構築する場合は、2個のread-writeレプリカを保持する2個のread-writeリージョン(と場合によってread-onlyリージョン)で構成されます。

***Microsoftのドキュメントではregional failoverをリージョン内フェイルオーバーと訳していますが、意味合いはリージョン間フェイルオーバーなので、ここではそのように表記しています。

2. リレーショナルDB

AWS Azure GCP
MYSQL互換 MySQL
/ MariaDB
Azure Database for MySQL* Google Cloud SQL for MySQL
高可用性構成 Multi-AZ,
クロスリージョンリードレプリカ
フェイルオーバーレプリカ
負荷分散 リードレプリカ,
クロスリージョンリードレプリカ
リードレプリカ
Postgresql Postgresql Azure Database for PostgreSQL* Google Cloud SQL for PostgreSQL**
高可用性構成 Multi-AZ,
クロスリージョンリードレプリカ
リージョナルインスタンス**
負荷分散 リードレプリカ,
クロスリージョンリードレプリカ
リードレプリカ**
SQL Server SQL Server Azure SQL Database
高可用性構成 Multi-AZ アクティブgeoレプリケーション
負荷分散 アクティブgeoレプリケーション
Oracle Oracle
高可用性構成 Multi-AZ
負荷分散

*プレビュー
**ベータ

・各クラウド間での違い-その1

AWSのMulti-AZとGCPのリージョナルインスタンス(PostgreSQL)は、スタンバイ側はリードの機能がないので負荷分散には利用できませんが、GCPのフェイルオーバーレプリカ(MySQL)はリードの機能があるので負荷分散にも利用できます。

3. NOSQL

AWS Azure GCP
KVS・ドキュメント ElastiCache(Memcached, Redis),
DynamoDB
Redis Cache,
Cosmos DB(Azure Table, SQL, MongoDB)
Cloud Datastore,
Cloud Bigtable
グラフ Neptune* Cosmos DB(Gremlin)
Cosmos DB(Cassandra)

*プレビュー

Neptuneの現時点のプレビューのAWSマネジメントコンソール画面はAmazon RDSとよく似ています。また裏でAuroraと同じ仕組みを利用しているそうなので、ひょっとしたらCosmos DBみたいに、Auroraの一機能としてリリースされるかも知れません。

4. まとめ

現在は、MySQL・Postgresqlを利用したければAWSのAuroraかRDS、SQL Serverを利用したければAzureでしょうか。
ただ各クラウドのプレビュー・ベータ提供状況を見ていると、そのうち機能差は無くなるように思えます。

続きを読む

SpringBootアプリケーションをCodePipelineを用いてEC2インスタンスに自動デプロイ

SpringBootで構築したアプリケーションをAWS CodePipelineを用いてEC2インスタンスに自動デプロイするための手順をまとめます。

構成

Codepipeline.png

  • Gitリポジトリ

    • GitHub(なんでも良い)
  • CI
    • Jenkins
  • Test & Build
    • Maven(Gradleでもそんなに変わらない)
  • APサーバ
    • SpringBoot 1.4.x on EC2

大まかな流れ

基本的に以下で紹介していただいた内容をもとに実施した。
SpringBootで構築したアプリケーションがgitにpushされたらCodeDeployで自動デプロイされる仕組み

開発者
1. 任意の(ここでは例としてmaster) branchにpush

Jenkins
1. 5分毎にポーリングし、develop branchが更新されていればpull
2. Test & Build(Maven)
3. Test & Buildが成功したらS3にリビジョンをアップロード

CodePipeline
1. S3からアップロードされたファイルを取得
2. CodeDeployを起動

CodeDeploy
1. jarファイルに実行権限を付与
2. CodeDeployから各インスタンスにSpringBootアプリがdeployされ、新しいバージョンのアプリが起動する。

サンプルコード

CodeDeployを利用した自動デプロイを行ったサンプルコード(GitHub)

追加で実施した作業

以下は、更新した箇所のみ記載。

AWS EC2インスタンスのJavaバージョンを1.8にする。

AWS EC2インスタンスのJavaバージョンがOpenJDK1.7だった。
Oracle JDK1.8をインストールすることを前提としているため、JDKのアップデートを行う。
参照:Amazon Linuxにjdk1.7 or 1.8インストール

SpringBootアプリケーションのサービス化

以下のページを参考にSpringBootアプリケーションのサービス化を行う。
Spring Bootでwarファイル作成&jarのサービス化

  • デプロイするjarファイル名:demo.jar
  • 起動するサービス名:demo

CodeDeploy

  • アプリケーション名:springboot-demo
  • アプリケーショングループ名:springboot-demo-group

appspec.ymlは今回の構成は以下のようにした。

appspec.yml
version: 0.0
os: linux
files:
  - source: demo.jar
    destination: /var/myapp/
    overwrite: yes
hooks:
  ApplicationStop:
    - location: scripts/appstop.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/appstart.sh
      timeout: 300
      runas: root

また、サービス停止・起動用スクリプトは以下のようにした。

サービス停止用スクリプト

scripts/appstop.sh
#!/bin/sh
service demo stop

サービス起動用スクリプト

scripts/appstart.sh
#!/bin/sh
chmod u+x /var/myapp/demo.jar # jarファイルに実行権限を付与
service demo start

AWS CodePipeline

CodePipelineの設定を行う。
1.パイプライン名の登録

  • パイプライン名:demo-pipeline

Codepipeline-setting1.png

2.ソース取得場所設定
Codepipeline-setting2.png

3.ビルド設定
Jenkinsでビルド済みなので、ビルド設定はなし。
Codepipeline-setting3.png

4.デプロイ設定
上記、CodeDeployで設定したアプリケーション名およびアプリケーショングループ名を選択
Codepipeline-setting4.png

5.サービスロール設定
「ロールの作成」からロール名を登録する。
Codepipeline-setting5-1.png
Codepipeline-setting5-2.png

作成したサービスロールを設定する。
Codepipeline-setting5.png

6.「パイプラインの作成」ボタンを押下して完了。

[Jenkins]S3にリビジョンをアップロードする

1.サンプルコードを利用する場合、S3にアップロードするファイル群をzip形式にまとめる。
JenkinsのJob設定画面でシェルの実行を選択し、以下を追加する。

cd target
cp demo-0.0.1-SNAPSHOT.jar ../deploy/demo.jar
cd ../deploy/
jar -cMf demo.zip *

2.JenkinsのS3アップロードプラグインを利用して、zip化したファイルをS3にアップロードにする。
以下、設定画面の例。
[Destination bucket]には、CodePipelineで設定したS3バケットを指定する。
S3-setting.PNG

3.[保存]ボタンを押下して完了。

続きを読む

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ともども、おいおい試していきたいです。

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

続きを読む

AWS、LinuxサーバOSの次期バージョン

この記事に対して2件のコメントがあります。コメントは「”「VMware」「Oracle VM VirtualBox」「Microsoft Hyper-V」といった仮想化ソリューションで使われる仮想マシンイメージとしても提供される。これらの仮想マシンイメージは、オンプレミスの開発とテストに使用できる”」、「ありがたい。」です。 続きを読む