初めに
閲覧いただきありがとうございます。
突然ですが、私は最近クラウド未経験からAWSシステム担当のエンジニアに転職を果たしました!
そんな私ですが、コスト削減として社内の研修環境の不要なEC2削除をするために
EC2の情報を取得するLambda関数を作成するお仕事をする機会がありました。
そこで、かなり沼った&あまりクリティカルな記事がネットになかったので備忘も兼ねて記事にしたいと思います。
最終的には結構複雑なことをするLambda関数を作成したいのですが、
段階的に、まずはEC2の情報を単純に引っ張ってくるだけのLambda関数を作りたいと思ったので
今回のゴールとしてはそれを実施し問題なく取得した情報を確認できることとしたいと思います。
ちなみに私のレベルは以下程度で、かなり初学者的な詰まり方をしているので、
その前提で温かく読んでいただければと思います。。
・AWS実務経験ほぼなし
・SAAは2022年10月取得済み
・VPCやLambdaの機能は机上で学習しているが、具体的な挙動をきちんと理解できていない
実施すること
やること自体は非常に簡単です。
ランタイムPython3.9で以下のようなLambda関数を作成します。
boto3というライブラリでEC2の情報を取得することができるみたいです。(こちらの記事を参考にしました)
import json
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
response = ec2.describe_instances()
return json.dumps(response, default=str)
あとは関数URLから関数の実行結果を確認するだけです。
たったこれだけなのですが、私はたいそう沼ったので
気を付けるべきポイントを記載していきます。
沼りポイントその①:関数URLの仕組みとreturnの型
私は最初return文がなく、print(response)としていました。
Lambdaの関数URLはLambda関数のレスポンスを解析して最終的なHTTPレスポンスを作成します。
Lambda 関数のレスポンスとは return で返される値です。
そのため、print 文で文字列を出力しても関数 URL では値を取得できません。
ここは単純にlambdaの仕組みを理解できていなかっただけなので
沼でもなんでも無いのですが、一応共有で、、、
沼りポイントその②:describe_instancesの返り値はdict型
当初responseをそのままreturnしていたのですが、エラーが返ってきてうまくいきませんでした。
boto3のドキュメントをきちんと確認したところ、dict型で返ってくるとのことでしたので
無理やりjsondumpsで出力して事なきを得ました。
沼りポイントその③:EC2の情報取得はEC2に直接取りに行くわけではない
ここに気付くのが一番時間がかかり、またネットにもクリティカルな記事がなかったので苦戦しました。
当初、EC2の情報が欲しいのだからlambdaを対象EC2があるVPCに紐づけて
そこからlambdaを実行すればええやろと思い、VPCに接続させていたのですが、
実際は下図のようにAWS管理のEC2 APIにアクセスして対象EC2の情報を取りに行くというものでした。
VPC Lambdaはネット環境へのアクセスができないので
vpcに紐づけるならエンドポイントを作成するかNAT Gatewayを作るかしないといけないのですが
そもそもVPCに紐づける必要がないので紐づけを解除してタイムアウト値を少し伸ばすことで
問題なくEC2の情報を取得することができました。
最後に
AWSのサービスの知識はある程度資格勉強でついたかなと思っていましたが、
実際に実装しようとしたときには細々とした不明点がいくつも出てきて、
それらが積み重なって沼になるという一連のシークエンスを体験できました。
(そもそも関数URLで実行結果を確認するのも今考えたら変ですね、、、)
今後も資格勉強を継続しつつ実装業務を経てこういった不明点を減らしながら
AWSエンジニアとしてレベルアップしていきたいと思います。