1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Alexa-hostedで lambdaからS3にファイルアップロードをする方法

Posted at

目次

  • きっかけ
  • 事前準備
  • コード

1. きっかけ

Alexa-hostedは独自のAWS環境を用意することなく、スキル開発を進めることが可能です。
また、テンプレートやVScodeの拡張機能も用意されているみたいです。
エンドポイント等も設定せずとも使えるため、複雑なスキル作成には向いていませんが、
簡単なスキル作成にはもってこいですね!!!

lambdaだけでなく、S3,Dynamodbも利用できるみたいです。

AlexaSkillsKitで用意されたS3環境にlambdaがアップロードするやり方が全然乗っていなかったので、
lambdaからS3に対してアップロードする 方法、コードを提供します。

今回は、Alexaと会話終了と共にS3に会話内容を保存するコードを共有します。

2. 事前準備

以下のS3 Storageを押します。

スクリーンショット 2023-12-29 午後7.09.01.png

そうすると、用意されているバケットがありますので、コピーしておきます。

3. コード

いろいろなやり方があると思いますが、私は以下の方法で実現できました。
boto3を使っています。
requirements.txtにはboto3を記載しておきましょう。

また、インテントにEndSessionIntentを追加しています。

※以下はプログラムの一部です。

import boto3
import ask_sdk_core.utils as ask_utils
from ask_sdk_core.handler_input import HandlerInput

# Alexa-hosted skillのためのS3クライアント初期化
s3_client = boto3.client('s3')

# Alexa-hosted skillのバケット名を環境変数から取得
bucket_name = "YOUR_BUCKET_NAME"

class EndSessionHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return ask_utils.is_intent_name("EndSessionIntent")(handler_input)

    def handle(self, handler_input):
        # セッション属性から会話履歴を取得
        session_attr = handler_input.attributes_manager.session_attributes
        conversations = session_attr.get("conversations", [])

        # 現在の日付と時間をファイル名にする
        now = datetime.now()
        file_name = f"Media/トーク履歴/{now.strftime('%Y-%m-%d_%H-%M-%S')}.txt"
        
        # 会話履歴を整形して保存
        formatted_conversations = "\n".join([f"{c['role']}: {c['content']}" for c in conversations])

        # S3に会話履歴を保存
        try:
            s3_client.put_object(
                Bucket=bucket_name,
                Key=file_name,
                Body=formatted_conversations.encode("utf-8")
            )
            speak_output = "スキルを終了します。さようなら。会話履歴は保存されました。"
        except Exception as e:
            speak_output = f"保存に失敗しました: {e}"

        # 会話終了の応答
        return (
            handler_input.response_builder
                .speak(speak_output)
                .response
        )

うん、ちゃんとAlexaとの会話内容がS3にアップロードされていますね!^^

スクリーンショット 2023-12-29 午後7.13.34.png

ご参考までに!!
お読みいただき、ありがとうございました!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?