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 |