LambdaでAWSリソースをいろいろ操作する

学生時代はC言語やJavaをやっていたが、就職してからはインフラ分野だったので、アプリケーションに絡むところはゼロではないが、あまりなくなってしまった。やったとしてもリーダーとかちょっとした改修の要件定義ぐらい。

ただ、Lambdaがあることでプログラムを書く機会が作れたのは良い。いまやChatGPTがすべてやるとも言われるが、ChatGPTにお願いするにしても、指示が明確でないとできないわけで（今後、あいまいな指示でもプログラムは作ってくれるようになるかもしれないけれど）。

個人的なLambda、Pythonのメモ。特に学習して作ったわけではない、我流コードなので、あまり参考にしてはいけない（むしろJavaっぽい感じ）。

# 基本
まずはこのドキュメントを読む。
- Boto3 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

> Boto3ドキュメント
AWS SDK for Python（Boto3）を使用して、Amazon Elastic Compute Cloud（Amazon EC2）やAmazon Simple Storage Service（Amazon S3）などのAWSサービスを作成、設定、管理します。SDKは、オブジェクト指向のAPIとAWSサービスへの低レベルアクセスを提供

EC2ならここを読む。
- EC2(Boto3 documentation)
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html

# Pythonコード
よくインポートするもの。
```python:python
import json
import boto3
from botocore.exceptions import ClientError
import logging
import os
```

これの説明。
> これは、AWS LambdaでPythonを使用する場合によく使われるスターターコードです。これらの行は、必要なライブラリとモジュールをインポートするためのものです。以下に各行の機能を簡単に説明します。
> import json: JSONをシリアライズおよびデシリアライズするための標準ライブラリをインポートします。
import boto3: AWS SDKである Boto3 をインポートします。これにより、AWSの様々なサービスをPythonで操作できるようになります。
from botocore.exceptions import ClientError: AWS SDKである botocore パッケージから ClientError クラスをインポートします。このクラスは、AWSサービスでエラーが発生した場合に使用されます。
import logging: Pythonの logging モジュールをインポートします。ログを記録して、デバッグやトラブルシューティングに役立てます。
import os: Pythonの os モジュールをインポートします。このモジュールを使用することで、環境変数やパスなどのシステム情報にアクセスできます。

import jsonは、配列を扱うときに利用する。

# メイン部分
```python
def lambda_handler(event, context):
    # Lambda環境変数を代入
    aws_test01= os.environ['TEST01']
    aws_test02= os.environ['TEST02']
    # 配列として代入
    array_test03  = [ os.environ['TEST03'],os.environ['TEST03'] ]

    # loggerの定義
    logger = logging.getLogger()
    logging.basicConfig(level=logging.INFO,format='%(asctime)s: %(levelname)s: %(message)s')

      # 実際の処理
        try:
        # 正常時の処理
            functest()
        except:
        # 例外時の処理
            import traceback
            logger.exception('Error Message.')
            # 例外処理
            funcerrtest()
            raise
        else:
            最終的に行う処理
    else:
        print("OK.")
```
Lambdaの環境変数から読み込んで変数に入れたり、トライキャッチで例外対応をしている。


# 関数部分
```python
def functest(何らかの引数):
    何らかの変数 = 何らかの処理
    return 何らかの変数

def funcerrtest(何らかの引数):
    何らかの変数 = 何らかのエラー対応時の処理
    return 何らかの変数
```
ここについてはBoto3 documentationの内容を書く。

# 関数部分(VPCを作る場合の一例)
```python
def functest(何らかの引数):
    vpcclient = boto3.client("ec2", REGIONNAME)
    vpc = vpcclient.create_vpc(CidrBlock='192.168.0.0/16',)
    return vpc
```

# 活用法メモ
CloudwatchやSNSと連携させて、作ったLambdaを実行させると自動化が進む。
Cloudwatchで何かを監視して、あるメトリクスにフラグがたったら、あるログを検知したら、というイベントを作り。そのイベントが出たらSNSに通知。SNSがLambdaを呼び出す、という流れ。
※もはや定番と言える内容だが

# 参考リンク
boto3を使用してEC2立ち上げに必要な環境構築を行う
https://dev.classmethod.jp/articles/build-enviroment-required-to-launch-ec2-using-boto3/

Lambdaのboto3バージョンを確認する | AWS SDK for Python
https://www.bioerrorlog.work/entry/check-lambda-boto3-version

PythonとBoto3を使用して、AWSのインフラ構築を自動化してみた
https://ops.jig-saw.com/tech-cate/python_boto3_aws

boto3を使用してEC2立ち上げに必要な環境構築を行う
https://dev.classmethod.jp/articles/build-enviroment-required-to-launch-ec2-using-boto3/

AWS LambdaをVPC内に配置する際の注意点
https://devlog.arksystems.co.jp/2018/04/04/4807/

Missing handler error in AWS Lambda
https://stackoverflow.com/questions/48266106/missing-handler-error-in-aws-lambda

Pythonの「SyntaxError: invalid non-printable character U+3000」とは何ですか？
https://blog.pyq.jp/entry/python_kaiketsu_211102

AWS Lambdaをつかって、CloudWatchが監視した値を超えたら、slackに通知する仕組みをつくろう on Python
https://qiita.com/TanakanoAnchan/items/dae4edecfd0d85ea2542

Amazon CloudWatch Alarmのアラーム発生時にSNS Topic経由で起動したLambda内で直近のデータポイントの値を取得する
https://dev.classmethod.jp/articles/get-the-value-of-the-most-recent-data-point-in-a-lambda-launched-via-sns-topic-when-an-amazon-cloudwatch-alarm-occurs/

AWS Lambdaをつかって、CloudWatchが監視した値を超えたら、slackに通知する仕組みをつくろう on Python
https://qiita.com/TanakanoAnchan/items/dae4edecfd0d85ea2542



AWS Lambdaで遊ぼう #3 LambdaからSNSでメール送信
https://zenn.dev/nakam_aws/articles/6562e07cfae4fd

AWS Lambdaで遊ぼう #4 環境変数を活用する
https://zenn.dev/nakam_aws/articles/71897e2eb63691

lambdaでJSONの環境変数を扱う
https://qiita.com/pokotyan/items/269ba07967ed242f3b0e

【Lambda】JSONフォーマットの環境変数を利用する方法
https://tarovlog.com/2021/11/25/lambda-envval-json/

【Tips】AWS Lambdaの環境変数にJSONを設定したい！
https://dev.classmethod.jp/articles/aws-lambda-env-var-json/

Lambda でバッチ処理を構築する際のエラー通知パターン 5選
https://blog.serverworks.co.jp/lambda-notification-pattern

AWS Lambdaの環境変数の4KB制限について
https://qiita.com/takepan/items/adf42fe27ad131b88725

AWS Lambdaを使うためにPythonを勉強したまとめ
https://qiita.com/Yuki_BB3/items/bf713a5141ea59b741dc

Python for文の書き方を初心者向けに徹底解説！
https://www.bold.ne.jp/engineer-club/python-for

Python 例外処理のサンプル(try…exceptとraise)
https://itsakura.com/python-try-except

Pythonのループ＋try/except/finally句＋break/continueの挙動
https://qiita.com/taka_maenishi/items/a3d2c7f04f623d78623d

Pythonで文字列を連結・結合（+演算子、joinなど）
https://note.nkmk.me/python-string-concat/