KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

EC2でAmazonnLinuxを5分で作成

今やAWSを使えばボタンをポチポチするだけで簡単に仮想サーバが作成できてしまういい時代になりました。ちょっと前まではサーバにVMを構築して複数OSを動かしていたのに、、、OSインストールに時間がかかるため短くても初めは1~2時間くらいかかったのは遠い昔(一度作成すればVMコピーできますが)。
AWSを使えば煩雑な操作は不要!Linuxの作成は5分で完了します!本当に超カンタンです!
ちょっとLinuxサーバを立てたいとき、複数台数を一気に用意したいときなど。これからはAWSで!
一度AWSで作成方法を試したらサーバにOS入れて構築。。。なんて面倒すぎる!
ということで今回はAWSのEC2(Amazon Elastic Compute Cloud)でAmazonLinuxを作成する手順を紹介します。

EC2サービスで仮想サーバを作成する

では早速仮想サーバを作成しましょう。AWSでは仮想サーバをEC2(Amazon Elastic Compute Cloud)というサービスを用いて構築します。ということでまずはEC2を選択します。

f:id:jainders:20160707194842j:plain

 

左のメニューから[インスタンス]を選択し、上部メニューから[インスタンスの作成]ボタンを押します。これから作成するEC2はインスタンスという単位で管理されています。仮想サーバ1台=インスタンス1コと考えてください。インスタンス1コにそれぞれ一意のインスタンスIDが割り当てられます。

f:id:jainders:20160707194846j:plain

 

Amazonマシンイメージ(AMI)から好きなイメージを選択します。今回はAmazonLinuxを使います。右横にある[選択]ボタンを押しましょう。
AmazonLinuxはざっくり言うとCentOS 6+AWS CLIという組み合わせです。他リポジトリAmazon独自のものだったり、コマンドが一部異なったりします。細かいところは私も調べきれてないので気になる方は独自に調べてみてください。
とにかくAmazonLinuxはAWSをフル活用するならAWS CLIが最初から入っているのでオススメです。S3と連携してデータを取ってきたりする処理を簡単に作成することができます。また何か問題があったとき、他のディストリビューションの問題はAmazonは対応してくれません。特別な希望がなければAmazon Linuxを選択しとくのが無難です。

f:id:jainders:20160707194856j:plain

 

インスタンスタイプを選択します。ここで選ぶのはマシンスペックです。基本的にマシンスペック(CPUとメモリ)の性能が高いほど1h当たりの利用料金も高くなります。今回は1か月の無料枠があるt2.microを選択して、[次の手順 インスタンスの詳細の設定]ボタンを押します。

f:id:jainders:20160707194903j:plain

 

インスタンスの詳細の設定をします。ここで自動割り当てパブリックIPを「有効化」に変更します。これで外部からEC2へアクセスするためのパブリックIPアドレスを起動時に割り当ててくれます。[次の手順 ストレージの追加]ボタンを押します。

f:id:jainders:20160707194908j:plain

 

次にストレージの追加の設定をします。今回はデフォルト8GBで問題ないのでそのまま何もせず、[次の手順 インスタンスのタグ付け]ボタンを押します。ストレージ容量はEC2作成後に変更することが可能です。

f:id:jainders:20160707194913j:plain

 

インスタンスのタグ付けは特に作成する必要はありませんが、サーバ名を割り当てたい場合はデフォルトタグの「Name」の値にサーバ名を割り当てるとEC2のインスタンス一覧画面で表示されます。[次の手順 セキュリティグループの設定]ボタンを押します。

f:id:jainders:20160707194918j:plain

 

セキュリティグループの設定は今回はデフォルトのssh(22)のポートを空けただけのものを使用します。実際に立てる時はhttp(80),https(443)などや、送信元のIPアドレス設定を行って、不正アクセスされないような値を設定してください。セキュリティグループ設定は後で簡単に変更することが可能です。[確認と作成]ボタンを押します。

f:id:jainders:20160707194924j:plain

 

今までの設定を確認して[作成]ボタンを押します。

f:id:jainders:20160707194933j:plain

 

キーをダウンロードします。端末からEC2にログインするために必要なものです。ここでキーをダウンロードしないとEC2に接続できなくなりますので必ずキーをダウンロードしてください。今回はキーペア名に「test_key」と入れました。[キーペアのダウンロード]ボタンからtest_key.pemをダウンロードして任意の場所に保存してください。ダウンロードしたら[インスタンスの作成]ボタンを押してEC2を作成します。

f:id:jainders:20160707194939j:plain

 

完了画面です。そのまま[インスタンスの表示]ボタンを押してインスタンス一覧画面に戻ります。

f:id:jainders:20160707194945j:plain

 

インスタンス画面に戻るとインスタンスの状態のところが「pending」、ステータスチェックが「初期化しています」の状態になっています。そのまましばらくお待ちください。

f:id:jainders:20160707194949j:plain

 

しばらくすると、インスタンスの状態が「running」、ステータスチェックが「2/2のチェックに合格しました」と表示されます。これでEC2インスタンスが作成完了しました。

f:id:jainders:20160707194955j:plain

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その3~

前回の記事はこちら。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~ - KAROUSHI -Japanese Engineer Blog-

API Gatewayの設定

さて3回目は最後にAPI Gatewayの作成と接続テスト実施を行います。

APIGatewayを作成する

lambdaの画面を開いて前回作成した[s3create]を選択します。

f:id:jainders:20160606201721j:plain

タブから[API endpoints][Add API endpoint]を押下します。

f:id:jainders:20160606201724j:plain

 

Add API endpoint画面が開きますので以下のように設定しましょう。
(今回はメソッドはPOSTで設定します)

 

API endpoint type:API Gateway(そのまま)
API name: LambdaMicroservice(そのまま)
Resource name: /s3create(そのまま)
Method: POST
Deployment stage: prod(そのまま)
Security: AWS IAM(そのまま)

[Submit]を押下します。

f:id:jainders:20160606201726j:plain

API endpointが作成され表示されることを確認しましょう。

APIをテストする

確認したらMethodの[POST]を選択してAPI Gatewayの画面へ遷移します。[クライアント]という文字の上にある[テスト(雷マーク)]を選択しましょう。

f:id:jainders:20160606201729j:plain

f:id:jainders:20160606201732j:plain

すると下図のようなテスト画面に遷移するので、リクエスト本文に以下のJSONをコピペして[テスト]をクリックしましょう。

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

f:id:jainders:20160606201735j:plain

以下のようにレスポンス本文、レスポンスヘッダー、ログが表示されればOKです。

f:id:jainders:20160606201740j:plain

 

これで一通りの流れを終えました。

今回はlambda処理を自作せずにblue printから選んで作成しました。どうでしょうか?APIが簡単にできましたね。URLも生成されているのでEC2などからURL+POSTデータを実行してあげれば、EC2上で動くサービスとの連携も可能です。

pythonの場合はbotoというlambdaのライブラリがあるようなので、次回はそれを使ってもう少し高度で実践的なことをやろうと思います。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~

API Gateway→lambda→S3の続きです。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~ - KAROUSHI -Japanese Engineer Blog-

 

今回はlambdaです。

pythonのlambda作成手順をあまりネット上で見かけなかったので、pythonの手順を紹介します。

lambdaの設定

Lambdaを作成する

上部タブから[サービス][Lambda]を選択します。

f:id:jainders:20160603222457j:plain

[Create a Lambda function]をクリック→"Select blue print"画面が表示されます。
(初回はcreate functionボタンが中央に表示されます)

f:id:jainders:20160603222459j:plain


検索ボックスの隣にあるプログラム選択ボックスから[Python 2.7]を選択すると、python関連のblue printが一覧で表示されます。
今回は[s3-get-object-python]を選択します。

f:id:jainders:20160603222500j:plain

 

Configure event sources画面が表示され、以下を設定して[Next]をクリックします。
Event source type: S3
Bucket: <S3に作成済みのバケット>
Event type: Object Created(All)
Prefix: 任意(空でもOK)
Suffix: 任意(空でもOK)

f:id:jainders:20160603222502j:plain

Configure function画面表示されます。
以下を設定して下へスクロールします。

Name:任意(今回はs3test)
Description: (そのまま)
Runtime: Python 2.7
Lambda function code: (そのまま)

f:id:jainders:20160603222504j:plain

以下の設定をします。

Hadnler: (そのまま)
Role: <S3 execution role>を選択します。
 →別ウィンドウが開くので以下を設定し[許可]をクリックする。
  IAMロール: lambda_s3_exec_role
  ポリシー名: 新しいロールポリシーの作成
Memory(MB): (そのまま)
Timeout: (そのまま)
VPC: (そのまま)

f:id:jainders:20160603222506j:plain

f:id:jainders:20160603222507j:plain

Review画面が表示されます。
そのまま[Create function]を押下します。

f:id:jainders:20160603222511j:plain

すると以下のような画面に遷移しfunctionの作成に成功したことが上部に表示されます。

f:id:jainders:20160603222513j:plain

 

functionのテストを実行する

[Actions][Configure test event]を押下します。

f:id:jainders:20160603222515j:plain

 

するとInput test event画面が表示されます。
すでに長いjsonが載っていますが、わかりづらいので下記に変更します。

テストコード

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

[Save and test]でテストを実行します。

f:id:jainders:20160603224904j:plain

すると先ほどの画面に戻ります。
その画面の下部へ移動し「Execution result:succeeded(logs)」と表示されていればOKです。正常にオブジェクトが取得できています。
レスポンスとして"text/html"が返ってきていることが確認できます。
ビルド時間、応答時間などがSummaryに、ログはLog outputに表示されます。

f:id:jainders:20160603222518j:plain

 

これでlambdaの設定は完了です。

次回最後にAPI Gatewayの設定を行います。

koboldtodragon.hatenablog.com

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~

AWS流行ってるね!ノンサーバって響きがかっこいいー!でも何したらいいか分からん! 
という感じなエンジニアです。(笑)
今回は3回に分けて

API Gateway→イベントキャッチしてlambdaからS3オブジェクトを取得する処理を実行

を実装してみます。

s3の設定

S3に新しいバケットを作成する

まずはS3に新しいバケットを作成します。
サービスから[S3]を押下します。

f:id:jainders:20160602204935j:plain

 

[バケットを作成]を押下します。

f:id:jainders:20160602204956j:plain

以下を設定して[作成]を押下します。
バケット名:teset.test.test.3(任意)※1 
リージョン:Oregon(任意)※2

※1 バケット名は一意に設定する必要があります。他ユーザが既に作成しているバケットは作ることができません。
※2 リージョンにより料金設定が異なります。

f:id:jainders:20160602205024j:plain


これで新しいバケットが作成されました。

バケットにポリシーを設定する

では次にバケットポリシーを設定して、オブジェクトを取得できるようにしましょう。
以下のようにバケット名が一覧で表示されているので、バケット名[test.test.test.3]を押下します。

f:id:jainders:20160602205025j:plain

右上にある[プロパティ]を押下すると、右からウィンドウが出てきます。
[アクセス許可][バケットポリシーの追加]を押下します。

f:id:jainders:20160602205026j:plain

バケットポリシーエディターがポップアップして表示されるので以下を追記して[保存]を押下します。

バケットポリシー

{
  "Version": "2012-10-17",
  "Statement": [
  {
    "Sid": "AddPerm",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::test.test.test.3/*"
  }
  ]
}

f:id:jainders:20160602205028j:plain

これでバケットポリシーの設定は完了です。
今回設定したポリシーは

test.test.test.3配下に存在するオブジェクトの取得をすべて許可する

という設定です。

S3にファイルをアップロードする

では最後にオブジェクトをアップロードします。
まずはindex.htmlを作成します。
以下の内容のindex.htmlを作成してください。

index.html

<html>
<body>
  <p>Hello</p>
</body>
</html>

左上の[アップロード]を押下すると、アップロード画面がポップアップして表示されます。

f:id:jainders:20160602205029j:plain

ドラッグ&ドロップか、[ファイルを追加する]を押してindex.htmlを選択し、[アップロードの開始]を押下します。

f:id:jainders:20160602205030j:plain

右側に転送ステータスが表示され「完了」と表示されると、左側の一覧に表示されます。
これでオブジェクト(index.html)のアップロードは完了です。

f:id:jainders:20160602205032j:plain

S3の設定は以上です。

 

今回S3にアップロードしたindex.htmlをlambdaからアクセスして取得できるようにします。

 lamdaの設定は次回。

koboldtodragon.hatenablog.com

pyenvでpython 3.5.1インストール時に"Missing the OpenSSL lib"でエラー

概要

pyenvでpython 3.5.1をインストールしようとしたらエラーが発生。

詳細

# pyenv install 3.5.1

Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/yyuu/pyenv/wiki/Common-build-problems


BUILD FAILED (CentOS release 6.7 (Final) using python-build 20160509)

Inspect or clean up the working tree at /tmp/python-build.20160516110941.16104
Results logged to /tmp/python-build.20160516110941.16104.log

Last 10 log lines:
(cd /root/.pyenv/versions/3.5.1/share/man/man1; ln -s python3.5.1 python3.1)
if test "xupgrade" != "xno" ; then \
case upgrade in \
upgrade) ensurepip="--upgrade" ;; \
install|*) ensurepip="" ;; \
esac; \
./python -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 7.1.2 requires SSL/TLS

原因

OpenSSLのライブラリが入っていないため。

対処方法

# yum -y install openssl-devel

pyenvでpythonの2.7.11インストール失敗時に"no acceptable C compiler found in $PATH"

概要

pyenvでpythonの2.7.11をインストールしようとしたらエラーが発生。

環境情報

VirtualBox: 5.0.16r105871

Linux: CentOS 6.7

詳細

# pyenv install 2.7.11

Downloading Python-2.7.11.tgz...
-> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Installing Python-2.7.11...

BUILD FAILED (CentOS release 6.7 (Final) using python-build 20160509)

Inspect or clean up the working tree at /tmp/python-build.20160516110407.13929
Results logged to /tmp/python-build.20160516110407.13929.log

Last 10 log lines:
checking for --with-universal-archs... 32-bit
checking MACHDEP... linux2
checking EXTRAPLATDIR...
checking for --without-gcc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20160516110407.13929/Python-2.7.11':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

原因

Cのコンパイラがないため。

対処方法

Cコンパイラyumでインストールする。

# yum -y install gcc

gitコマンドでprenvをインストールしようとしたら失敗

概要

gitコマンドでpyenvをインストールしようとしたらエラーが発生。

環境情報

VirtualBox5.0.16r105871
LinuxCentOS 6.7

詳細

# git clone https://github.com/yyuu/pyenv.git ~/.pyenv

-bash: git: コマンドが見つかりません

原因

gitコマンドがインストールされていないため。

対処方法

yumでgitをインストールする。

# yum install git