皆さんこんにちは。
秋といったら焼き芋。いとさんです。
さて今回Lambda関数のコードをインポート・エクスポートする方法をご紹介いたします。
はじめに
コードの作成時にメモ帳などのテキストエディタを利用し、コピー&ペーストによるコード移行を行う際、まれにコンテキストエラーが発生する場合があります。このようなエラーは、意図しない文字列の変換や改行コードの違い、隠れた文字やフォーマットの不一致などが原因となることがあり、正常に動作していたコードが突如としてエラーを引き起こすリスクとなります。
このような現象を確実に回避するためには、テストが正常に完了した関数やプログラムを、Zipファイルなどのアーカイブ形式でエクスポートし、必要な環境へインポートする方法が非常に有効です。ファイル単位でのエクスポート・インポートを行うことで、元のコードの構造や文字コード、フォーマットが保全され、手動でのコピペ作業による予期せぬエラーの発生を防止しましょう。
ファンクションコード.zipファイルとAWS SAMファイルの違い
ダウンロード形式には『AWS SAMファイル』『ファンクションコード.zipファイル』の2種類があります。
AWS SAMファイルは「どういうサーバーレスアプリをAWS上で動かしたいか」をひとまとめに記述する設計図です。
コード(zip)本体ではなく、“どんなリソースを、どんな繋がり・設定で”作るかを管理するファイルです
AWS CLI(コマンドラインツール)を使いSAMコマンドを実行すると中身がCloudFormationテンプレートとしてAWSに送信され自動でAWS本番/テスト環境を構築・更新することが出来ます。
(コード例)
# この AWS SAM テンプレートは、関数の設定から生成されました。関数に 1 つ以上のトリガーがある場合は、これらのトリガーに関連付けられている AWS # リソースがこのテンプレートで完全に指定されておらず、プレースホルダ値も含まれていないことに注意してください。AWS Infrastructure # Composer またはお気に入りの IDE でこのテンプレートを開き、他の AWS リソースでサーバーレスアプリケーションを指定するように変更します。 AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An AWS Serverless Application Model template describing your function. Resources: Testlambdafunction: Type: AWS::Serverless::Function Properties: CodeUri: . Description: '' MemorySize: 128 Timeout: 3 Handler: lambda_function.lambda_handler Runtime: python3.13 Architectures: - x86_64 EphemeralStorage: Size: 512 EventInvokeConfig: MaximumEventAgeInSeconds: 21600 MaximumRetryAttempts: 2 PackageType: Zip Policies: - Statement: [] RecursiveLoop: Terminate SnapStart: ApplyOn: None RuntimeManagementConfig: UpdateRuntimeOn: Auto
今回はコードのみを移行する方法として、zipファイルでのダウンロードを行います。
やってみよう
それでは早速やってみましょう。
使用したいLambda関数に移動しファンクションコード.zipをダウンロードを選択します。
ファンクションコード.zipファイルは実行プログラムを、zip形式でまとめた圧縮ファイルであり中身はLambda関数として稼働するコードとなっています。
他のLambdaで再利用・バックアップ・ローカル編集用として使用できます。
今回エクスポートしたzipファイルの中身はこのようになっております。
テキストエディタやVScodeで確認ができるので自分の使用したい関数が出ているか確認しましょう。
import boto3 import json import re import os ses = boto3.client('ses') FROM = os.environ['FROM_ADDRESS'] # SES認証済みアドレス TO = [os.environ['TO_ADDRESS']] # 宛先アドレス(複数可) def lambda_handler(event, context): message = event['Records'][0]['Sns']['Message'] # 特定のリンクを除去(例:全リンク) sanitized_message = re.sub(r'https?://[^\s]+', '[リンク削除]', message) response = ses.send_email( Source=FROM, Destination={'ToAddresses': TO}, Message={ 'Subject': {'Data': '[SecurityHub] 検出通知', 'Charset': 'UTF-8'}, 'Body': {'Text': {'Data': sanitized_message, 'Charset': 'UTF-8'}} } ) return { 'statusCode': 200, 'body': json.dumps('Email sent') }
zipファイルがダウンロードされますのでこれをLambda関数でインポートします。
インポートしたいLambda関数に移動しアップロード元>zipファイルを選択します。
アップロードを押下し使用したいzipファイルを選択します。
これでLambda関数のコードをインポート・エクスポートが完了しました。
最後に
検証環境と本番環境といった異なる環境間で同じコードを使用する場合は、このZipファイルによるパッケージング・移行機能の活用が非常に重要です。こうした工夫を取り入れることで、環境ごとの差異に起因する不具合を未然に防ぎ、安定した運用体制を構築することができます。
コードの移行や環境を跨いだ運用に際しては、是非この方法を取り入れ、より安全かつ効率的な開発・検証を実現しましょう。