EC2インスタンスがECSインスタンスとして認識されないときに確認すること

こんにちは。beaglesoftの真鍋です。

ECSを利用しているときにスポットインスタンスなどのEC2インスタンスを追加でを利用することは多いと思います。そんなときにスポットインスタンスを購入してもECSに紐付かないということがありました。

-- 追記ここから 以下に当時の対応方法をまとめていたのですが、そもそも下記の原因を特定するためにはコンテナインスタンスのログを確認することが重要です。

コンテナインスタンスのログはコンテナインスタンスにsshでログインして/var/log/ecs/ecs-agent.log.xxxxを参照することで確認できます。

Amazon ECS ログファイルの場所 - Amazon Elastic Container Service

-- 追記ここまで

どうしてだろうかということでいろいろと確認したのですが、それぞれの事象で次の2つのことが原因だったのでメモします。

  1. 起動設定のユーザーデータにクラスタとの関連を定義していない。
  2. ロールを設定していない。

起動設定のユーザーデータにクラスタとの関連を定義していない

作成したEC2インスタンスをECSインスタンスとして関連付けるためには、EC2インスタンスのユーザーデータに以下の設定を行う必要があります。

#!/bin/bash
echo ECS_CLUSTER={クラスタ名} >> /etc/ecs/ecs.config

この設定を行わないと作成したEC2インスタンスがECSインスタンスとして関連づきません。

ロールを設定していない

EC2インスタンスがECSインスタンスとして設定されるにはいくつかの権限が必要になります。これらの権限はポリシーとして定義した上で、ecsInstanceRoleとして設定します。このことについてはAmazon ECS コンテナインスタンスの IAM ロール - Amazon EC2 Container Serviceに詳細があります。

設定するポリシーは以下の通りとなります。これはAmazonEC2ContainerServiceforEC2Roleの内容と同じなので、AWS管理ポリシーのAmazonEC2ContainerServiceforEC2RoleecsInstanceRoleに設定するほうが良いと思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:CreateCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:DiscoverPollEndpoint",
                "ecs:Poll",
                "ecs:RegisterContainerInstance",
                "ecs:StartTelemetrySession",
                "ecs:UpdateContainerInstancesState",
                "ecs:Submit*",
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

このecsInstanceRoleをEC2インスタンスのIAMロールとして設定する必要があります。この設定はコンソールのEC2インスタンスに関する画面より確認できます。

EC2 Management Console (1).png (44.5 kB)

まとめ

これだけが原因でないことが多いのですが、ECS便利なのにいろいろと触り始めはハマることが多いのでメモとして残しておきたいと思います。

追記

そもそもECSインスタンスにはログが出力されているのでそちらを確認することを始めに行うべきなため追記しました。

AlfredでTerminal / Shellを利用する

こんにちは。最近仕事でmacを使うようになったbeaglesoftの真鍋です。

私のパソコン遍歴は色々と紆余曲折しているのですが、なんだかんだ言ってもmacは便利です。Windowsは色々と遅く感じてしまうし、Linuxだと開発以外の仕事では少し不便というところなのでmacはちょうどいい塩梅になっています。

Alfred

macは便利なのですが、その便利を支えるアプリケーションは結構たくさんあります。その中でも、とりあえずこれはと言われるとやはりAlfred - Productivity App for Mac OS Xが真っ先に思いつきます。

Alfredは単なるランチャーアプリケーションなのですが、おそらくエディタやターミナルと同じくらい頻繁に利用します。というのも、何かをしようと思ったときにまずAlt + Spaceから始まることが多いからです。

また、GoogleでAlfredと検索すればいろいろな機能についての紹介があります。使う人のコンテキストにもよるのでしょうが、いろいろな人にとって便利なアプリケーションではないでしょうか。

AlfredでTerminalやシェルを使う

さて、Alfred3のFeatuersにはいろいろな機能がありますが、Terminal / Shellという機能があります。この機能ではAlfredに>を入力することでTerminalや指定したShellコマンドを実行することができます。

例えば> topと入力すると、Terminalが起動しtopコマンドが実行されます。

iTermが利用したい

この機能便利なのですが、デフォルトではTerminalが起動します。私はいつもiTermを利用しているのでできればiTermが起動してほしいです。

ちょっとGoogleで検索したところ以下のようにiTermを起動するためのScriptがわかりやすい説明とともに紹介されていました。

stuartcryan/custom-iterm-applescripts-for-alfred: Custom iTerm Applescripts for Alfred

かんたんに手順をまとめると、、、

  1. curl --silent 'https://raw.githubusercontent.com/stuartcryan/custom-iterm-applescripts-for-alfred/master/custom_iterm_script_iterm_2.9.applescript' | pbcopyを実行します。
  2. Alfredを起動してpreを入力し、show Alfred preferencesを表示します。
  3. FeaturesTerminal / Shellを表示します。
  4. ApplicationをCustomに変更してCommand+Pで貼り付けます。
  5. Alfredを再起動します。

これで設定は完了です。今回はAlfred3を利用したのですが、古いバージョンを利用する場合にはダウンロードするスクリプトが異なるようなので注意してください。

それでは、楽しいmacライフを!

SDKMANでJavaの開発環境をセットアップする

こんにちは。beaglesoftの真鍋です。

Javaの開発環境はJDKのインストールに始まりビルドツールであるmavenやgradleのインストールまで行う必要があります。以前はそれぞれ別々にインストールする必要があったのですが、最近ではこれらのツールを管理するツールが提供されておりかなり便利にインストールができます。そのツールがcurl -s “https://get.sdkman.io” | bashです。

JDKのインストールについて

JDKのインストールについてSDK MANで実行することは可能ですが、インストール後の設定でJAVA_HOMEの設定などを行う必要があるためOracle社からJDKをダウンロードしてインストールすることをおすすめします。

SDK MANのインストール

SDK MANのインストールは以下のコマンドを実行します。

$ curl -s "https://get.sdkman.io" | bash


Thanks for using...


     SSSSSSSSSSSSSSS DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK
   SS:::::::::::::::SD::::::::::::DDD    K:::::::K    K:::::K
  S:::::SSSSSS::::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::S     SSSSSSSDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S:::::S              D:::::D    D:::::DKK::::::K  K:::::KKK
  S:::::S              D:::::D     D:::::D K:::::K K:::::K
   S::::SSSS           D:::::D     D:::::D K::::::K:::::K
    SS::::::SSSSS      D:::::D     D:::::D K:::::::::::K
      SSS::::::::SS    D:::::D     D:::::D K:::::::::::K
         SSSSSS::::S   D:::::D     D:::::D K::::::K:::::K
              S:::::S  D:::::D     D:::::D K:::::K K:::::K
              S:::::S  D:::::D    D:::::DKK::::::K  K:::::KKK
  SSSSSSS     S:::::SDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S::::::SSSSSS:::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::::::::::::SS D::::::::::::DDD    K:::::::K    K:::::K
   SSSSSSSSSSSSSSS   DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK


                      mmmmmmm    mmmmmmm     aaaaaaaaaaaaa  nnnn  nnnnnnnn
                    mm:::::::m  m:::::::mm   a::::::::::::a n:::nn::::::::nn
                   m::::::::::mm::::::::::m  aaaaaaaaa:::::an::::::::::::::nn
                   m::::::::::::::::::::::m           a::::ann:::::::::::::::n
                   m:::::mmm::::::mmm:::::m    aaaaaaa:::::a  n:::::nnnn:::::n
                   m::::m   m::::m   m::::m  aa::::::::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma:::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::::::::aa:::a n::::n    n::::n
                   mmmmmm   mmmmmm   mmmmmm  aaaaaaaaaa  aaaa nnnnnn    nnnnnn


                                                 Now attempting installation...

Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Installing SDKMAN scripts...
Create distribution directories...
Getting available candidates...
Prime the config file...
Download script archive...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 20944  100 20944    0     0   9382      0  0:00:02  0:00:02 --:--:--  142k
Extract script archive...
Install scripts...
Set version to 5.5.10+240 ...
Attempt update of zsh profiles...



All done!


Please open a new terminal, or run the following in the existing one:

    source "/Users/user/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

次にターミナルなどを新しく起動して以下のコマンドを実行します。

$ source "/Users/{user}/.sdkman/bin/sdkman-init.sh"
$ sdk help
==== BROADCAST =================================================================
* 12/08/17: Kscript 1.6.0 released on SDKMAN! #kscript
* 10/08/17: Azul Zulu 9ea13 is now available for download from SDKMAN! on Linux, Mac OSX, Windows. #java
* 09/08/17: Java 8u144 released on SDKMAN! #java
================================================================================

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       flush             <candidates|broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list

   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy

ここまででSDK MANのインストールは完了です。特にmacやUbuntuで設定内容が異なることはありません。素晴らしいですね!

JDKのインストール

ここからは各アプリケーションのインストールです。インストールできるアプリケーションを表示します。

$ sdk list

================================================================================
Available Candidates
================================================================================
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help

--------------------------------------------------------------------------------
Activator (1.3.10)                   http://www.lightbend.com/activator/download

Typesafe is a GUI/CLI tool to help with building reactive applicaions. It uses
sbt (simple build tool) behind the scenes to build, run, and test your project.
It provides a code editing interface, and provides templaes and seeds for you to
clone and use.

                                                         $ sdk install activator
--------------------------------------------------------------------------------
Ant (1.10.1)                                             https://ant.apache.org/

Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
tasks.

                                                               $ sdk install ant
--------------------------------------------------------------------------------
...

listを表示することで、インストール可能なアプリケーションとインストール法オフが表示されます。例えば、Antの場合にはsdk install antでインストールできることがわかります。

groovyのインストール

groovyのインストールは以下の通り実行します。

$ groovy -v
zsh: command not found: groov

$ sdk install groovy

Downloading: groovy 2.4.12

In progress...

######################################################################## 100.0%

Installing: groovy 2.4.12
Done installing!


Setting groovy 2.4.12 as default.

$ groovy -v
Groovy Version: 2.4.12 JVM: 1.8.0_144 Vendor: Oracle Corporation OS: Mac OS X

mavenのインストール

mavenのインストールは以下の通り実行します。

$ mvn -v
zsh: command not found: mvn
ymanabe ~ $ sdk install maven

Downloading: maven 3.5.0

In progress...

######################################################################## 100.0%

Installing: maven 3.5.0
Done installing!


Setting maven 3.5.0 as default.
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00)
Maven home: /Users/{user}/.sdkman/candidates/maven/current
Java version: 1.8.0_144, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac"

Gradleのインストール

最後にGradleのインストールを行います。

$ gradle -v
$ sdk install gradle

Downloading: gradle 4.1

In progress...

######################################################################## 100.0%

Installing: gradle 4.1
Done installing!


Setting gradle 4.1 as default.

$ gradle -v

------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------

Build time:   2017-08-07 14:38:48 UTC
Revision:     941559e020f6c357ebb08d5c67acdb858a3defc2

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_144 (Oracle Corporation 25.144-b01)
OS:           Mac OS X 10.12.6 x86_64

最後に

これでJavaに関する環境構築はかなり楽になるのではないでしょうか。手動でインストールを行っていた方はぜひ利用してみてください。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築