AWS Lambdaを使うためにPythonを勉強したまとめ


__AWS__ __Lambda__ __Python__ __!!!__

週末更新、吉田です。
nodeの非同期は僕にはオーバーテクノロジ過ぎたので[AWS Lambda](https://aws.amazon.com/jp/lambda/)はPythonを使っています（Javaという選択肢は僕にはなかった）。
AWS Lambdaの関数をそこそこ書いてきて、なんとなく使い方はつかめてきたのでよく使うのをまとめてみました。

---

###import
使用するモジュールを

```
import モジュール名
```
の形式でインポートします。
Pythonには様々な外部モジュールが存在していて、importすることで使用することが出来ます。
AWS Lambdaで使う上で最も使うのは __boto3__ ではないかと思います。
__boto__ はAWSのAPIを扱うためのPython版のSDKです。

```python:sample
import boto3
ec2 = boto3.resource('ec2')
```


> モジュール名.メソッド（’与える引数’）

みたいに使っていけば使えるはずです。
上記例では変数【ec2】に格納することで、ec2.hogehoge　でec2のメソッドを使用できるようにしています。

---

###変数
Pythonで変数を使用は

```python:変数
変数 = 'hogehoge'
```

のように使用します。
Javaとかみたいに型の宣言とかは不要です。

Pythonに定数はないため、お作法的に全部大文字の変数は定数とするようです。

---
###配列
リスト型の変数は以下のようにして使用します

```python:配列
array = ["hoge","fuga","bar"]

```
配列は[ ]を使用します配列の要素は０から格納されるため、上記の例で要素”hoge”にアクセスするには

```python:sample
array = ["hoge","fuga","bar"]
sample = array[0]
```

こんな感じにするとsampleにarrayの要素番号０（hoge）が格納されます

__配列への要素の追加__
.appendを使用することで配列（リスト）の末尾に要素を追加することが出来ます

```
array = ["hoge","fuga","bar"]
array.append("hogeeeee")
```

こうすることで配列（array）は
> array = ["hoge","fuga","bar","hogeeeee"]

となります。

__配列から要素の削除__
.popを使用することで配列（リスト）の要素を削除することが出来ます
.pop(要素番号)で指定の要素を削除します。
.pop()と要素番号を指定しないと末尾が削除されます
.popは削除した要素を返します

```
array = ["hoge","fuga","bar","hogeeeee"]
var = array.pop()
```

> array = ["hoge","fuga","bar"]
> var = "hogeeeee"

こうなります。

---
###辞書型の配列
__キーと値のセットを配列として保持し、キーを指定して値を取り題したい__
こんな時に使うのが辞書型です。

```
dic = {"id":"i-hogehoge","type":"4xlarge"}
```
みたいに使います。
リスト型と違い{ }で括ることで辞書型として使用できます。


キーに対する値を取り出します

```
dic = {"id":"i-hogehoge","type":"4xlarge"}
dic["id"]
```
> i-hogehoge

というように __辞書型配列名[キー名]__ でキーに対する値を取得します。

辞書型の配列の総素数を取得するときは __len()__ 関数を使用します。

```
dic = {"id":"i-hogehoge","type":"4xlarge"}
dic_num = len(dic)
```

for文でぶん回す時なんかに便利
__ちなみに、辞書・リスト・タプル全部lenで大丈夫__

__要素の追加と削除__

追加

```
dic = {"id":"i-hogehoge","type":"4xlarge"}
dic["AZ"] = "a"
dic["type"] = "xlarge" 

```

> dic = {"id":"i-hogehoge","type":"xlarge","AZ":"a"}

こんな感じで追加します。
注意点は、存在しないキーを指定すれば新しく作りますが、
既に存在するキーを指定すると上書きします。

削除
.pop(キー名)で削除します。

```
dic = {"id":"i-hogehoge","type":"4xlarge"}
dic.pop('type')
```

---

###関数
Pythonで関数を利用するときは __def__ を使用して関数を定義します。

```python:def
def sample1(content1, content2):
	print(content1)
	print(content2)
```

こんな形になります。
de中の（ ）内に関数に渡す引数を定義します。,区切りで複数指定することが出来ます。
関数の使用は　関数名(引数１, 引数２)　というように使用します。
また、関数内の処理の結果を返すことができます。
結果を返す場合は __return__ 文を使用することで関数の処理結果を呼び出し元に返却します。

```python:sample
def lambda_handler(event, context):
	kansu_kekka = kansu1(hoge, hoge)
	
	print(kansu_kekka)
	
	
	
	
def kansu1(hikisu1, hikisu2):
	moji_1 = hikisu1
	moji_2 = hikisu2
	kekka = moji_1 + moji_2
	
	return kekka

```

> hogehoge

みたいなイメージです。
__複数の値を返したいときはリスト・タプル・辞書型を使用すればいけます。__

```
kekka_array = [hoge, bar, fuga]
retrun kekka_array
```

こんな感じですね。辞書やタプルもおんなじ感覚

---
###for文
個人的にAWS Lambdaを使っていてforの利用法としてはリストの要素をぶん回すeach的な感じ。
その方法について

```
array = ["hoge","fuga","bar","hogeeeee"]
count = len(array)

for i in range(0, count):
	<繰り返したい処理>

```

###if文

```
type = 't2.micro'

if type == 'm4.4xlarge':
	print("NOOOOOOOOOOOO!!!!!")
elif type == 'm4.xlarge': 
	print("OK"）
else:
	print(type)
	
```

比較演算子はこんな感じ

|演算子|意味|
|:------:|:---------:|
|==|等しい|
|!=|等しくない|
|>|大きい|
|>=|大きいか等しい|
|<|小さい|
|<=|小さいか等しい|


---
###関数：lambda_handler(event, context)
Pythonの基本的なお話からAWS Lambdaのお話に移ります。
AWS Lambda（Python2.7)を初めて触り、一番謎なのがこの文章。

AWS Lambdaが実行されるとき、AWS Lambdaは指定したプログラム中のこの関数を実行します。
この関数名は変更可能ですが、変更した際はAWS Lambdaのコンソールで実行関数の名前を変更しないといけません。
特別に何か理由がない限りはデフォルトのままこの名前を使用するべきでしょう。
引数で指定されている __event__ はAWS Lambda関数が実行される際にAWS Lambdaに渡される情報がJSON形式で格納されています。

イベント・ドリブンでAWS Lambdaを実行する場合、このeventの中に何らかのイベント情報が格納されているのでこのJSONをゴリゴリしていけば欲しい情報は手に入ります。

contextはとりあえず気にしない方がいいです。
[Context オブジェクト (Python)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context-object.html)に書いてあるよう有益な情報を取得できますが、混乱します。
必要になるであろうときまで頭の片隅においておきましょう。使うときに調べれば良いのです。いつかそんな時が来る。

---

だーーーーーっと書いていきましたがこの辺とJSONでゴリゴリする方法がわかっていればAWS Lambdaのはじめの一歩を踏み出せるかと思います。

JSONについては以前[この記事](http://qiita.com/Yuki_BB3/items/7885e06f82bebfa8a3bb)に書いているのでよければ参考にしてください。

個人的なメモ感が強いのでもう少しブラッシュアップしたらエンジニアブログに書こうかなー