chatgpt4を使って、自分でコーディングせずにpythonスクリプトを生成してみた!「awsでURLリストから、SSL証明書の有効期限をリストアップして、スラックに投稿するサービスを作りたい」
chatgpt4に投げて、ひたすらPDCAサイクルを回してみた。
chatgpt4を使えば、プログラマじゃなくても、AWSを使ったWebサービス作れそう(折れない心があれば)
最終的には、以下のようなAWS構成になった。
EventBridge(毎朝9時)→Lambdaで各サーバのSSL証明書の期限をチェック→結果をslackに投稿(api keyはSecretManager)
だいたいSSL証明書のチェックが1秒かかる感じ。
Lambdaのタイムアウトが、最大15分(900秒)なので、900サーバくらいまで行けそう。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63  | 
						import requests import ssl import socket from datetime import datetime, timedelta import boto3 import json # Slack Webhook URLを安全に取得 secrets_client = boto3.client('secretsmanager') secret_name = 'ssl_expired_checker_post_slack' # シークレットを取得 response = secrets_client.get_secret_value(SecretId=secret_name) # シークレット文字列を取得してJSONオブジェクトに変換 secret = json.loads(response['SecretString']) # SLACK_WEBHOOK_URLを取得 slack_webhook_url = secret['SLACK_WEBHOOK_URL'] # SSL証明書の有効期限をチェックする関数 def check_ssl_expiry(url):     ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z'     context = ssl.create_default_context()     conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=url)     conn.settimeout(3.0)     conn.connect((url, 443))     ssl_info = conn.getpeercert()     return datetime.strptime(ssl_info['notAfter'], ssl_date_fmt) # Slackにメッセージを投稿する関数 def post_to_slack(message):     requests.post(slack_webhook_url, data=json.dumps({'text': message}), headers={'Content-Type': 'application/json'}) # Lambdaハンドラ関数 def lambda_handler(event, context):     urls = ['google.com', 'yahoo.co.jp', 'twitter.com', 'facebook.com', 'apple.com'] # URLリスト     expiration_info = []     # 全てのURLのSSL証明書の有効期限を取得     for url in urls:         expiry_date = check_ssl_expiry(url)         expiration_info.append((url, expiry_date))     # 有効期限でソート     expiration_info.sort(key=lambda x: x[1])     # メッセージをフォーマット     messages = []     for url, expiry_date in expiration_info:         message = f'{url} SSL certificate expires on {expiry_date.strftime("%Y-%m-%d")}'         if expiry_date < datetime.now() + timedelta(days=30):             message += " - SSL更新の必要あり!"         messages.append(message)     # メッセージを投稿     post_to_slack('\n'.join(messages))     return {         'statusCode': 200,         'body': json.dumps('Execution completed successfully')     }  | 
					
Lambdaでpyhonを実行したら、requestsモジュールが無い!とエラーになった
| 
					 1  | 
						  "errorMessage": "Unable to import module 'lambda_function': No module named 'requests'",  | 
					
requestsって、ptyhon標準モジュールじゃないのか…。
ローカルにダウンロードしてきて、自作pythonファイルと一緒のディレクトリに入れて、zip化してアップロードしないとダメらしい。
アップロードした後は、lambdaの管理画面から修正できた。
| 
					 1 2 3 4 5 6  | 
						mkdir lambda_package cd lambda_package # ここにlambda_function.pyファイルを配置しておく pip3 install requests -t . # カレントディレクトリでも、zip化できるんだ・・・。 zip -r lambda_function.zip .  | 
					
設定画面のlambdaレイヤー(共通ライブラリ)に、有志が公開しているarn指定でも行けた!
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p39-requests:19
Slack API を使って、投稿するにはWebhook URL(APIキー付き投稿URL)を使う
投稿したいチャンネルを選んで、WebHookの生成をすれば、簡単に取得できる。
Urlsリストを増やしたら、タイムアウトしたので、3秒から最大の15分に変更
だいたいSSL証明書のチェックが1秒かかる感じ。
Lambdaのタイムアウトを最大が15分(900秒)なので、900サーバくらいまで行けそう。
Webhook URL(APIキー付き投稿URL)は、ハードコーディングでもいいけど、awsなのでsecret managerを使ってみよう。
1. Secretmanagerにslack apiのSLACK_WEBHOOK_URLを保存する。キー名は同じSLACK_WEBHOOK_URL
2. IAMで、lambdaがアクセスできるようにポリシーを生成(LambdaSecretsManagerAccessPolicyPostSlack)して、許可するarnを指定する
3. lambdaを新規作成すると、ラムダ名-role-xxxxxxxみたいに自動的にロールが生成されるので、ポリシーを付与する。
4. lambda内コーディングで、シークレット名+キー名で、取得する(pythonコード的には、secretは何も書かないでkey指定)
LambdaからSecretManagerの特定のキー&バリューだけアクセス可にするようにarn指定で許可する。
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						{ 	"Version": "2012-10-17", 	"Statement": [ 		{ 			"Sid": "PostSlackSecret", 			"Effect": "Allow", 			"Action": "secretsmanager:GetSecretValue", 			"Resource": "arn:aws:secretsmanager:ap-northeast-1:1234567890:secret:ssl_expired_checker_post_slack" 		} 	] }  | 
					
毎朝9時に、このlambdaを実行するには、cron代わりのEventBridge(CloudWatch Events)を使う
1, コンソールからEventBridgeを選んで、「イベントブリッジルール」で「ルールの作成」をクリック
2. 名前・説明を入力、スケジュールパターンを作成(cron式で入力)
3, テンプレート化されたターゲット→ AWS Lambda Invokeを選ぶと、個々のlambdaが選択できる
4, あとはデフォのまま作成すればOK
facebook、あと一週間しかないけど大丈夫?
| 
					 1 2 3 4 5  | 
						facebook.com SSL certificate expires on 2024-02-15 - SSL更新の必要あり! google.com SSL certificate expires on 2024-04-02 apple.com SSL certificate expires on 2024-05-01 twitter.com SSL certificate expires on 2024-10-31 yahoo.co.jp SSL certificate expires on 2024-12-29  |