無印吉澤

Site Reliability Engineering(SRE)、ソフトウェア開発、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

解説:Otto の基本概念、フォルダ構造、および Otto 0.1 では未実装の機能一覧

f:id:muziyoshiz:20151101162325p:plain

目次

はじめに

Otto は version 0.1 ながら、ドキュメントが充実しており、それらを読んでいくだけで基本概念や、将来の実装予定についてかなりの情報を得ることができます。

ただ、個人的には、ドキュメントが多い分、どの情報がどこにあるのかわかりにくい面もありました。そこで、チュートリアルのためのコマンド例などは省いて、基本概念、フォルダ構造、未実装機能に関する情報に焦点を絞ってまとめてみました。

この記事は Otto の概要をすでに知っている方を対象にしています。概要については、HashiCorp社のHashimoto氏自身による、以下のブログ記事が分かりやすいです。

Ottoの基本概念

Getting Started Guide および Otto Documentation を元にまとめた、基本概念の説明です。

Appfile

アプリケーション設定の大本(source)として使われるファイル。アプリケーションの開発からデプロイを管理するための十分な情報を、Ottoに渡すために使われる。アプリケーション自身の設定と、そのアプリケーションが依存する他のアプリケーション(dependency)の設定を記載する。

Otto 0.1 が対応している Application Type は以下の通り。Custom は、Vagrant、Terraform、Packerの設定ファイルを直接指定する形式なので、設定ファイルを作りこめば、一覧にない Java などのデプロイも可能(参考:Customization - Custom App Type)。

Dependencyについては、前回の解説記事を参照のこと。

muziyoshiz.hatenablog.com

Infrastructure

デプロイ先のクラウドプラットフォームと、アプリケーションを動作させるために最低限必要なリソースのことを、Otto では "infrastructure" と呼ぶ。Otto 0.1 が対応している Infrastructure Type は AWS のみ(参考:Infrastructure - Otto by HashiCorp)。

Flavor

クラウドプラットフォームのシステム構成、言い換えるとotto infraコマンドの実行時に行われる設定のパターンのこと。Otto 0.1 では、Infrastructure Type "AWS" について、Flavor "simple" と "vpc-public-private" の2種類が実装されている(参考:Infrastructure Type: AWS)。

  • "simple": 1個の public subnet、1台の Consul server
  • "vpc-public-private": 1個の public subnet、1個の private subnet、NATインスタンス、踏み台ホスト(bastion host)、3台構成の Consul cluster

ちなみにクラウド関係で言うと、OpenStackにも フレーバー(OpenStack 運用ガイド) という概念があるが、それとは意味がだいぶ違う。

Foundation

Ottoが、実際のインフラを構築するための基本的な構成要素と考えるものを "foundation" と呼ぶ。Ottoはfoundationを自動的にインストール、設定、およびスケールする。以下は、foundation の一例。

  • Service Discovery: Consul による名前解決(<appname>.service.consulでアクセス可能にする)
  • Security: Vault によるアプリケーションの認証(※Otto 0.1では未実装)
  • Scheduling: Nomad によるスケジューリング(※Otto 0.1では未実装)

Otto 0.1 では、foundation は flavor によって決まり、カスタマイズできない。

Directory

複数のアプリケーションで共有される情報が格納されるレイヤ。デフォルトでは、ディレクトリのためのデータベースが ~/.otto.d/directory/otto.db に作られる。

Otto 0.1にはディレクトリを共有する仕組みがないため、異なる開発者が同じ Appfile を使ってデプロイを行っても、AWS上には2個の異なるインスタンスができてしまう。かといって、ディレクトリをネットワークストレージ経由で共有することは禁止されている(参照:Directory - Otto by HashiCorp)。将来的には、後述の shared directory がサポートされる予定。

フォルダ構造

Otto の用語 "directory" とファイルシステムのディレクトリとの混同を避けるため、以下ではファイルシステムの方は「フォルダ」と表記します。Otto関係のフォルダ構造は、以下の通りです。

こちらの内容は Appfile Compilation にある説明と、実機での動作確認結果をもとにまとめました。まだ理解できてない点については "?" と記載しています。

<app folder>
├─ Appfile ... 人手で作成・編集する Appfile (※必須ではない)
├─ .ottoid ... アプリを一意に識別するためのUUIDが書かれたファイル
└─ .otto ... otto compile で自動生成されるファイル群
     ├─ appfile
     │   ├─ Appfile.compiled ... otto compile コマンドが自動生成する Appfile
     │   ├─ deps ... dependencyの指定があるときに作られる
     │   │   └─ このアプリが依存するアプリの .ottoid および Appfile
     │   └─ version ... バージョン番号(1, 2, ...)が書かれたファイル
     ├─ compiled
     │   ├─ app
     │   │   ├─ build
     │   │   │   └─ otto build のための設定ファイル(Packer)
     │   │   ├─ deploy
     │   │   │   └─ main.tf ... otto deploy のための設定ファイル(Terraform)
     │   │   ├─ dev
     │   │   │   └─ Vagrantfile ... otto dev のための設定ファイル(Vagrant)
     │   │   └─ foundation-consul
     │   │        ├─ app-build
     │   │        ├─ app-deploy
     │   │        ├─ app-dev ... provision のために Vagrantfile から呼び出されるスクリプトおよび設定ファイル
     │   │        ├─ app-dev-dep
     │   │        └─ deploy
     │   ├─ dep-<dependencyの.ottoid (UUID)> ... dependencyの指定があるときに作られる
     │   │   ├─ deploy
     │   │   │   └─ デプロイするための設定ファイル(Terraform)
     │   │   ├─ dev
     │   │   │   └─ ローカルに構築するための設定ファイル(Vagrant)
     │   │   ├─ dev-dep
     │   │   │   └─ dependencyに指定された場合の設定ファイル(Vagrant)
     │   │   └─ foundation-consul
     │   │        └─ VM/インスタンスに Consul インストールするための設定ファイル
     │   ├─ foundation-consul
     │   │   ├─ app-build
     │   │   │   └─ アプリケーションに依存しない設定のテンプレート?
     │   │   ├─ app-deploy
     │   │   │   └─ アプリケーションに依存しない設定のテンプレート?
     │   │   ├─ app-dev
     │   │   │   └─ アプリケーションに依存しない設定のテンプレート?
     │   │   ├─ app-dev-dep
     │   │   │   └─ アプリケーションに依存しない設定のテンプレート?
     │   │   └─ deploy
     │   │        └─ otto infra で Consul ノード設定するための設定ファイル
     │   └─ infra-<infra name>
     │        └─ Infrastructure 構築するための設定ファイル(Terraform)
     └─ data
          ├─ dev_ip ... 開発環境のVagrant VMのIPアドレス
          └─ vagrant
               └─ 通常 .vagrant フォルダ内に作成されるファイル群

~/.otto.d
├─ binaries
│   ├─ packer
│   │   └─ Packer関係のバイナリ群のインストール先
│   └─ terraform
│        └─ Terraform関係のバイナリ群のインストール先
├─ cache
│   └─ 暗号化されたcredential(例:AWSアクセスキー)などが格納されるフォルダ
├─ checkpoint_cache ... ?
├─ checkpoint_signature ... ?
├─ directory
│   └─ otto.db ... ディレクトリのためのデータベース
└─ ip.db ... IPアドレスのためのデータベース?

Appfile Compilation によると、上記ファイルのうち、バージョン管理システムで共有すべきファイルは Appfile と .ottoid のみ。

Otto 0.1では未実装の機能(ドキュメントの記載)

ドキュメントに記載されていた未実装機能です。リリース時期として具体的なバージョン番号が記載されていた機能については、以下の説明にもその旨を記載しました。

Application type および infrastructure type のプラグイン

Otto はプラグインアーキテクチャで設計されている。すべての App type および Infra type は、ビルトインのタイプも含めてプラグインである。しかし、Otto 0.1 ではプラグインは利用できず、0.2 から利用できるようになる予定。

参考:Plugins

Custom Foundations

Otto は foundation を設定および置き換えできるような方法で設計されている。しかし、この機能は Otto 0.1 では有効でなく、将来のバージョンで公開される予定。

参考:Foundations

Dependency versioning

依存先(Dependency)のバージョンを指定するための仕組みがない。将来的には重要機能(first class feature)としてサポートする。

参考:Dependencies

Docker対応

otto build コマンドで Docker container を作成できるようになる予定だが、Otto 0.1 ではできない(つまり、AWSへのコンテナのデプロイはできない)。近い将来に、コンテナを作成し、それを Nomad でデプロイできるようになる予定(補足:前回の解説記事で書いたように、ローカル環境へのコンテナのデプロイはできます)。

参考:Build

また、Otto を Docker image の開発環境として使うことはできない。将来そうする計画はある。

参考:Dev - Docker (External) App Type

Shared Directory

共同作業のために、将来的には shared directory がサポートされる。最初にサポートされる shared directory は Alras の予定。

参考:Collaboration

VaultとNomadの自動インストール

近い将来、Otto は Consul 以外の foundation もサポートする。その具体例として、Vault と Nomad がある。

参考:Foundations

Datadogのようなサービスとの依存関係の定義

Appfile のなかでは、アプリケーションに関するすべての依存関係を定義できる。この依存関係には、他のアプリケーションに加えて、キューのようなインフラストラクチャの構成要素、および Datadog のような外部サービスを含む。

参考:Dependencies

Safe Upgrade(Ottoのアップグレード時の後方互換性)

Otto 0.1 から 0.2 にアップグレードする際の後方互換性は保証されない。Otto 0.2 では、恐らく、Safe upgrade のための機能が導入される。

参考:Backwards Compatibility

Otto 0.1では未実装の機能(実機での動作からの推測)

以下は、ドキュメントには記載がなかったものの、実機での動作を確認できなかった機能です。

AWSのリージョン指定

インスタンスのデプロイ先は us-east-1 (米国東部、バージニア北部リージョン)。以下のIssueがOpen状態のため、Appfileでリージョンを指定する方法はまだ無いと思われる。

参考:Enable AWS custom region selection · Issue #210 · hashicorp/otto

Dependency による複数台のVM/インスタンスの起動

この点はドキュメントに記載がなく、実機での動作からの推測だが、Appfile に dependency を記載しても、アプリケーションについては(infrastructureの分を除くと)1台のVM/インスタンスしか起動されない。詳細は前回の解説記事を参照のこと。

muziyoshiz.hatenablog.com