【手順】iOSのAPIサーバーに必要なIPv6をEC2に設定してみた(VPC)

はじめに

構築したサーバーをiOSのAPIサーバーとして使うとき、IPv6に対応することが必須になります。
IPv6に対応していないと、下記のようなエラーが出てしまいます。

We discovered one or more bugs in your app when reviewed on iPhone and iPad running iOS 10.2.1 on Wi-Fi connected to an IPv6 network.

まずは、現状の確認(IPv6)

1.AWSコンソールにログイン

2.IPv6に対応しているかコンソール上で確認。

[サービス]→[インスタンス]→[対象サーバーにチェック]→[説明]タブ押下
スクリーンショット 2017-03-13 20.50.11.png
空欄になっていますね!
設定後は、赤枠内にIPv6が表示されるはずです!

IPv6設定手順

1.AWSコンソールにログイン

2.VPCの編集/作成(今回は既存のVPCを編集します。)

[サービス]→[VPC]→[VPC]→[既存のVPCにチェック]→[アクション]→[Edit CIDRs]→[Add IPv6 CIDR]→[閉じる]
WS000003.JPG

WS000004.JPG

3.サブネットの編集

[サービス]→[VPC]→[サブネット]→[対象のサブネットにチェック]→[サブネットのアクション]→[Edit IPv6 CIDRs]→[Add IPv6 CIDR]→[チェックを入れる]→[閉じる]
WS000005.JPG

WS000006.JPG
まだIPv6はないですね。
WS000007.JPG
IPv6ができました!右の赤枠内のチェックは忘れやすいので、要注意!

4.IPv6をインスタンスに設定

[サービス]→[EC2]→[インスタンス]→[対象のサーバーにチェック]→[アクション]→[ネットワーキング]→[Manage IP Addresses]→[新しいIPの割り当て(IPv6 Addresses)]→[更新する]
WS000008.JPG

WS000009.JPG

5.コンソール上で確認

[サービス]→[インスタンス]→[対象サーバーにチェック]→[説明]タブ押下
WS000010.JPG
IPv6付与できた!
※プライベートIPv6を付与するために、サーバーの再起動をしたほうがいいかもしれません。

続きを読む

2017/3/11 JAWS DAYS 2017 参加メモ

http://jawsdays2017.jaws-ug.jp/

赤ドクロ Presents 『AWSでアプリ開発するなら 知っておくべこと』

https://www.slideshare.net/keisuke69/aws-73040279

アーキテクチャのベストプラクティス

  • Design for failure

    • 単一障害点をなくす、すべてが失敗し得るという前提で考える

      • 最初に1ホストを複数に分割する⇒Webとデータベース(RDS)
      • 複数のWebインスタンスを異なるAZで
      • RDSはMulti-AZ
      • ELBを利用して負荷分散
  • Build Security Every Layer
    • 通信経路および保存されたデータの暗号化、IAM/セキュリティグループ
  • Leverage Many Storage Options
    • 万能なデータストアは存在しない、特性に応じて使い分ける
    • Storage
      • Object Storage: S3, Glacier
      • File/Block Storage: EFS(NFS、共有ディスク), EBS
    • Database
      • NoSQL: ElastiCache, DynamoDB
      • SQL: RDS(トランザクション処理), Redshift(DWH)
      • 静的コンテンツはS3に
      • セッションやステートはDynamoDB
      • DBのキャッシュはElastiCache
  • Implement Elasticity
    • IPアドレスで参照しない(名前ベースで)、分散させる
  • Think Prallel
    • EMRを用いて並列のMapReduceジョブを実行、ELB、1つのKinesis Streamと複数のKCLアプリケーション、バックエンドとしてのLambda
    • 1インスタンスでN時間 = N台を1時間 ⇒ コストは同じ
  • Loose Coupling
    • コンポーネント間の結合度が緩やかになるほど、スケーラビリティは高まる
    • すべてのコンポーネントはブラックボックスとしてデザイン(APIアクセス、DNS名でアクセスなど)
    • Queueを使って疎結合に(部分的なretryがしやすくなる、重たい処理だけをスケールする)
    • Service Discovery
      • 各サービスで増えたリソース、減ったリソースに対して透過的にアクセス
      • Auto Scalingを使ったELB自動登録、Consulなど
    • Asynchronous Integration
      • 同期処理である必要がなければ非同期にする(その処理、本当にレスポンス必要ですか?)
      • アプリケーションがブロックされない
      • スケーラビリティ&高可用性
      • Frontendを停止することになくBackendを容易にメンテナンス可能
      • リクエストの処理順序やリトライ等の制御が容易に(一方、数珠つなぎで全体の見通しは悪くなる)
  • Don’t Fear Constraints
    • より多くのメモリが必要?⇒負荷分散、キャッシュ
    • データベースのIOPSが必要?⇒リードレプリカ、シャーディング、データベースのキャッシング
    • 問題のあるインスタンスを破棄し、置き換える

The Twelve-Factor App

  • Dockerによるアプリケーション開発やLambdaのようなサーバレスコンピュートの普及に伴い、改めて重要性が増しつつある
  • Codebase
    • デプロイされているアプリとコードベースは常に1:1であるべき
  • Dependencies
    • 依存関係を明示的に宣言し分離する
    • 特定の環境に暗黙的にインストールされているパッケージやツールに依存せず、アプリに同梱する
    • 例:gemとbundler
  • Config
    • OSレベルの環境変数によって注入されるべき
    • 設定ファイルは言語/フレームワークの環境依存になる
  • Backing Service
    • ネットワーク越しに使うものはすべてリソースとして扱い(URLのように)、データベースはアタッチされたリソースとして扱う
    • リソースの切替はリソースハンドルの切替(URLの切替)とする
  • Build
    • build、リリース、実行の3つのステージを厳密に分離する
    • すべてのリリースは一意のIDを持つべき(どの環境にどのIDがdeployされているか)
  • Process
    • アプリケーションをStatelessなプロセスの組み合わせとして実行!
    • スケールアウトの単位としてプロセスモデルは分かりやすい(スレッドはメモリ共有するなどで管理が複雑)
    • 永続化する必要のあるデータ(次のリクエストでも利用するデータ)はDBなどstatefullな外部サービスを利用
    • ローカルディスクのファイル、メモリ上のデータはあくまでもキャッシュとして扱う
  • Dsiposability
    • グレースフルシャットダウン
  • Dev/prod parity
    • 開発・ステージング・本番環境をできるだけ一致させ、CI/CDの効果を発揮する
  • Log
    • 出力ストリームの保存先やルーティングにアプリは関与しない(標準出力に吐き出すだけにする)
    • 収集、保存、インデックス化し分析する環境をアプリの外に用意する
  • Stateless
    • ステートフルにになる要素を水平スケールするリソースの外部に配置
    • Session情報(スケールアウトすると新しいインスタンスから見えない)⇒DynamoDBに見にいってローカルにキャッシュ

DevOps

  • 無駄やボトルネックを取り除くことで、ライフサイクル(フィードバックループ)を効率化し、高速化する
  • Cluture:End to EndでOne teamであること、主体的なオーナーシップ、行われた作業の結果に対する可視性を高める
  • Practice:Automate Everything、Test Everything, CI/CD/Infrastructure as a code, etc…
    • 自動化と構成管理:プロビジョニング、設定、オーケストレーション、レポーティング
    • ApplicationとInfrastructureをいずれも、バージョン管理し、build&testし、成果物を登録し、デプロイする
    • 繰り返し継続的に行う
  • Tool

DevOps tool on AWS

  • ほとんどのサービスにAPIが用意されている⇒プログラミングの文脈でインフラを制御する

    • 各言語のSDKが用意されている(IDE向けのプラグインも用意されている)
  • Cloud formation
  • Jenkinsを使ったデプロイ

ベストプラクティス

  • 自動ロールバック:まずはロールバックし、その後ログ/グラフなどを用いてデバッグする
  • ダッシュボードで通常時と異常時を把握する

AWS SECURITY DEATH m/ ~セキュ鮫様からのお告げ~ by Security-JAWS

ネットワーク

  • public subnet / private subnet

    • public subnet: インターネットに直接接続可能なサブネット(公開サーバを置く、EIPとの紐づけもできる)
    • private subnet: NATゲートウェイを経由して内⇒外のインターネット通信は可能
  • statefull / stateless
    • NAT配下のクライアントのSource Portはハイポート(1024-65535)からランダムに設定される
    • Statefull: 戻りの通信もよろしくしてくれる
    • Stateless:内⇒外も書かないといけない(1024-65535/tcp)
    • Security GroupはStatefull⇔Network ACL(subnet単位で通信を制御)はStateless
  • VPN
    • ユースケース

      • Webサーバ/DBサーバのメンテナンスはプライベートネットワーク経由で行いたい(平文でインターネットを通さない)
      • 社内システムで事業所とAWSの間(Direct Connectは品質を高めることもできる)
      • AWSを既存システムの拡張リソースとして使用するような場合(繁忙期など)
    • VPNの場合、AWS側には2つのVPNエンドポイントが用意される(Customer Gateway側で2つのトンネルを張る必要がある)
      • static routingもしくは、BGPによるダイナミックルーティング(対応機種のFAQ参照)
  • Direct Connect(専用線接続)
    • 宅内~接続ポイント⇒一般的には通信キャリア
    • 接続ポイント~AWS⇒AWSが提供
    • VLAN分けをできるキャリアと、できないサービスがある
    • TOKAIコミュニケーションズ、Colt(旧KVH)

WAF/DDoS

  • 全脳アーキテクチャ若手の会
    #### DDoS
  • DDoS対策(コストがかかる)、DDoSをあえて受ける(落ちてもいいサイトであれば、放置するのも一つ)
    • L3/L4:Infrastructure
    • L7: Application
  • AWS Shield
    • CloudFrontを使って、Shieldオプションを有効化
    • Shieldの後ろはAWSでも、オンプレでも対策可能
    • 防御対象:CloudFront, ELB, ALB, Route53
    • 監視:常にモニタリングしてベースラインの作成、異常検出
    • Basicは無料で利用可能、AdvancedはDRT付き
    • Billing Protection
    • DRT:WAFのチューニングやルール作成もやる
    • CloudFrontさえ入っているなら、導入しておかない手はない!

WAF

  • FWやIDS/IPSでは防ぐことができない不正な攻撃を遮断(アプリケーション脆弱性など)

    • PCI-DSS 6.6にもWAF導入について明記されている
  • AWS WAF
    • カスタムルール(IPアドレス制限/文字列制限)、SQLI/XSSといった基本的な対策が可能
    • 構成:CloudFront, ELB, ALBに仕込めるマネージドWAF
    • ルールを正規表現で書けない、WAF検知ログは100件まで
  • AWS WAF / WAF on AWS / SaaS WAF / Cloud WAFの比較
    • SaaS WAF / Cloud WAF: 正常な通信の確認、DNSの向き先変更程度で導入できる
    • WAF on AWSはオートスケールに対応している製品が多い
    • AWS WAFはセキュリティ面では物足りない
  • 「セキュリティ開発」はなぜ浸透しないのか

AWS Config

ごちゃごちゃしやすいAWSリソースを簡単に「見える化」できる

  • 構成管理、変更管理のためのサービス(よく使うサービスは対応済)

    • 構成情報のスナップショットの取得
    • 変更内容を追うことができる、SNSを使った通知も可能
    • AWSリソース間の関係性の確認(EC2とVPC/Security Group/ALBとの関係)
    • EC2 Systems Manager: エージェントを入れると、OSの中の情報を取れる、コンソールからコマンドを発行⇒OS上の変更管理が可能になった
    • IAMの構成管理
  • ユースケース
    • AWSリソースの一覧でAWSリソースを確認できる、削除されたリソースについても追跡可能
    • いつ、どのように変更されたかを記録するので証跡として利用可能
    • 関連するAWSリソースも辿れるのでトラブルシュートしやすい
  • AWS Confing Rules
    • AWS Configで記録した設定が正しいかを判定するルールを定義できる
      • セキュリティグループがフルオープン
      • MFA設定していない
      • ACMの証明書の有効期限があと少し
  • マネージドルール
    • Instanceにtagをつけているか?(billingのために、作った人/プロジェクト名をつける)
    • SecurityGroupがフルオープンになっているか?
  • カスタムルール
    • 判定機構はLambdaで実装⇒極論、修正することもできる
    • awslabsにカスタムルールが公開されている(現在34)
  • AWS Configを有効化して可視化
    • Auto Scalliingで、頻繁にインスタンスの起動/削除をしていなければ、課金額は大きくない

Chat bots with Amazon Lex

  • Amazon Lex:音声/テキスト処理

    • Alexaと同じ技術で提供されている
    • 音声認識+自然言語処理
  • コンポーネント
    • ユーザ入力⇒出力
    • Intents:意図(Utterance/Slots)
    • Fulfillment:処理
  • Utterance
    • Intent(例:RegisteruserForEvent)に対してユーザ入力を紐づける
    • Sample utteranceを複数事前に定義する
    • 反復して学習することによってユーザ入力の言い回しの揺れを吸収(徐々に改善していく)
  • Slot
    • SLOT NAME: eventDate, SLOT TYPE: AMAZON.DATE
    • 12 March 2017 / tomorrowみたいな揺れを吸収できる
  • Fulfilment
    • AWS Lambdaとの統合⇒クライアントにレスポンスを返す
  • 複数のintentをflowにすることで、より自然な対話が可能になる
    • もう少し知りたいですか? ⇒ yes ⇒ 次のintentに繋げる
    • 曖昧な答えの場合は、プロンプトを出す(「”yes”か”no”で答えてください」)
  • Lambdaとの統合
    • Lexがユーザ入力をparseし、intent/slotsを渡してlambdaを起動、lambdaからレスポンスを返す
    • dialogAction:会話の流れをつかさどる(例:ConfirmIntent)
    • facebookの場合、Response cardを返すこともできる(ユーザに選択肢リストを提示)
  • Lambda Functionの実装例
    • switchでintentごとの処理を定義して、1 functionで複数intentを処理
    • LexResponseBuilderでレスポンスをbuild
  • English Onlyでlaunchするが、複数言語をサポートするロードマップ
    • 開発者からAWS Japanへプレッシャーを!
  • 最初はよくテストして、エラーが多いようであればintentを細かく設定するなどの工夫が必要

サーバレスの今と未来

https://www.slideshare.net/YoshidaShingo/serverlessnowandthen

サーバレス

  • パラダイムシフト

    • サーバが要らないということではなく、開発者はサーバについて「考えなくてもよくなる」
    • 2014年末のre:InventにてLambdaの発表
    • 最大の特徴は、課金は使った分だけ(メモリ×時間×実行回数)
  • Function as a Service
    • アーキテクチャにおける責務

      • Stateful >> Stateless
      • 永続データ >> 揮発性
      • バッチ >> イベントドリブン
  • Lambda goes everywhere
    • コンテナベースの実行環境はportabilityが高いので、いろいろなところにデプロイできる
    • Athenaの基盤もLambda
    • Greengrass(AWS IoT)
    • CloudFrontのEdgeの上

代表的なサーバレスアーキテクチャ

  • UIドリブンアプリケーション

    • 認証ロジックをBaaS、DynamoDBにクライアントから直接アクセス、SPA+API Gateway
  • メッセージドリブンアプリケーション
    • オンライン広告システム
    • コンテンツのサムネイル作成(image magicを載せたlambda)
    • ログのストリームプロセッシング(kinesis/kafkaから取って、加工して、S3やDynamoに入れる)

エコシステム

  • プラットフォーム事業者、フレームワークやツール、アプリケーション開発者

    • アプリケーション開発者のノウハウ発信が足りない
    • cloud packの毎日放送事例
  • Serverless framework, Apex, Lamvery, Swagger, AWS Serverless Application Model(SAM), Postman…
  • SAM
    • CloudFormationテンプレートで管理できる
    • lambda, API Gateway, DynamoDBがサポートされている
    • app-spec.yaml -> CloudFormation(codeはS3経由でデプロイされる)

サーバレスだからこそできることをやる

  • 10X Product Development

    • TypeScriptしか書かず、あとは外部のサービスを使っている
    • firebase(auth), Netlify(static site hosting), Cloudinary(画像管理), Algolia(検索)
  • Serverless, NoOpes and the Tooth Fairy
    • 来るサーバーレスな未来では、アプリケーション開発者が運用に責任を持つ
    • プロバイダの技術情報や、内部技術が何に依存しているか理解する
    • 可視性が下がる、自分自身で問題をfixできないし新機能を実装することもできない
    • 売れていないサービスはシャットダウンされるかも
  • 日経新聞事例(紙面ビューアー)
    • 最大18,000回/1分間のinvocation
  • システムをリアクティブに設計する
    • イベントの発火やwebhookなどに対応している周辺のマネージドサービスとうまくつないでいる
    • シンプルなマイクロサービスとして
    • 一度トライアルしておき、いざ活用する前にはまりどころなど判断

SPAの開発の流れ

  • ビュー/アプリ(js)開発

    • ビューの作成
    • テスト駆動でアプリコードを追加(テストがないと、統合時に問題が起こったときの切り分けが困難)
    • 例:jQuery+Jasmine
    • ローカルで開発可能、チーム開発がはじまったらS3で
    • テスト時のブラウザキャッシュに注意(chromeの開発者ツールでdisable cacheするとか)
    • AWSに繋ぐ前に、1行書いたら1行テスト
  • Cognitoを使った認証+フェデレーション
    • 例:Google+
    • Googleで認証してIDが払い出される
    • ブラウザがCognitoにJSでアクセス、CognitoがGoogleに検証、OKであればDynamoDB書き込み権限を払い出す
  • DynamoDBを使ったデータの管理
  • Lambdaでシステム強化
    • DynamoDB直接読み書きでは仕組みとしてできてしまう、「不正なクエリからの保護」(lambdaでvalidationするなど)
    • 「ユーザ全員分の集計」などの情報提供のため
  • Serverless Single Page Apps
    • Ben Rady著、Step by Stepガイド(日本語版が間もなく出る予定)

参考(ところどころで言及されていた別発表)

[AWSワークショップ] Amazon Kinesis Analyticsを触ってみよう

kinesis

  • モチベーション

    • 処理した結果を複数システムに送る必要がある

      • kafka or Kinesis Streams
    • しかも機械学習を行なう
      • Spark Streaming or Storm
  • Kinesis
    • Streams

      • マネージドkafkaのイメージ:入出力に制限はある(入力:秒間1MBまたは1,000put)
    • Firehose:S3, Redshiftへ簡単に配信
    • Analytics:SQLクエリー
  • Stream Source/Destination(StreamかFirehose)
    • 入力側を決定する(Strems or firehouse)
    • 入力データの型定義をおこなう
    • SQL分を作成、デプロイ
    • 出力先を決定する(Strems or firehouse)
  • kinesis demo stremasは良く停止するので注意・・・
    • データ定義は大文字で定義(もしくはselect句をダブルクォーテーションで挟む)

Windowの概念

  • Tumbling Window(例:1分ごとに出力)

    • FLOOR((“SOURCE_SQL_STREAM_001”.ROWTIME – TIMESTAMP ‘1970-01-01 00:00:00’) SECOND / 10 TO SECOND)
    • 10 TO SECOND⇒10秒間隔
  • Sliding Window(データが流れてきたら出力を開始する)
    • Time(60sec:レコード受信をトリガーに直近60sec分を集計)
    • Row(2rows:自分+直近2レコード)
    • 1つのdestinationに対して、TimeとRowを両方設定できる

Reference Dataの追加

  • AWS CLIでのみ追加が可能
  • 例:S3のファイルを見る
  • 現状、Reference Dataを追加すると動作しない(サポート確認中)

まとめ

  • Firehose -> Elastic Search -> KibanaとすべてAWSコンソールで設定可能
  • 構築は非常に楽、標準SQL、Firehoseで接続が簡単
  • バグが多い、性能評価がしにくい
  • kinesis streamsはzookeeperの管理が不要、KPLと併用すれば非常に安い
  • Analyticsは簡単な集計処理ならよいが、複雑な処理はSpark Streaming等を利用したほうがよい

[Alexaハンズオン] Alexa Skills Kit で遊ぼう【基礎編】

続きを読む

Vagrant+AnsibleでUbuntu16.04にDocker環境を構築

概要

最近話題の構成管理ツールAnsibleを使ってAmazon EC2上でDocker環境を構築する。

future.jpg

なぜAnsible+Docker?

本音としては、単に両方使ってみたかったから。
ただ、Ansible単体でやらない言い訳みたいなのもある。

  • 色んなサービスの設定ファイルをサーバに直接混ぜて配置したくない
  • サービス単体でアップデートや環境を破壊とかしたい
  • 各サービスに合わせてミドルウェアの整合性合わせてって作業が面倒くさい

実施内容

  • AmazonEC2 + Vagrantの導入(実施済み)
  • AnsibleのPlaybooks作成
  • Vagrantfileの修正
  • Dockerの動作確認

AmazonEC2 + Vagrantの導入

こっちを参照

AnsibleのPlaybooks作成

$ tree
.
├── README.md
├── Vagrantfile
├── docs
│   └── ec2
│       └── setup.md
└── setup
    └── provision
        └── docker.yml

4 directories, 4 files
docker.yml
- hosts: all
  become: yes
  tasks:
    - name: apt-get install packages
      apt: pkg={{ item }} state=present update_cache=yes
      with_items:
        - curl
        - apt-transport-https
        - ca-certificates

    - name: set dockers official gpg key
      apt_key:
          url: "https://download.docker.com/linux/ubuntu/gpg"
          state: present
      register: set_key

    - name: set up the stable repository
      apt_repository:
        repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
        state: present
      when: set_key
      register: set_repo

    - name: install docker-ce
      apt: pkg=docker-ce state=present update_cache=yes
      when:  set_repo

Vagrantfileの修正

要点は2つ

  • サーバ側にAnsibleのPlaybookを送信する
  • Provisionにansible_localを設定し、サーバでAnsibleのインストール+実行を行う
Vagrantfile
  Dotenv.load

  Vagrant.configure("2") do |config|
    # Vagrant Box
    config.vm.box = "dummy"

+   # Rsync Directory
+   config.vm.synced_folder "setup", "/vagrant", type: "rsync"

+   # Ansible
+   config.vm.provision "ansible_local" do |ansible|
+     ansible.playbook = "provision/docker.yml"
+   end

    # AWS
    config.vm.provider :aws do |aws, override|
        ## 省略...
    end
  end

Dockerの動作確認

$ vagrant up
Bringing machine 'default' up with 'aws' provider...
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Type: t2.micro
==> default:  -- AMI: ami-c68fc7a1
==> default:  -- Region: ap-northeast-1
==> default:  -- Availability Zone: ap-northeast-1c
==> default:  -- Keypair: default
==> default:  -- Subnet ID: subnet-594ac601
==> default:  -- Elastic IP: true
==> default:  -- User Data: yes
==> default:  -- Security Groups: ["sg-8897d1ef"]
==> default:  -- User Data: sed -i -e 's/^(Defaults.*requiretty)/#1/' /etc/sudoers
==> default:  -- Block Device Mapping: []
==> default:  -- Terminate On Shutdown: false
==> default:  -- Monitoring: false
==> default:  -- EBS optimized: false
==> default:  -- Source Destination check:
==> default:  -- Assigning a public IP address in a VPC: true
==> default:  -- VPC tenancy specification: default
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /mnt/c/Users/kazuyoshi/aws-training/setup/ => /vagrant
==> default: Running provisioner: ansible_local...
    default: Installing Ansible...
    default: Running ansible-playbook...

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [default]

TASK [apt-get install packages] ************************************************
ok: [default] => (item=[u'curl', u'apt-transport-https', u'ca-certificates'])

TASK [set dockers official gpg key] ********************************************
changed: [default]

TASK [set up the stable repository] ********************************************
changed: [default]

TASK [install docker-ce] *******************************************************
changed: [default]

PLAY RECAP *********************************************************************
default                    : ok=5    changed=3    unreachable=0    failed=0
$ vagrant ssh
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-64-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

10 packages can be updated.
0 updates are security updates.


$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

$ exit
logout

所感

本格的にAnsibleを使っていこうとするとAnsible Documentationを読み込まないと良いPlaybooksが書けないかも。
ただ、冪等性とかを考えないならcommandやshellでshellscriptで書いてたものを移植すれば良いので簡単に扱える

次は、サービスのDockerをしてからホストサーバのマルチ化かな?
インフラのサービス化として、本格的に検証環境作っていくのはまだまだ先か

参考サイト

続きを読む

vagrant-awsのvagrant destroy時のエラー回避策

概要

Vagrantを使ってAWSインスタンスの管理設定をしていたらvagrant destroyでエラーが出て悩まされた
原因は、「初期作成されているVPCを使うとエラーが出る」もしくは、「VPCを指定しないとエラーが発生する」みたいだったが、直ったので調査は切り上げた
とりあえず、自分の解決策を残しておく

発生したエラー

$ vagrant destroy -f
/home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/expects.rb:7:in `response_call': InvalidParameterValue => You must specify an allocation id when releasing a VPC elastic IP address (Fog::Compute::AWS::Error)
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/response_parser.rb:9:in `response_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:388:in `response'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:252:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/idempotent.rb:27:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:272:in `rescue in request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:215:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/idempotent.rb:27:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:272:in `rescue in request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:215:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/idempotent.rb:27:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/middlewares/base.rb:11:in `error_call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:272:in `rescue in request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/excon-0.55.0/lib/excon/connection.rb:215:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/fog-xml-0.1.2/lib/fog/xml/sax_parser_connection.rb:35:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/fog-xml-0.1.2/lib/fog/xml/connection.rb:7:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/fog-aws-1.2.0/lib/fog/aws/compute.rb:527:in `_request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/fog-aws-1.2.0/lib/fog/aws/compute.rb:522:in `request'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/fog-aws-1.2.0/lib/fog/aws/requests/compute/release_address.rb:25:in `release_address'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/vagrant-aws-0.7.2/lib/vagrant-aws/action/terminate_instance.rb:45:in `release_address'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/vagrant-aws-0.7.2/lib/vagrant-aws/action/terminate_instance.rb:24:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/vagrant-aws-0.7.2/lib/vagrant-aws/action/elb_deregister_instance.rb:19:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /home/nakao/.vagrant.d/gems/2.2.5/gems/vagrant-aws-0.7.2/lib/vagrant-aws/action/connect_aws.rb:43:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:95:in `block in finalize_action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builder.rb:116:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `block in run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/util/busy.rb:19:in `busy'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builtin/call.rb:53:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builtin/config_validate.rb:25:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:95:in `block in finalize_action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builder.rb:116:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `block in run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/util/busy.rb:19:in `busy'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builtin/call.rb:53:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/warden.rb:34:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/builder.rb:116:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `block in run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/util/busy.rb:19:in `busy'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/action/runner.rb:66:in `run'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/machine.rb:225:in `action_raw'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/machine.rb:200:in `block in action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:567:in `lock'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/machine.rb:186:in `call'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/machine.rb:186:in `action'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/plugins/commands/destroy/command.rb:31:in `block in execute'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/plugin/v2/command.rb:235:in `block in with_target_vms'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/plugin/v2/command.rb:229:in `each'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/plugin/v2/command.rb:229:in `with_target_vms'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/plugins/commands/destroy/command.rb:30:in `execute'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/cli.rb:42:in `execute'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/lib/vagrant/environment.rb:308:in `cli'
        from /opt/vagrant/embedded/gems/gems/vagrant-1.9.1/bin/vagrant:127:in `<main>'

対処

  1. AWS VPCの設定(AWS)
  2. Security Groupの設定(AWS)
  3. vagrant-awsのインストール(Local)
  4. Vagrantfileに設定追加(Local)

AWS VPCの設定(AWS)

AWS VPCコンソールでVPCウィザードの手順通りに設定するだけ
VPCとはなんぞや?的な話は省略!
[手順]
1. 「1 個のパブリックサブネットを持つ VPC」を選択
2. アベイラビリティゾーンを「ap-northeast-1c」に設定
3. 後はデフォルトの設定のまま、てきとーに作成(オイッ
4. サブネットのタブ開いて サブネットID をメモ(Vagrantfileで使う)

Security Groupの設定(AWS)

Amazon EC2コンソールでセキュリティグループを新規作成する
[手順]
1. セキュリティグループ名/説明を入力
2. VPCに、先ほど作成したVPCを設定
3. インバウンドにVagrantを使ってアクセスするPCのグローバルIPを設定
4. セキュリティグループID をメモ(Vagrantfileで使う)

vagrant-awsの設定(Local)

前回記事参照

Vagrantfileに設定追加(Local)

以下の設定を追加

Vagrantfile
  Vagrant.configure("2") do |config|
    # Vagrant Box
    config.vm.box = "dummy"

    # Rsync Directory
    config.vm.synced_folder "setup", "/vagrant", type: "rsync"

    config.vm.provider :aws do |aws, override|
      # AWS Account
      aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
      aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']

      # Instance Configuration
      aws.tags = {
        'Name' => 'DevelopEnvironment'
      }
      aws.instance_type = "t2.micro"
      aws.ami = "ami-c68fc7a1"
      aws.region = "ap-northeast-1"
      aws.availability_zone = "ap-northeast-1c"
      aws.associate_public_ip = true
+     aws.security_groups = ['sg-XXXXXXXX']
+     aws.elastic_ip = true
+     aws.subnet_id = "subnet-XXXXXXXX"

      # Login Configuration
      aws.keypair_name = "default"
      override.ssh.username = "ubuntu"
      override.ssh.private_key_path = "~/.ssh/default.pem"

      # SSH accessable
      aws.user_data = "sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers"

    end
  end

実行結果

$ vagrant up
Bringing machine 'default' up with 'aws' provider...
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Type: t2.micro
==> default:  -- AMI: ami-c68fc7a1
==> default:  -- Region: ap-northeast-1
==> default:  -- Availability Zone: ap-northeast-1c
==> default:  -- Keypair: default
==> default:  -- Subnet ID: subnet-XXXXXXXX
==> default:  -- Elastic IP: true
==> default:  -- User Data: yes
==> default:  -- Security Groups: ["sg-XXXXXXXX"]
==> default:  -- User Data: sed -i -e 's/^\(Defaults.*requiretty\)/#\1/' /etc/sudoers
==> default:  -- Block Device Mapping: []
==> default:  -- Terminate On Shutdown: false
==> default:  -- Monitoring: false
==> default:  -- EBS optimized: false
==> default:  -- Source Destination check:
==> default:  -- Assigning a public IP address in a VPC: true
==> default:  -- VPC tenancy specification: default
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /mnt/c/Users/kazuyoshi/aws-training/setup/ => /vagrant
$ vagrant ssh
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-64-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


ubuntu@ip-10-147-58-161:~$ exit
logout
$ vagrant destroy -f
==> default: Terminating the instance...

続きを読む

今更ながらVagrant+AmazonEC2を触ってみた

概要

今更ながらVagrantを使ってAmazonEC2のインスタンスを管理できるようにしてみた
流行はすでに終わっているし、情報もすぐに出てくるが、自分の備忘録として残しておく

環境

  • OS: Windows 10
  • コンソール: Bash on Ubuntu on Windows
  • Vagrant: 1.9.1
  • vagrant-aws: 0.7.2

実施内容

  • Vagrantのインストール
  • vagrant-awsの導入
  • アクセスキーの発行
  • キーペアの設定
  • セキュリティグループの作成
  • Vagrantの認証設定
  • Vagrantfileの作成

Vagrantのインストール

このサイトからDebian 64bitのDEBファイルを取得し、Bash on Ubuntu on Windowsでインストール

$ dpkg -i vagrant_1.9.1_x86_64.deb
$ vagrant -v
Vagrant 1.9.1

vagrant-awsの導入

$ vagrant plugin install vagrant-aws
Installing the 'vagrant-aws' plugin. This can take a few minutes...
Fetching: ipaddress-0.8.3.gem (100%)
Fetching: formatador-0.2.5.gem (100%)
Fetching: excon-0.55.0.gem (100%)
Fetching: fog-core-1.43.0.gem (100%)
Fetching: fog-json-1.0.2.gem (100%)
Fetching: fog-xml-0.1.2.gem (100%)
Fetching: trollop-2.1.2.gem (100%)
Fetching: CFPropertyList-2.3.5.gem (100%)
Fetching: rbvmomi-1.9.4.gem (100%)
Fetching: fission-0.5.0.gem (100%)
Fetching: inflecto-0.0.2.gem (100%)
Fetching: xml-simple-1.1.5.gem (100%)
Fetching: fog-xenserver-0.2.3.gem (100%)
Fetching: fog-vsphere-1.7.1.gem (100%)
Fetching: fog-voxel-0.1.0.gem (100%)
Fetching: fog-vmfusion-0.1.0.gem (100%)
Fetching: fog-terremark-0.1.0.gem (100%)
Fetching: fog-storm_on_demand-0.1.1.gem (100%)
Fetching: fog-softlayer-1.1.4.gem (100%)
Fetching: fog-serverlove-0.1.2.gem (100%)
Fetching: fog-sakuracloud-1.7.5.gem (100%)
Fetching: fog-riakcs-0.1.0.gem (100%)
Fetching: fog-radosgw-0.0.5.gem (100%)
Fetching: fog-rackspace-0.1.4.gem (100%)
Fetching: fog-profitbricks-3.0.0.gem (100%)
Fetching: fog-powerdns-0.1.1.gem (100%)
Fetching: fog-openstack-0.1.20.gem (100%)
Fetching: fog-local-0.3.1.gem (100%)
Fetching: fog-google-0.1.0.gem (100%)
Fetching: fog-ecloud-0.3.0.gem (100%)
Fetching: fog-dynect-0.0.3.gem (100%)
Fetching: fog-cloudatcost-0.1.2.gem (100%)
Fetching: fog-brightbox-0.11.0.gem (100%)
Fetching: fog-aws-1.2.0.gem (100%)
Fetching: fog-atmos-0.1.0.gem (100%)
Fetching: fog-aliyun-0.1.0.gem (100%)
Fetching: iniparse-1.4.2.gem (100%)
Fetching: fog-1.38.0.gem (100%)
Fetching: vagrant-aws-0.7.2.gem (100%)
Installed the plugin 'vagrant-aws (0.7.2)'!
$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'dummy' (v0) for provider:
    box: Downloading: https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
==> box: Successfully added box 'dummy' (v0) for 'aws'!

アクセスキーの発行

詳細はAWS IAMのドキュメントを参照
今回は手順だけ
1. IAMコンソールにアクセス
2. ユーザタブにて、AmazonEC2を操作できるユーザを選択
3. 認証情報タブからアクセスキーを発行
4. CSVファイルをダウンロード(大事に保管すること)

キーペアの設定

詳細はAmazon EC2のドキュメントを参照
今回は手順だけ
1. Amazon EC2コンソールにアクセス
2. キーペアタブを選択
3. キー作成ボタンを選択
4. キーペア名を入力し、作成ボタンを選択(今回はdefaultと入力)
5. PEMファイルを~/.ssh以下に配置

セキュリティグループの作成

詳細はAmazon EC2のドキュメントを参照
今回は手順だけ
1. Amazon EC2コンソールにアクセス
2. セキュリティグループを選択
3. セキュリティグループの作成ボタンを選択
4. セキュリティグループ名を入力(今回はsecurity)
5. ルール追加にて、自分のグローバルアドレスを使ってアクセスできるように設定

Vagrantの認証設定

Vagrantfileに認証情報を書きたくないので、今回は認証情報を環境変数に設定するスクリプトを作成

privateKeys.sh
#!/bin/sh
export AWS_ACCESS_KEY_ID='AKIXXXXXXXXXXXXXXXXX'
export AWS_SECRET_ACCESS_KEY='fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

Vagrantfileの作成

Vagrantfile
Vagrant.configure("2") do |config|
  # Vagrant Box
  config.vm.box = "dummy"

  # Rsync Directory
  config.vm.synced_folder "setup", "/vagrant", type: "rsync"

  config.vm.provider :aws do |aws, override|
    # AWS Account
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']

    # Instance Configuration
    aws.tags = {
      'Name' => 'DevelopEnvironment'
    }
    aws.instance_type = "t2.micro"
    aws.ami = "ami-c68fc7a1"
    aws.region = "ap-northeast-1"
    aws.availability_zone = "ap-northeast-1c"
    aws.security_groups = ['security']
    aws.elastic_ip = true

    # Login Configuration
    aws.keypair_name = "default"
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "~/.ssh/default.pem"

    # SSH accessable
    aws.user_data = "sed -i -e 's/^\(Defaults.*requiretty\)/#\1/' /etc/sudoers"

  end
end

動作確認

$ source privateKeys.sh
$ vagrant up
Bringing machine 'default' up with 'aws' provider...
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Type: t2.micro
==> default:  -- AMI: ami-c68fc7a1
==> default:  -- Region: ap-northeast-1
==> default:  -- Availability Zone: ap-northeast-1c
==> default:  -- Keypair: default
==> default:  -- Elastic IP: true
==> default:  -- User Data: yes
==> default:  -- Security Groups: ["security"]
==> default:  -- User Data: sed -i -e 's/^(Defaults.*requiretty)/#1/' /etc/sudoers
==> default:  -- Block Device Mapping: []
==> default:  -- Terminate On Shutdown: false
==> default:  -- Monitoring: false
==> default:  -- EBS optimized: false
==> default:  -- Source Destination check:
==> default:  -- Assigning a public IP address in a VPC: false
==> default:  -- VPC tenancy specification: default
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /mnt/c/Users/kazuyoshi/aws-training/setup/ => /vagrant

参考

続きを読む

[AWS] EC2 で OpenVPN サーバを起動する

OpenVPN サーバ作る必要があったので、作業メモ

OpenVPN サーバのローンチ

MarketPlace に AMI があるので、それから作るのが簡単です。
Launch on EC2: OpenVPN Access Server
上のリンクからローンチすればセキュリティグループも作ってくれるけど、自分でセキュリティグループ作りたい場合は、インバウンドで最低限以下を許可するように設定。

Connection Method Protocol Port Range Source (IP or Group)
SSH tcp 22 Anywhere or IP Range
HTTPS tcp 443 Anywhere
tcp 943 Anywhere
udp 1194 Anywhere

起動したら EIP 割り当てておけば、後々便利。

しばらくすると EC2 起動してくるので、ssh 接続してイニシャルセッティングする。

$ ssh -i ~/.ssh/openvpn.pem openvpnas@xxx.xxx.xxx.xxx
Welcome to OpenVPN Access Server Appliance 2.1.4b

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

user-data not available: HTTP Error 404: Not Found: util/ec2:12,util/ec2:7,python2.7/urllib2:154,python2.7/urllib2:437,python2.7/urllib2:550,python2.7/urllib2:475,python2.7/urllib2:409,python2.7/urllib2:558 (urllib2.HTTPError)

          OpenVPN Access Server
          Initial Configuration Tool
------------------------------------------------------
OpenVPN Access Server End User License Agreement (OpenVPN-AS EULA)
 ()

Please enter 'yes' to indicate your agreement [no]: yes

Once you provide a few initial configuration settings,
OpenVPN Access Server can be configured by accessing
its Admin Web UI using your Web browser.

Will this be the primary Access Server node?
(enter 'no' to configure as a backup or standby node)
> Press ENTER for default [yes]: yes

Please specify the network interface and IP address to be
used by the Admin Web UI:
(1) all interfaces: 0.0.0.0
(2) eth0: 192.168.0.1
Please enter the option number from the list above (1-2).
> Press Enter for default [2]: 2

Please specify the port number for the Admin Web UI.
> Press ENTER for default [943]: 943

Please specify the TCP port number for the OpenVPN Daemon
> Press ENTER for default [443]: 443

Should client traffic be routed by default through the VPN?
> Press ENTER for default [no]: no

Should client DNS traffic be routed by default through the VPN?
> Press ENTER for default [no]: yes

Use local authentication via internal DB?
> Press ENTER for default [yes]: yes

Private subnets detected: ['19.168.0.0/16']

Should private subnets be accessible to clients by default?
> Press ENTER for EC2 default [yes]: yes

To initially login to the Admin Web UI, you must use a
username and password that successfully authenticates you
with the host UNIX system (you can later modify the settings
so that RADIUS or LDAP is used for authentication instead).

You can login to the Admin Web UI as "openvpn" or specify
a different user account to use for this purpose.

Do you wish to login to the Admin UI as "openvpn"?
> Press ENTER for default [yes]: yes 
(admin ユーザ名変えたい時は、ここで no 答えて、次の質問で変えたい名前を入力)

Type the password for the 'openvpn' account:
Confirm the password for the 'openvpn' account:

> Please specify your OpenVPN-AS license key (or leave blank to specify later): 


Initializing OpenVPN...
Adding new user login...
useradd -s /sbin/nologin "openvpn"
Writing as configuration file...
Perform sa init...
Wiping any previous userdb...
Creating default profile...
Modifying default profile...
Adding new user to userdb...
Modifying new user as superuser in userdb...
Getting hostname...
Hostname: xxx.xxx.xxx.xxx
Preparing web certificates...
Getting web user account...
Adding web group account...
Adding web group...
Adjusting license directory ownership...
Initializing confdb...
Generating init scripts...
Generating PAM config...
Generating init scripts auto command...
Starting openvpnas...

NOTE: Your system clock must be correct for OpenVPN Access Server
to perform correctly.  Please ensure that your time and date
are correct on this system.

Initial Configuration Complete!

You can now continue configuring OpenVPN Access Server by
directing your Web browser to this URL:

https://xxx.xxx.xxx.xxx:943/admin
Login as "openvpn" with the same password used to authenticate
to this UNIX host.

During normal operation, OpenVPN AS can be accessed via these URLs:
Admin  UI: https://xxx.xxx.xxx.xxx:943/admin
Client UI: https://xxx.xxx.xxx.xxx:943/

See the Release Notes for this release at:
   http://www.openvpn.net/access-server/rn/openvpn_as_2_1_4b.html

openvpnas@openvpnas2:~$ sudo apt-get update && sudo apt-get upgrade

これで https://{public IP Address}:943/admin にアクセスすることで、ローンチした OpenVPN サーバの管理パネルに接続できます。
(自己署名証明書による HTTPS 接続なので、セキュリティ例外追加しないと接続できないので注意)

OpenVPN サーバで接続用のユーザ作成

https://{public IP Address}:943/admin から管理パネルにログインして [User Management] の [User Permitions] でユーザを追加。
[Allow Auto-login] にチェックしておくと、ユーザの設定が簡略化されるのでオススメ。

他の設定とか諸々はドキュメント参照。

OpenVPN クライアントのインストールと設定

Tunnelblick あたりをインストールしておけばいいです。
上の設定で VPN 接続用のユーザを作成してあるのであれば https://{public IP Address}:943/ にログイン。
Screen Shot 2017-02-22 at 12.54.03.png

すると、以下のような画面が表示されるので [Yourself (autologin profile)] ってリンクから ovpn ファイルをダウンロード。
Screen Shot 2017-02-22 at 12.54.13.png

ダウンロードした ovpn ファイルをダブルクリックすると Tunnelblick が起動して、よしなに設定してくれます。

iPhone とかでも VPN 接続したい場合は iPhoneやiPad (iOS) でOpenVPNを使ってみよう! を参考にしてみましょう。

MarketPlace にある AMI 使うと簡単にできて便利すなぁ。

参考 URL

続きを読む

AWS E2 G2インスタンス上にKeras環境を構築する 2017年2月版

はじめに

Deep Learningをやろうと思ったらでかい計算資源が必要なのが当たり前なのだけど、手持ちのPCのスペックで十分とかそうそうありはしないので、EC2のGPUインスタンスをささっと立てて使うのも手だと思う。

FrameworkはKerasでバックエンドはTensorFlow GPUバージョン。それをpyenv仮想環境でセットアップする構成とした。先日TensorFlow 1.0がリリースされてtf.kerasが実装されたみたいだけどまだ試してないので普通にKeras使うことにする。

環境構築についてはこちらを参考にさせていただいた。
AWSのGPUインスタンスでTensorFlowを動かす

インスタンスの作成

EC2 Instance: クイックスタートにある Ubuntu Server 16.04 LTS (HVM), SSD Volume Type
Type : g2.2xlarge
ストレージなどはとりあえず標準構成(メモリ15GB, ストレージ8GB)

セットアップ

まずはSSHでログインする

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]

エフェメラルストレージを作業ディレクトリにするためシンボリックリンクを作成する

CUDAとかけっこうでかいので作業の途中で空き容量が足りなくなる。/mnt/tmp/へのシンボリックリンクを作成してエフェメラルストレージを作業領域に使う。

sudo mkdir /mnt/tmp
sudo chmod 777 /mnt/tmp
sudo rm -rf /tmp
sudo ln -s /mnt/tmp /tmp
cd /tmp

Ubuntuを最新にアップグレードする

sudo apt-get update
sudo apt-get upgrade -y

ロケールを設定する

upgrade後ロケール関係のwarningが出てうざいので

sudo apt-get install language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8

セットアップに必要なモジュールをインストールする

sudo apt-get install python
sudo apt-get install -y build-essential python-pip python-dev git python-numpy swig python-dev default-jdk zip zlib1g-dev ipython

NVIDIAドライバとの衝突をさけるため、Nouveauのブラックリストを追加する

echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo update-initramfs -u
sudo reboot

再起動後、ログインしてlinux-image-extra-virtualをインストールする。

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]
sudo apt-get install -y linux-image-extra-virtual
sudo reboot

再起動後、ログインしてlinux-headersをインストールする。

ssh -i ~/[ec2key].pem ubuntu@[Instance IP]
sudo apt-get install -y linux-source linux-headers-`uname -r`

CUDA Toolkit v8 をセットアップする

現時点での最新バージョンは 8.0。
ダウンロードしてインストールする

cd /tmp
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
chmod +x cuda_8.0.44_linux-run
./cuda_8.0.44_linux-run  -extract=`pwd`/nvidia_installers
cd nvidia_installers/
sudo ./NVIDIA-Linux-x86_64-367.48.run
# Acceptを選択する。kernelセットアップはプログレスバーが100%になってからしばらく時間がかかる
# OK を選択する
# OK を選択する
# Yes を選択する
# OK を選択する
sudo modprobe nvidia
sudo ./cuda-linux64-rel-8.0.44-21122537.run
# Readmeが表示されるので q で終了する
# accept と入力してエンター
# install Path: default
# shortcut?: default

cuDNN をセットアップ

https://developer.nvidia.com/cudnn からcuDNNを一度ローカルにDownloadする
cuDNNはDeveloperサインアップしないと落とせないため。仕方がない。

ローカルのターミナルからダウンロードしたcuDNNをEC2インスタンスに転送する

scp -i [ec2key].pem cudnn-8.0-linux-x64-v5.1.tgz ubuntu@[Instance IP]:/tmp

EC2インスタンスにもどる

cd /tmp
tar -xzf cudnn-8.0-linux-x64-v5.1.tgz
sudo mv ./cuda/lib64/* /usr/local/cuda/lib64/
sudo mv ./cuda/include/* /usr/local/cuda/include/

~/.bashrcに以下を追記する

# cuDNN
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
source ~/.bashrc

Python 仮想環境の構築

python -V
Python 2.7.12
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

~/.bash_profileを作成して以下を記載する

# pyenv
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
# virtualenv
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
source ~/.bash_profile

Keras用仮想環境をつくる

pyenv install 3.5.3
pyenv virtualenv 3.5.3 keras
pyenv activate keras
python -V
Python 3.5.3

Tensorflowをインストールする

pip install tensorflow-gpu

TensorFlowのバージョンを確認してみて以下のようになってたらGPUが使えるようになっている。

python -c 'import tensorflow as tf; print(tf.__version__)'
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
1.0.0

Kerasをインストールする

pip install pillow
pip install h5py
pip install matplotlib
pip install keras

keras examplesを実行してみる

cd /tmp
git clone https://github.com/fchollet/keras.git
cd keras/examples

とりあえずMNISTをCNNで解くやつを実行してみる

python mnist_cnn.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.pkl.gz
X_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
60000/60000 [==============================] - 13s - loss: 0.3770 - acc: 0.8839 - val_loss: 0.0932 - val_acc: 0.9709
Epoch 2/12
60000/60000 [==============================] - 11s - loss: 0.1363 - acc: 0.9603 - val_loss: 0.0632 - val_acc: 0.9801
Epoch 3/12
60000/60000 [==============================] - 11s - loss: 0.1064 - acc: 0.9687 - val_loss: 0.0509 - val_acc: 0.9835
Epoch 4/12
60000/60000 [==============================] - 11s - loss: 0.0900 - acc: 0.9736 - val_loss: 0.0443 - val_acc: 0.9857
Epoch 5/12
60000/60000 [==============================] - 11s - loss: 0.0769 - acc: 0.9775 - val_loss: 0.0405 - val_acc: 0.9865
Epoch 6/12
60000/60000 [==============================] - 11s - loss: 0.0689 - acc: 0.9795 - val_loss: 0.0371 - val_acc: 0.9870
Epoch 7/12
60000/60000 [==============================] - 11s - loss: 0.0649 - acc: 0.9803 - val_loss: 0.0361 - val_acc: 0.9881
Epoch 8/12
60000/60000 [==============================] - 11s - loss: 0.0594 - acc: 0.9823 - val_loss: 0.0356 - val_acc: 0.9886
Epoch 9/12
60000/60000 [==============================] - 11s - loss: 0.0547 - acc: 0.9841 - val_loss: 0.0321 - val_acc: 0.9889
Epoch 10/12
60000/60000 [==============================] - 11s - loss: 0.0525 - acc: 0.9841 - val_loss: 0.0320 - val_acc: 0.9889
Epoch 11/12
60000/60000 [==============================] - 11s - loss: 0.0506 - acc: 0.9850 - val_loss: 0.0323 - val_acc: 0.9892
Epoch 12/12
60000/60000 [==============================] - 11s - loss: 0.0471 - acc: 0.9856 - val_loss: 0.0314 - val_acc: 0.9897
Test score: 0.0314083654978
Test accuracy: 0.9897

実行時間は: 2:23 (データのダウンロード時間除く)。手持ちのMBAでは35分ほどかかったので10倍以上速い。
1epochあたり10秒くらいかよ。

調子に乗ってIMDBのLSTMという重たそうなやつもやってみた。

python imdb_cnn_lstm.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Loading data...
25000 train sequences
25000 test sequences
Pad sequences (samples x time)
X_train shape: (25000, 100)
X_test shape: (25000, 100)
Build model...
Train...
Train on 25000 samples, validate on 25000 samples
Epoch 1/2
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
   30/25000 [..............................] - ETA: 1397s - loss: 0.6936 - acc: 0.4333I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 3811 get requests, put_count=2890 evicted_count=1000 eviction_rate=0.346021 and unsatisfied allocation rate=0.530307
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 100 to 110
  360/25000 [..............................] - ETA: 160s - loss: 0.6935 - acc: 0.4833I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 2156 get requests, put_count=2374 evicted_count=1000 eviction_rate=0.42123 and unsatisfied allocation rate=0.373377
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 256 to 281
  870/25000 [>.............................] - ETA: 94s - loss: 0.6925 - acc: 0.5287I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 4249 get requests, put_count=4491 evicted_count=1000 eviction_rate=0.222668 and unsatisfied allocation rate=0.192281
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 655 to 720
25000/25000 [==============================] - 63s - loss: 0.3815 - acc: 0.8210 - val_loss: 0.3519 - val_acc: 0.8456
Epoch 2/2
25000/25000 [==============================] - 60s - loss: 0.1970 - acc: 0.9238 - val_loss: 0.3471 - val_acc: 0.8534
24990/25000 [============================>.] - ETA: 0sTest score: 0.347144101623
Test accuracy: 0.853440059948

実行時間: 2:25 (データのダウンロード時間除く)。MBAでこれも40分以上かかったやつなので圧倒的。

さらに調子に乗ってもっと重たそうなやつをやってみる。mnist_acgan.pyはMNISTをACGAN(Auxiliary Classifier Generative Adversarial Network)というやつで解くみたい。DCGANの親戚か?詳しくはここに載ってるみたいだけど難しいので後回しにする。
とりあえずGANなので重いだろう。どんなもんだろうか。

python mnist_acgan.py
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Epoch 1 of 50
  0/600 [..............................] - ETA: 0sI tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 3.94GiB
Free memory: 3.91GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
W tensorflow/core/common_runtime/bfc_allocator.cc:217] Ran out of memory trying to allocate 3.74GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
599/600 [============================>.] - ETA: 1s   
Testing for epoch 1:
component              | loss | generation_loss | auxiliary_loss
-----------------------------------------------------------------
generator (train)      | 3.88 | 1.49            | 2.39 
generator (test)       | 3.36 | 1.04            | 2.32 
discriminator (train)  | 2.11 | 0.53            | 1.58 
discriminator (test)   | 2.12 | 0.70            | 1.43 
Epoch 2 of 50
 44/600 [=>............................] - ETA: 732s

1epoch終わるのに 15分ほどかかった。あと48epochある。。果てしないしお金かかるので途中でやめた。まあでも半日回せば結果出そう。すごいな。

作業後のディスク空き状況

df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             7679880       0   7679880   0% /dev
tmpfs            1539900    8800   1531100   1% /run
/dev/xvda1       8117828 6149060   1533492  81% /
tmpfs            7699496       0   7699496   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs            7699496       0   7699496   0% /sys/fs/cgroup
/dev/xvdb       66946696 3017852  60521484   5% /mnt
tmpfs            1539904       0   1539904   0% /run/user/1000

システムディスクの使用量は81%。エフェメラルストレージはインスタンスがstopすると揮発するのでデフォルトの8GBが不安ならストレージ要領を拡張しとくとよい。

AMIにしてからg2.xlargeインスタンスを作成してみたらエラーになる

構築できたインスタンスのスナップショットをとって、AMIからg2.xlargeインスタンスを作成してみた。ちゃんと動くか試行。

pyenv activate keras
python -V
 Python 3.5.3
python -c 'import tensorflow as tf; print(tf.__version__)'
Traceback (most recent call last):
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 61, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/__init__.py", line 24, in <module>
    from tensorflow.python import *
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 72, in <module>
    raise ImportError(msg)
ImportError: Traceback (most recent call last):
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/__init__.py", line 61, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/ubuntu/.pyenv/versions/keras/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/ubuntu/.pyenv/versions/3.5.3/lib/python3.5/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory


Failed to load the native TensorFlow runtime.

See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md#import_error

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

TensorFlowがエラーを吐く。よくわからないけどCUDA関係か?
AMI化ができるかどうかはあとで検討が必要かも。断続的に使う場合はインスタンスをstopして置いとくのがいいかもしれない。

まとめ

上記Kerasの環境構築までは一時間以内でできる。インスタンスstopして置いとくのもいいけど、使いたい時にサラから構築してもそんなに手間ではない。
使用頻度とかケースに応じて考えるのがいいだろう。つーかTensorFlow GPUの環境構築以前と比べてめっちゃ楽になったな。

続きを読む

[AWS] EC2+RDS開発環境設定 Apache2.2+PHP+MySQL+WordPress+phpMyAdmin

インフラ初心者がAWSに以下の環境を構築するまでの流れを実施したので、備忘録として残しておこうと思います。

(0)AWSの設定
(1)Apache2.2+PHP7+MySQL5.6+WordPress4.7+phpMyAdmin4.6 ← 本エントリの内容
(2)Nginx+Unicorn+RubyOnRails(詳細は後ほどUP予定)

実施事項
◎EC2の設定
◎RDSの設定
◎WordPressの設定
◎phpMyAdminの設定

【ご一読いただくにあたって】
・EC2、RDS等々の設定は済ませておいて下さい。
 まだの方はこちらから → AWSの設定
・間違いがありましたらコメントにて教えて下さい。(まだまだ勉強中です。)
・専門用語の深い解説はしておりません。

EC2の設定

アップデート、ユーザ追加等の下準備

sshでEC2へアクセスした状態


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
3 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-107 ~]$ sudo yum update

~アップデート~

総ダウンロード容量: 51 M
Is this ok [y/d/N]: y
(途中、確認されますが[y]を入力)

完了しました!
[ec2-user@ip-10-0-1-107 ~]$ sudo su - #スーパーユーザへ切替
[root@ip-10-0-1-107 ~]# useradd myname #ユーザ追加
[root@ip-10-0-1-107 ~]# passwd myname #ユーザパスワード設定
Changing password for user myname.
New password: (パスワード入力)
Retype new password: (再入力)
passwd: all authentication tokens updated successfully. #成功
[root@ip-10-0-1-107 ~]# sudo visudo #追加したユーザに権限付与

=ファイル編集画面=

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
myname  ALL=(ALL)       ALL  (←rootの下に追加)

===============

[root@ip-10-0-1-107 ~]# exit #スーパーユーザ ログアウト
logout
[ec2-user@ip-10-0-1-107 ~]$ su - myname #追加したユーザに切替
パスワード:
[myname@ip-10-0-1-107 ~]$

Apache2.2 インストール

[myname@ip-10-0-1-107 ~]$ sudo yum -y install httpd
[sudo] password for myname: (パスワード入力) 

~インストール~

Complete!
[myname@ip-10-0-1-107 ~]$ httpd -version #バージョン確認
Server version: Apache/2.2.31 (Unix)
[myname@ip-10-0-1-107 ~]$ sudo /sbin/chkconfig httpd on #自動起動をonに変更
[myname@ip-10-0-1-107 ~]$ sudo service httpd start #Apache起動
Starting httpd: httpd: apr_sockaddr_info_get() failed for ip-10-0-1-107
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
#サーバーは起動しているもエラーが表示

[myname@ip-10-0-1-107 ~]$ sudo service httpd stop #Apache停止

エラーをググってみると設定ファイルの修正が必要とのこと。
Apacheエラーの原因と解決方法
Apacheのエラー

networkファイルの修正

[myname@ip-10-0-1-107 ~]$ sudo vi /etc/sysconfig/network
===
HOSTNAME=localhost.localdomain
        ⬇︎
#HOSTNAME=localhost.localdomain
HOSTNAME=13.112.XXX.XXX ← (EC2のパブリックIP)追加
===

hostsファイルの修正

[myname@ip-10-0-1-107 ~]$ sudo vi /etc/hosts
===
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
           ⬇︎
127.0.0.1   13.112.XXX.XXX localhost localhost.localdomain localhost4 localhost4.localdomain4 ← (EC2のパブリックIP)追加
===

httpd.confファイルの修正

[myname@ip-10-0-1-107 ~]$ sudo vi /etc/httpd/conf/httpd.conf
===
#ServerName www.example.com:80
ServerName 13.112.XXX.XXX ← (EC2のパブリックIP)追加
===

再度起動

[myname@ip-10-0-1-107 ~]$ sudo service httpd start
Starting httpd:                                            [  OK  ]

http://13.112.XXX.XXXにアクセス

スクリーンショット 2017-02-10 20.29.48.png

OK!!

PHP7 インストール

標準リポジトリで利用できないパッケージのインストールを可能にするEPELリポジトリを有効化

[myname@ip-10-0-1-107 ~]$ sudo vi /etc/yum.repos.d/epel.repo #epel.repoの編集

=ファイルの中=

enabled=0
   ⬇︎
enabled=1 に変更

=ファイルの中終わり=

[myname@ip-10-0-1-107 ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm #Remiレポジトリのインストール
[myname@ip-10-0-1-107 ~]$ sudo yum -y install libwebp --disablerepo=amzn-main --enablerepo=epel #libwebpのインストール
[myname@ip-10-0-1-107 ~]$ sudo yum -y install libmcrypt libtool-ltdl libtidy libXpm libtiff gd-last autoconf automake #amzn-main.repoから各ライブラリをインストール
[myname@ip-10-0-1-107 ~]$ sudo yum -y install --disablerepo=amzn-main --enablerepo=remi-php70 php php-opcache php-devel php-mbstring php-mcrypt php-phpseclib-crypt-blowfish php-pecl-apc php-gd php-mysqlnd php-xml #phpインストール

Complete!
[myname@ip-10-0-1-107 ~]$ php -v #バージョン確認
PHP 7.0.15 (cli) (built: Jan 17 2017 17:20:32) ( NTS )
Copyright (c) 1997-2017 The PHP Group

AWSナレッジセンター
yum が便利になる RPMforge、Remi、EPEL とは一体何なのか
【yum入門】epel, remiなどのレポジトリをyumに追加する方法
libwebp の概要
Amazon LinuxでYUMを使う時に気をつけるポイント
php-opcache
php-devel
この辺はまだまだ勉強中です。

WordPress4.7.2インストール

Apacheのドキュメント・ルートのディレクトリは”/var/www/html”とのこと。
今回はhttp://13.112.XXX.XXX/wordpressでアクセスした時にWordPressのトップ画面が表示されるように設定
(wordpressディレクトリはWP展開時に自動生成)

[myname@ip-10-0-1-107 ~]$ cd /var/www/html #htmlへ移動
[myname@ip-10-0-1-107 html]$ sudo wget http://ja.wordpress.org/latest-ja.tar.gz ~/ #最新のWordPressをダウンロード (20170210時点では、4.7.2)
[myname@ip-10-0-1-107 html]$ sudo tar zxvf latest-ja.tar.gz

~インストール~
(wordpressディレクト生成)

[myname@ip-10-0-1-107 html]sudo chown -R apache:apache wordpress #オーナー変更

http://13.112.XXX.XXX/wordpress
にアクセスすると
http://13.112.XXX.XXX/wordpress/wp-admin/setup-config.php
にリダイレクトされる

wp1.png

wp2.png

項目
データベース名 db_qiita
ユーザー名 db_qiita_user
パスワード ********
ホスト名 db-id-for-qiita.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com(RDSエンドポイント)

※RDSインスタンス生成時に設定した値を入力

wp3.png

[インストール実行]

wp4.png

項目
サイトのタイトル wp_site_qiita(任意)
ユーザー名 wp_qiita_user(任意)
パスワード ********
メールアドレス your_mail@address.com(任意)

wp5.png

インストール成功 → ログイン画面

wp6.png

ダッシュボード画面

wp7.png

サイトトップ画面(WordPress4.7.2の場合)

phpMyAdminのインストール

今回はhttp://13.112.XXX.XXX/phpMyAdminでアクセスした時にphpMyAdminのトップ画面が表示されるように設定

[myname@ip-10-0-1-107 html]$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.tar.gz #phpMyAdminをダウンロード
[myname@ip-10-0-1-107 html]$ sudo tar xzvf phpMyAdmin-4.6.6-all-languages.tar.gz #展開
[myname@ip-10-0-1-107 html]$ sudo mv phpMyAdmin-4.6.6-all-languages phpMyAdmin #リネーム
[myname@ip-10-0-1-107 html]$ cd phpMyAdmin #移動
[myname@ip-10-0-1-107 phpMyAdmin]$ cp config.sample.inc.php config.inc.php #設定ファイルをコピー
[myname@ip-10-0-1-107 phpMyAdmin]$ sudo vi config.inc.php #設定を編集

=ファイルの中=
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
                   ⬇︎
$cfg['Servers'][$i]['host'] = 'db-id-for-qiita.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com';
============

http://13.112.XXX.XXX/phpMyAdmin へアクセス

スクリーンショット 2017-02-13 11.05.55.png

項目
ユーザー名 db_qiita_user
パスワード xxxxxxxxx

※RDSインスタンス生成時に設定したユーザ名とパスワード
pma1.png

ログイン成功!

以上です。

後ほど別のEC2にNginx+Unicorn+RubyOnRailsの開発環境を設定予定です。

参考にさせていただきました。
【AWS】WordPressのインストールとRDS、S3の連携
EC2にphpMyAdminを設置しRDSに接続する

続きを読む

IPsecの基礎知識を身につけつつ、AWSのVPN接続設定を読む

概要

  1. IPv4におけるIPsecについて調べる
  2. AWSのVPNサービスで提供されているルータの設定テンプレートを読み解く

IPsecについて

概要

  • Security Architecture for the Internet Protocol

    • IPsecとは特定のプロトコルを指すものではない。いくつかの要素をもとに成り立つ、IPのセキュリティ設計。

      • AH, ESP, IKE, SA(それぞれ後述)
  • IP通信を透過的にセキュア化する
    • アプリケーションプロトコル(HTTPなど)を変更することなしに利用できる
    • cf. SSL/TLS
  • IPsecは「トンネリング」と「暗号化」の機能をもつため、VPNで利用される

RFC

  • RFCを読むなら、まずこれに目を通したほうがいい. IPsec関連のRFCの見通しをよくするための”Road Map”

バージョン

  • IPsec-v1, IPsec-v2, IPsec-v3がある
  • 現在使われているのは. IPsec-v2とIPsec-v3
  • ただし、これらのバージョンはIETF的には非公式とのこと。(wikipediaより)

IPsecの2つのモード

トランスポートモード

  • ホスト間で使用される
  • パケットのIPヘッダは変更しない
  • 既存のIPヘッダの後ろにAH/ESPヘッダを挿入する

トンネルモード

  • ルータ間(セキュリティゲート間)で使用される
  • AWSのVPN接続はこちらのモード
  • もとのパケットに新たにIPヘッダを付加してパケットを転送する
  • ホスト(PC)はIPsecを意識しない

構成する要素

AH(Authentication Header)

  • 認証機能

ESP(Encapsulated Security Payload)

  • ペイロード部の暗号化
  • 改ざん防止のAHか機密性保護のESPかを選択する。現在広く使われているのはESPらしい。
  • VPNでは暗号化が必須なのでESPを使う

IKE(Internet Key Exchange)

  • 鍵交換
  • 動的なSAの構築で利用される
    • 詳細は『3分間ネットワーク』へ

    • SAの構築のために、セキュアにパラメータを交換するためのSAを別に構築する。(ISKAMP SA)
      • IKEフェーズ1でISKAMP SAを構築し、IKEフェーズ2でSA(IPsec SA)を構築する

SA(Security Association)

それぞれの関連

AWSのVPN設定用テンプレート

  • AWSのマネジメントコンソールにおけるVPCサービスの画面より「VPN接続」を設定すると、自分の環境に合わせた機器(ルータのOS)の設定テンプレートがダウンロードできる。

    • 基本的にはそのままコピペすれば設定が完了するくらい出来上がったもの
  • そのうち、vyatta用のテンプレートをダウンロードし、一つ一つの設定を見ていく。
    • もともとあったコメントは大きく削除し、解説用のコメント私のほうで追加した

      • NW詳しくないので、ある程度疑いの目で見て欲しい
    • 一部の情報(主に環境に依存しているIPアドレス)はマスクした
! --------------------------------------------------------------------------------
! IPSec Tunnel #1 (トンネル1と2を設定する必要がある)
! --------------------------------------------------------------------------------

! #1: Internet Key Exchange (IKE) Configuration
! もともとのコメント文にも書いてあったが、「AES128, SHA1, and DH Group 2」の最小限の要求を満たす設定のため、適宜修正すること。そしてNATトラバーサルを利用するには、UDP PORT 4500を開放しておくこと。

! IKEフェーズ1で作成されたキーの持続期間を28800sec(8時間)にする. これを超えるとIKE フェーズ1のネゴシエーションが発生する
! "AWS"はグループ化された設定の識別名
set vpn ipsec ike-group AWS lifetime '28800'

! フェーズ1のネゴシエーション時に使用する、Diffie-Hellman交換のパラメータ。DHグループ2を指定している
! "proposal 1"は、IPsecの接続を開始するイニシエータにおいて、IKEフェーズ1で使用するパラメータのうち最も優先度の高い「提案」
set vpn ipsec ike-group AWS proposal 1 dh-group '2'

! AES128の暗号方式を使用する(AWSというIKE設定グループのプロポーザル1において)
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
! 説明は省略
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'

! 対向のVPNゲートウェイの認証方式にpre-shared-secret(事前共有秘密)を使用する。
! "xxx.xxx.xxx.xxx"は対向のVPNゲートウェイのアドレス
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx authentication mode 'pre-shared-secret'

! pre-shared-secretの内容(マスクしている)
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx authentication pre-shared-secret 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

! 対向のVPNゲートウェイの説明文
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx description 'VPC tunnel 1'

! 対向のVPNゲートウェイと'AWS'IKE設定グループをひもづける
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx ike-group 'AWS'

! 対向のVPNゲートウェイに送られるパケットの送信元IPアドレス(yyy.yyy.yyy.yyy) を指定する
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx local-address 'yyy.yyy.yyy.yyy'

! IPsecのVPNトンネルを仮想トンネルインタフェースにバインドする
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx vti bind 'vti0'

! IPsecのVPNトンネルに設定するESP設定グループを指定する
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx vti esp-group 'AWS'


! #2: IPSec Configuration
! eth0でIPsec VPNを有効にする
set vpn ipsec ipsec-interfaces interface 'eth0'

! 説明は省略
set vpn ipsec esp-group AWS compression 'disable'

! 3600sec(1時間)を超えるとIKEフェーズ2のネゴシエーションが行われる
set vpn ipsec esp-group AWS lifetime '3600'

! (トランスポートモードではなく、)IPsecのトンネルモードを使用する
set vpn ipsec esp-group AWS mode 'tunnel'

! PFS(Perfect Forward Secrecy)というものがあるらしい
set vpn ipsec esp-group AWS pfs 'enable'

! 説明は省略
set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
! 説明は省略
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'

! VPNトンネルが到達不能になったときに、VPNトンネルをリスタートする
set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
! IKEキープアライブの送信間隔(sec)
set vpn ipsec ike-group AWS dead-peer-detection interval '15'
! 対向ゲートウェイが応答しない場合に、actionが実行される期間(sec)
set vpn ipsec ike-group AWS dead-peer-detection timeout '30'


! #3: Tunnel Interface Configuration
! vtiインタフェース(vti0)の設定。IPアドレス、説明文、MTU
set interfaces vti vti0 address 'zzz.zzz.zzz.zzz/zz'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1436'

! #4: Border Gateway Protocol (BGP) Configuration
! AS番号65000(自分のAS)に、BGPネイバー(nnn.nnn.nnn.nnn)のAS番号10124を指定
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn remote-as '10124'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn timers holdtime '30'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn timers keepalive '10'

! アドバタイズするネットワーク。AWSのテンプレートのデフォルトは下記の通りだが、自身が所属するNWを指定するほうがよいと思われる
set protocols bgp 65000 network 0.0.0.0/0


! --------------------------------------------------------------------------------
! IPSec Tunnel #2
! --------------------------------------------------------------------------------
! ここからTunnel2の設定になるが、内容はTunnel1とほとんど変わらないので割愛する。

参考にしたサイト

続きを読む

異なるリージョン同士をVPNつなごうとしたけど、できなかった話

追記

構成と設定を見直したところ、疎通できました。

近日中に記事にします。


概要

異なるリージョン(東京とソウル)をVPNで接続したかったが、失敗した。(理由もわかっていない)

詳しい方、分かる方、いらっしゃったらぜひ教えてください。

構成図

WG4PUQ8PwpjtRAPT-8B8DF.png

やりたかったこと(ゴール)

  • 東京リージョンのEC2インスタンス(10.0.0.128/28)からソウルリージョンのEC2インスタンス(10.0.1.192/28)にPINGが通る

結果(失敗)

  • 東京リージョンEC2インスタンスを”t1″、ソウルリージョンEC2インスタンスを”s1″とすると、疎通確認の結果は以下の通り

    • t1 -> vyos : PING疎通成功
    • vyos -> s1 : PING疎通成功
    • t1 -> s1 : PING疎通失敗
      • s1のパケットキャプチャの結果より、パケットがs1に届いていない
    • vyos -> t1 : PING疎通失敗
      • t1のパケットキャプチャの結果より、パケットは届いているが、応答(t1->vyos)がvyosに届いていない
  • 問題は2点?

    • vyosがルーティングをしていない
    • t1 -> vyos(vyos -> t1の戻りの経路)で何かが起こっている
      • t1上のパケットキャプチャの結果では、PINGの応答は、”10.0.0.xxx(t1のローカルIPアドレス) -> 169.xxx.xxx.xxx”となっていた。(マスクしているのは忘れたから)

構成を簡単に説明

  • 東京リージョンとソウルリージョンそれぞれにVPCを作成
  • 仮想プライベートゲートウェイは東京リージョンに置き、カスタマーゲートウェイはソウルリージョンに置く。カスタマーゲートウェイは、EC2でたてたvyosにする

参考にしたサイト

上記のサイトは、自分がやりたかったことをほぼ同じ構成で実現している。細かい部分で違いはあるが(ネットワークアドレスが違う、デフォルトのVPCを使用している、vyosのバージョンが違うなど)、それが原因とは思いづらい…。

やったこと

実際に作業した順番で書いていく(順番の記憶違いはあるかも)
BGPのAS番号はすべての箇所で65000にしています。(どこで設定しているか忘れたのでここに書いた)

東京リージョン

  • VPCを作成
  • 上記VPC内にサブネットを作成。構成図の通り2つのサブネットを作成し、アベイラビリティゾーンは分けている。
  • インターネットゲートウェイを作成し、VPCにアタッチ
  • 仮想プライベートゲートウェイを作成し、VPCにアタッチ
  • ルートテーブルを設定
    • サブネットを関連付ける
    • ルートを設定
      • 送信先:0.0.0.0/0、ターゲット:インターネットゲートウェイ
      • 送信先:10.0.1.0/24、ターゲット:仮想プライベートゲートウェイ(もしかしたら設定していないかも。vyosからアドバタイズされたものが載っていたかも)
  • 作成したVPC内に疎通確認用のEC2インスタンスを1台たてる(Amazon Linux)
    • セキュリティグループはすべてのトラフィックを許可

ソウルリージョン

  • VPCを作成
  • 上記VPC内にサブネットを作成。構成図の通り2つのサブネットを作成し、アベイラビリティゾーンは分ける。
  • インターネットゲートウェイを作成し、VPCにアタッチ
  • ルートテーブルを設定
    • サブネットを関連付ける
    • ルートを設定
      • 送信先:0.0.0.0/0、ターゲット:インターネットゲートウェイ
  • 作成したVPC内にEC2インスタンスを2つ作成。1つはvyos用、もう1つはPing疎通確認用。サブネットはそれぞれ別のものを指定する。(つまりアベイラビリティゾーンも別)
  • vyosの構築内容
    • AMIは、コミュニティAMIから”VyOS(HVM)1.1.7″を選択
    • EIPを付与
    • セキュリティグループはすべてのトラフィックを許可
    • 「送信元と宛先のチェック」は無効に設定
  • Ping疎通確認用インスタンスの構築内容
    • AMIは、Amazon Linuxを選択.
    • セキュリティグループはすべてのトラフィックを許可

東京リージョン

  • ソウルリージョンで付与したEIPのグローバルIPアドレスをもとに、カスタマーゲートウェイを作成
  • このカスタマーゲートウェイと先ほど作成した仮想プライベートゲートウェイから、「VPC接続」を作成、ルーティングは動的
  • vyatta用のコンフィグをダウンロード

ソウルリージョン

  • ダウンロードしたコンフィグをもとにvyosを設定

    • 変更した箇所は下記の2点.(クラスメソッドさんの記事を丸パクリ。http://dev.classmethod.jp/event/soracom-door/)
    • “10.0.1.0/24″の箇所は、試行錯誤の中で”10.0.1.128/28″、”0.0.0.0/0″も試したが、すべて疎通は上手く行かなかった
(変更前)
set vpn ipsec site-to-site peer ***** local-address [VyOSのEIP]
set protocols bgp 65000 network 0.0.0.0/0

(変更後)
set vpn ipsec site-to-site peer ***** local-address [VyOSのプライベートIP]
set protocols bgp 65000 network 10.0.1.0/24
  • ルートの設定で、10.0.0.0/24 宛のターゲットは、vyosに付与したEIPを指定

確認作業

  • マネジメントコンソールのVPC設定画面(東京リージョン)で、「VPN接続」の1つのトンネルがUPしていることを確認
  • 東京リージョンのVPCのルーティングの設定で、ソウルリージョン宛は仮想プライベートゲートウェイになっていることを確認
  • ソウルリージョンのVPCのルーティングの設定で、東京リージョン宛はvyosのEIPになっていることを確認

失敗した原因究明として、他に試せそうなこと

  • リージョンを変える。東京<->シンガポールとか
  • vyosのバージョンを変える
    • 昔、特定のバージョンのvyattaにて、今回と同様の構成でルーティングに失敗する不具合があったらしい
    • ソウルリージョンには1.1.7のバージョンしかなかったので、リージョンごと変える必要がある
  • 片方のリージョンで172.x.x.xのデフォルトのVPCを使ってみる
  • アベイラビリティゾーンをなるべく分けずにやってみる
  • ルーティングやNWの構成を見直す?

最後に…

  • VPNやIPsec、VPCを学んで、出直してきます。

続きを読む