Amazon Web Services ブログ

AWS Cloud9、AWS CodeCommit、Troposphereを使ったCloudFormationテンプレートの作成

AWS Cloud9 は 2017年11月の AWS re:Invent で発表されました。Cloud9 はブラウザベースの IDE で、サーバレスアプリケーションも含め、数多くのクラウド上の開発ユースケースに適しています。AWS CloudFormation を使うことで AWS CodeCommit と連携した AWS Cloud9 の開発環境を迅速に構築することができます。このブログでは、CloudFormation を使った Cloud9 環境の構築手順を説明します。さらに Cloud9 の環境で Python と Boto3 のコードを書き、 Troposphere を使って CloudFormation の YAML テンプレートを生成する方法についても説明します。

注: 現時点で AWS Cloud9 は次のリージョンで利用可能です: 北バージニア、オハイオ、オレゴン、アイルランド、シンガポール

CloudFormation を使って AWS Cloud9 環境を ち上げる

AWS::Cloud9::EnvironmentEC2 リソースタイプを使用して、Cloud9 開発環境を作成できます。Cloud9 はハンズオンやワークショップの環境をセットアップする際に便利です。Cloud9 は各々の開発環境ごとに EC2 インスタンスが用意され、コマンドラインを使用して追加の開発ツールをセットアップすることができます。モダンな IDE がローカルマシンのターミナルと統合されているのと同様です。この仕組みを使うと各利用者専用の CodeCommit リポジトリをセットアップすることもできます。したがって、CloudFormation で Cloud9 環境を構築するとき、同時に Git 互換のリポジトリを作り、Cloud9 のインスタンスと統合するといったことが可能になります。

CloudFormation を使った Cloud9 環境と CodeCommit リポジトリのセットアップがいかにシンプルなのか、以下に示すテンプレートを見ていただくとわかります。スタックを作成する前に2つの前提条件を満たしていることを確認してください。

  • スタックを作成する IAM ユーザには AWSCodeCommitPowerUser または AWSCodeCommitFullAccess のポリシーを割り当てておく必要があります。
  • EC2 をデプロイする適切なサブネットが必要です。私はすでに VPC がデプロイされたアカウントを使用しました。(より詳しくは Getting Started with Amazon VPC をご覧ください。新しく作った CodeCommit リポジトリとインスタンスを紐付けるため、GettAtt 内部関数を使用しています。

このテンプレートのデプロイが完了すると Cloud9 用の EC2 を含むスタックも作成されます。このスタックを削除するにはAWS::Cloud9::EnvironmentEC2リソースを削除します。今回はこの追加のスタックについては特に気にすることはありません。スタックのデプロイが完了したら、Cloud9 環境と CodeCommit リポジトリが作成されていることをマネジメントコンソールで確認してください。

AWSTemplateFormatVersion: "2010-09-09"
Description: A CodeCommit Repo and Cloud9 Environment for Basic Development
Resources:
  MyRepo:
    Type: "AWS::CodeCommit::Repository"
    Properties:
      RepositoryName: MyRepo
      RepositoryDescription: Sample Repo for Cloud9 CFN Post
  MyC9Environment:
    Type: "AWS::Cloud9::EnvironmentEC2"
    Properties:
      Repositories:
        - PathComponent: /cfn
          RepositoryUrl: !GetAtt MyRepo.CloneUrlHttp
      InstanceType: t2.micro
      SubnetId: subnet-be8735d6
      AutomaticStopTimeMinutes: 45

図 1. Cloud9 環境と CodeCommit リポジトリを作る CloudFormation テンプレート

AWS Cloud9 環境について

AWS Cloud9 は高機能なブラウザベースの IDE です。Cloud9 環境は、MacOS や Linux、Windows といった一般的な OS だけでなく、Chromebook やタブレットからも利用できます。このモダンな IDE は複数のコーディング用ペインのほか、コマンドラインペインを持ち、エディタとコマンドラインを相互に切り替えられます。図2は iPad Pro を使ってコーディングしている様子です。キーボードの設定を変更することでエディタもコマンドラインも両方を見ることができます。大文字固定、単語のサジェスト、自動句読点入力を停止することでより使いやすくなります。さらに iPad ベースのコーディングを行うなら、よりプログラムに向いたキーボードを、例えば SmoothMobile の DevKey などを使うのも一案です。

図2. Cloud9 を iPad から使う

ファイル編集の基本

Cloud9 を起動すると、バックエンドの EC2 インスタンスにはすでに AWS CLI や他の便利なユーティリティ(Python version 2 及び 3 、Node 6 など)がセットアップ済みです。加えて AWS CLI には必要な AWS 認証情報も設定済みです。さらに今回のテンプレートでは、同時に作成したリポジトリを Cloud9 環境へ自動的に複製 (clone) することまで行っています。作ったばかりのリポジトリなので、ファイルはまだありません。

これまで Cloud9 や CodeCommit を使ったことがなければ、今回がいい機会です。簡単なファイルを作り、リポジトリへ登録してみましょう。ここではデフォルトの Markdown テキストファイルを作り、リポジトリへ登録します。CodeCommitでリポジトリにアクセスすると、自動的にREADME.mdファイルの内容が表示されます。この動きは GitHub にホストされた Git リポジトリと同じ動作です。

Cloud9 環境に最初にアクセスすると、新しく作成したリポジトリを複製 (clone) したディレクトリが表示されます(まだ中身は空です)。画面下部の bash コマンドラインペインではコードを commit する際に必要となる、表示名とメールアドレスを設定するため以下のコマンドを実行するよう促しています。

git config --global user.name “YOUR_USER_NAME”
git config --global user.email YOUR_EMAIL_ADDRESS

これらのコマンドをまず実行しましょう。

さて、図3に示すようにサンプルプロジェクトに必要最小限のmarkdownファイルを作ります。
まず、Cloud9コンソールで先ほど作った環境を見つけ、開きます。次に 事前パッケージ済みテンプレートを展開す るため、Fileメニュー→New From Template→Markdownの順に選択します。注:この図ではデフォルトカラーの変更を行い、コマンドラインペインでは Git の設定とプリインストール済みの aws コマンドのバージョンチェックを行なっています。markdownファイルを作成した後、上部メニューの Preview ボタンを押すことで、別ペインで markdown のプレビューを見ることができます。いくつかの行を追加して、リポジトリフォルダ内にREADME.mdという名前でファイルを保存してください。(この例では ~/environment/cfn)です。


図3. Cloud9でmarkdownファイルを編集、プレビュー、バージョン確認

さて、リポジトリフォルダに新しいファイルが作られました。リモートのCodeCommitリポジトリにcommitします。コマンドラインでディレクトリをローカルのリポジトリフォルダに移動し、以下のようにコマンドを入力します。

git status 新しいファイルがあることを確認します
git add –-all 新しいファイルを次のcommit対象に追加します
git commit -m “message” コミットメッセージを追加しcommitします
git push -u origin master コミットされたファイルをリモートリポジトリへ送ります

コミットがうまくいったことを確認するため、CodeCommitのマネジメントコンソールにアクセスし、先ほど作ったMyRepoリポジトリの内容を確認します。先ほど作成したREADME.mdファイルが登録されており、GitHub のように自動的にレンダリングされるはずです。

PythonとAWS Boto3を使う

CloudFormation のコードを Troposphere を使って生成する前準備として、Python のプログラムを作成し、実行できることを確認します。加えて、AWS が提供する Boto3 ライブラリで AWS API を呼び出せることも確認します。
Cloud9のドキュメント内に、簡単な Python コードの例があります。Cloud9 環境には Python2 と 3 がすでにインストールされています。サンプルコードをローカルマシンのリポジトリにコピーして、コード実行用に新しい Run Configuration を追加してください。Run Configuration はコードをテストする際、環境変数を設定して実行するのに便利です。長時間実行するサーバプロセスの標準出力を見ることもできます。

図4ではCloud9環境上で簡単な Python コードを編集し、実行した結果を確認しています。ファイルを作成するには File メニューを選んで New From Template から Python File サブメニューを選択します。エディタペインにサンプルコードをペーストすると、シンタックスハイライトによりコードが色付けされます。画面の下部、Run ペインにある Command: フィールドに入力したコマンドを見てください。ここでは Python2 を実行していることもわかります。

Cloud9 環境で Python コードを編集し、実行できることを確認しました。先述した markdown 編集時と同じように一連の Git コマンドを繰り返し、次のサンプルファイルに進みます。


図4. AWS Cloud9 で基本的な Python プログラムを実行する

次に、最新バージョンの Boto3 で AWS API を呼び出せるようにしましょう。bash コマンドラインタブで、以下のコマンドを入力します:

sudo python -m pip install boto3

Boto3のインストールが完了したら、先述した AWS Cloud9 のドキュメントから AWS SDK のサンプルコードをコピーして新しいファイルを作成します。新しいファイルを作成する場合、先ほどと同様にメニューから File→New From Templete→Python File を選択することで適切なシンタックスハイライトが得られます。ファイルのプログラミング言語を適切に認識させることで、一部の言語では入力に応じて適切なサジェストも得られます。ファイルを保存し、下部にある Run Configuration タブでコードを実行します。このとき1つ目の実行パラメータにユニークなバケット名を使用し、2つ目の実行パラメータにリージョンを指定します。プログラムが実行されると、まず Boto3 を使用して現在のアカウントの S3 バケット一覧を表示します。次に新しいバケットを追加し、再度バケットの一覧を表示して、追加したバケットを削除した後、最後にバケットの一覧を表示します。図5では正常にバケットが削除されたことを示しています。


図5. Pyhon の Boto3 を使って AWS API を実行する

Troposphere を使用して CloudFormation テンプレートを生成する

Troposphere は Python の Boto3 を使用して CloudFormation テンプレートを生成できるオープンソースプロジェクトです。JSON と YAML いずれのフォーマットも対応しており、多くの AWS のお客様が使用しています。Troposphere は成熟したプロジェクトであり、プロジェクトリポジトリには多くのサンプルがあります。Troposphere を使用することで CloudFormation テンプレート単体では記述できない、ループなどを使ったテンプレート生成が可能になります。Cloud9 環境に Troposphere を追加するには、以下のようにコマンドを実行します:

sudo python -m pip install troposphere[policy]

policy オプションにより追加のプロジェクトをインストールしています。今回の例では使用しませんが、これによって AWS Access Policy Language の JSON を容易に生成できるようになります。では、テンプレートを作成しましょう。まず template.yaml というファイルを作りヘッダに以下のように記述します。

AWSTemplateFormatVersion: "2010-09-09"
Description: A CFN Template

このファイルをそのままにして、短い Python コードを作成し、EC2 を 3 回繰り返して作成するループを記述します。Troposphere ライブラリを使ったコードを図6に示します。

from troposphere import Ref, Template
import troposphere.ec2 as ec2

template = Template()

envs = ['dev', 'test', 'prod']

for x in envs:
    instancename = x + "Ec2"
    ec2_instance = template.add_resource(ec2.Instance(
        instancename,
        ImageId="ami-a7a242da",
        InstanceType="t2.nano",
    ))

fh = open("template.yaml", "a")
fh.writelines(template.to_yaml())
fh.close()

図6. Troposphereを使用したPythonコードのサンプル。CloudFormation の YAML コードスニペットを生成する

ループにより、envs リストに入った3つのアイテムから EC2 インスタンスの名前を生成します。今回は dev(開発)、test(テスト)、prod(本番)の3つのインスタンスを生成します。次に先ほど手動で作った template.yaml ヘッダファイルに生成された YAML コードを追加します。なお、ヘッダ自体も Python コードで生成することも可能です。サンプルコードと最終的に作られる YAML ファイルを図7に示します。


図7. Troposphereを使用したPythonのサンプル。CloudFormationのYAMLコードスニペットを生成しています。

得られた YAML ファイルは CloudFormation で利用可能です。手元の YAML ファイルをコピー&ペーストして CloudFormation にアップロードしてもよいですし、CodeCommit リポジトリに push してそこから取り出すこともできます。

クリーンアップ

サンプルによる練習は以上です。作成したリソースをクリーンアップします。その前に、後に使うために CodeCommit リポジトリ上のファイルを保存しておきたいことでしょう。最初に作成したスタックを削除すると AWS Cloud9 環境と CodeCommit リポジトリの両方が削除されてしまいます。そこでリポジトリを (Cloud9 環境ではなく) 手元環境に複製しましょう。クローンするには AWS IAM コンソール で、自身の IAM ユーザ用の HTTPS Git 認証情報を作成する必要があります。このオプションは IAM ユーザ一覧でユーザ名を選択し 認証情報 タブを選択すると確認できます。画面をスクロールさせ、図8にあるように 生成(Generate) をクリックします。表示されるユーザ名とパスワードを使って Git リポジトリを手元環境に複製します。複製するための URL を確認するには CodeCommit コンソールからリポジトリを選択し、接続 ボタンをクリックします。URL を取得して Git の clone コマンドを手元環境で実行してください。


図8. サンプルファイルをリポジトリから手元環境に複製するため、Git認証情報を生成する

ファイルが複製できたら、CloudFormation コンソールに戻ってサンプルスタック (Troposphereが生成したYAMLテンプレートで作成したスタック)、AWS Cloud9 環境のスタック、CodeCommit リポジトリのスタックをそれぞれ削除します。相互のスタックには依存関係がないため、並列で削除可能です。このとき Cloud9 のバックエンドインスタンスを作成したスタックも同時に削除されます。

ボーナス情報: AWS Cloud9 のストレージ容量を増やす

AWS Cloud9 環境でコーディングしていると、バックエンド EC2 インスタンスの EBS ボリューム(デフォルトで 8GB) を使い切ってしまうことがあります。以下の手順でこの容量を増やすことができます。

  • AWS Cloud9 IDE で bash ターミナルを開き、`df -h` コマンドを実行します。`1K-blocks`カラムの下に8GBというデフォルトディスクの容量が見えます。これが拡張すべき値です。
  • Cloud9 IDE を閉じ、マネジメントコンソールの EC2 コンソールに移動します。Cloud9 環境が動作している EC2 を見つけ、停止します。EC2 の名前は以下のようなプレフィクスを持ちます。aws-cloud9-YourResourceName-0a0b…。図1のテンプレートを使用した場合、プレフィクスはaws-cloud9-MyC9Environment-0a0b… です。
  • インスタンスの状態が`停止(stopped)`になるまで待ちます。その後左のペインにある Elastic Block Store のサブメニューにあるボリュームをクリックします。
  • いンスタンス名と同じ名前のボリュームにチェックを入れ、アクションメニューからボリュームの変更を選択します。
  • サイズ フィールドに 8 より大きい数字を入力します(例えば 16 は 16GB を意味し、容量がデフォルトの2倍になります)。
  • 変更 ボタンをクリックして変更を確定します。
  • 数分後画面をリロードすると、ボリュームの状態が in-use - optimizing になります。リロードを繰り返し、状態が in-use - completed(100%) になればボリューム拡張は完了です。
  • AWS Cloud9 コンソールに戻り、Open IDEを選択します。Cloud9 はインスタンスが止まっていることを認識し、インスタンスを再起動して接続します。
  • Cloud9 IDE の bash ターミナルでdf -kコマンドを実行し、容量が確保できていることを確認します。先ほどの例では1K-blocksの下に 16GB のサイズが表示されているはずです。Use %(使用率)は拡張した容量に合わせて小さくなっているはずです。

まとめ

CloudFormation、AWS Cloud9、CodeCommit によってブラウザベースの安定した開発環境を容易に構築することができます。Python と、Boto3 および Troposphere などのツールを使うことで、AWS SDK API を使用したり、CloudFormation の YAML テンプレートを生成したりすることが迅速に行えます。CloudFormation テンプレートを生成する高レベル言語は Python 以外にもあります。他の公開プロジェクトでは Ruby、JavaScript、Go などの言語がターゲットになっています。

最後に、このブログで説明したのは AWS Cloud9 のほんの一部の機能だけであることを覚えておいてください。AWS Cloud9 はリモートのファイルを編集することができ、ライブペアプログラミングが可能です。ブレイクポイントによるデバッグや実行中プログラムの変数値を見ることも可能です。1つの Cloud9 環境に複数のリポジトリをクローンして、同時に複数のプロジェクトを実施することも可能です。Setting メニューあるいはメニューバー右端の歯車アイコンから多くのコンフィグレーションオプションを指定できます。AWS Cloud9 のより詳しい情報については AWS Cloud9 documentation をご覧ください。

ぜひ AWS Cloud9 の機能をお試しください。そして CloudFormation テンプレートを編集できるその他の高レベル言語についてもお試しください。インフラストラクチャのコード化と自動化を改善するための新しいアイディアが見つかるでしょう。

著者について

このブログは AWS CloudFormation のシニアデベロッパーアドボケートである Luis Colon (Twitter: @luiscolon1) によって書かれました。原文は こちら。翻訳は SA 大村が担当しました。