Cloud9でAWS CLI Toolsを実行するLambda Function(Python)を作る


こんにちは、ひろかずです。
AWS CLI Toolsを実行するLambda Functionは、これまでも幾つかのブログで書かれていましたが、Cloud9環境での実装が思いの外簡単だったので、一筆書きます。

# 注意
2018/5/1現在、Cloud9は以下リージョンにてサポートされています。

EU (アイルランド)
アジアパシフィック (シンガポール)
米国東部 (バージニア北部)
米国東部 (オハイオ)
米国西部 (オレゴン)

# 工程
1. Cloud9環境を作成する
2. ブループリントからLambda Functionを開く
3. AWS CLI ToolsをLambda Function内にローカルインストール
4. AWS CLI ToolsをLambda Functionで実行

# 参考ドキュメント
[AWS Lambda Python で AWS CLI を実行する方法](https://www.magtranetwork.com/aws/aws_lambda_python_aws_cli.html)

# 1. Cloud9環境を作成する
AWSコンソールにて、Cloud9管理画面を開きます。

![cloud9-00.png](https://qiita-image-store.s3.amazonaws.com/0/46611/92b7db41-3513-5b73-e2e4-a32b3951405e.png "cloud9-00.png")

[Create environment]を選択

![cloud9-01.png](https://qiita-image-store.s3.amazonaws.com/0/46611/e3529aef-87f0-1a0c-113a-d5902efcf9ea.png "cloud9-01.png")

環境名を指定して、[Next step]を選択

![cloud9-02.png](https://qiita-image-store.s3.amazonaws.com/0/46611/b2c8d3d8-ccfa-a6fa-0acd-39cc68692acb.png "cloud9-02.png")

環境のスペックを設定します。
今回は、EC2タイプのデフォルト設定で作成します。
[Next step]を選択

![cloud9-03-1.png](https://qiita-image-store.s3.amazonaws.com/0/46611/4d13330e-958e-36ca-84ad-3740a6ad996d.png "cloud9-03-1.png")


![cloud9-03-2.png](https://qiita-image-store.s3.amazonaws.com/0/46611/3c12b89f-e275-855e-4124-03a8a412a133.png "cloud9-03-2.png")

確認画面にて注意書きを確認して、[Create environment]を選択

注意書きには、以下が記載されています

- バックアップは自分でやること
- ソフトウェア・アップデートは自分でやること
- CloudTrailを有効にすること
- 環境のシェアをする場合は、信頼されたユーザーだけに留めること。

これらの注意書きは、Cloud9が便利すぎて、いろいろできてしまうが故の注意書きと考えて良いでしょう。

![cloud9-04.png](https://qiita-image-store.s3.amazonaws.com/0/46611/5f2ac088-e06c-ec80-8970-20e59dcb8646.png "cloud9-04.png")

# 2. ブループリントからLambda Functionを開く
Welcomeページが表示されるので、[Create Lambda Function]リンクを選択

![cloud9-05.png](https://qiita-image-store.s3.amazonaws.com/0/46611/97e4a010-aecb-d6e9-60ba-2978f04bf573.png "cloud9-05.png")

Function名を入力して[Next]を選択

![cloud9-06.png](https://qiita-image-store.s3.amazonaws.com/0/46611/0551696a-2704-090b-1b5b-f82494176182.png "cloud9-06.png")

今回はpython2.7で作りたいので、ブループリントは[hello-world-python]を選択して[Next]を選択

![cloud9-02-1.png](https://qiita-image-store.s3.amazonaws.com/0/46611/9cabd000-dcc5-1b65-5848-c1a8f03f3fbd.png "cloud9-02-1.png")

今回は、トリガーなし(none)で設定します。
[Next]を選択

![cloud9-07.png](https://qiita-image-store.s3.amazonaws.com/0/46611/86b361bf-b3ea-eb18-1990-5e1bccce6e12.png "cloud9-07.png")

今回は、デフォルトのまま設定します。
Roleについては、最終的には本番向けに調整されたものに変更するようにしてください。
[Next]を選択

![cloud9-08.png](https://qiita-image-store.s3.amazonaws.com/0/46611/4d3a16de-c8cb-c8f5-362b-e7487085dd41.png "cloud9-08.png")

[Finish]を選択

![cloud9-09-1.png](https://qiita-image-store.s3.amazonaws.com/0/46611/d3ef479d-0b0c-2d29-0603-d9a1ccc6c43b.png "cloud9-09-1.png")

# 3. Lambda Function内にAWS CLI Toolsをローカルインストール

Cloud9のIDE画面が展開されます。

![cloud9-11.png](https://qiita-image-store.s3.amazonaws.com/0/46611/3f34f771-edb1-35b3-0d63-1e1bf985d043.png "cloud9-11.png")

## ディレクトリ構造の把握
画面下部でシェルが使えるので、ディレクトリ構造を把握しておきます。

Cloud9環境ディレクトリ

- /home/ec2-user/environment

作成したFunctionディレクトリ(今回の場合,`test`というFunctionを作成しています)

- /home/ec2-user/environment/test

lambda_function.pyの位置

- /home/ec2-user/environment/test/test/lambda_function.py

## AWS CLI Toolsをローカルインストール

`/home/ec2-user/environment/test`に移動して、以下コマンドを実行

```
$ pip install awscli -t ./
$ pip install simplejson -t ./
$ pip install argparse -t ./
```

## awsコマンドスクリプトを作成
`/home/ec2-user/environment/test`にawsコマンドスクリプトを作成

```
$ vi aws
```

```aws
#!/usr/bin/python
# Copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
 
#     http://aws.amazon.com/apache2.0/
 
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
import sys
import os
 
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
    os.environ['LC_CTYPE'] = 'en_US.UTF-8'
import awscli.clidriver
 
 
def main():
    return awscli.clidriver.main()
 
 
if __name__ == '__main__':
    sys.exit(main())
```

各ファイルに実行権を付与

```
$ chmod 755 -R *
```

# 4. AWS CLI ToolsをLambda Functionで実行
lambda_function.pyにAWS CLI Toolsを呼び出すコードを記載

- もともと入っているHello Worldの内容はすべて消去します。

```lambda_function.py
import commands
import json
import os
from cStringIO import StringIO
import re
 
print('Loading function')
 
def _(cmd):
    return commands.getoutput(cmd) 
     
def lambda_handler(event, context):
    print(_("./aws s3 ls"))
```

緑色の実行ボタンを選択すると、[Function Logs]欄に結果が表示されます。
期待通り、s3の内容が表示されていますね。

![cloud9-12.png](https://qiita-image-store.s3.amazonaws.com/0/46611/f76386e1-b109-d9f7-4aea-09e870cbf7e7.png "cloud9-12.png")


## AWS CLI Toolsをシェルスクリプトから呼び出す
先程は、AWS CLI Toolsを直接実行しましたが、シェルスクリプトでラップしたものを呼び出します。

シェルスクリプトは、`/home/ec2-user/environment/test`に配置します。
- 以下コマンドは、画面下部のシェルコンソールから実行します。

```
$ vi wrap.sh
```

```wrap.sh
#!/bin/bash
aws s3 ls
```

lambda_function.pyを以下のように修正して、保存します。

```lambda_function.py
import commands
import json
import os
from cStringIO import StringIO
import re
 
print('Loading function')
 
def _(cmd):
    return commands.getoutput(cmd) 
     
def lambda_handler(event, context):
    print(_("sh wrap.sh"))
```

緑色の実行ボタンを選択すると、[Function Logs]欄に結果が表示されます。
こちらでも、期待通り、s3の内容が表示されていますね。

![cloud9-13.png](https://qiita-image-store.s3.amazonaws.com/0/46611/fd11e3a0-d65a-c584-6322-26b031055148.png "cloud9-13.png")

Cloud9環境を利用することで、ローカルにaws sam local等の開発環境を用意することなくコードの作成(動作確認)に集中することができました。
東京リージョンでの開通が待たれますね。

今日はここまでです。
お疲れ様でした。