asdf で terraform 複数バージョン管理

asdf で terraform 複数バージョン管理


terraform はバージョンアップ頻度が高く、
プロジェクトによってバージョン差分が生じるので
複数バージョンを管理できると運用がスムーズです。

続きを読む

SAM プロジェクトで管理する API Gateway のアクセスログを有効化する


概要

SAM プロジェクトで管理する API Gateway について
AWS Config rule: api-gw-execution-logging-enabled に対応すべく、
アクセスログを有効化した際にハマった話です。

Events.*.Type = Api で作成した API Gateway では SAM 上でアクセスログ有効化の設定ができません。

どのようにしたら API Gateway のアクセスログ有効化できるか調査しました。

続きを読む

SAM テンプレートに既存リソースをインポートする手順 - IAM Role 編 -


以前は CloudWatch LogGroup をインポートしましたが
今回は IAM Role をインポートの設定例です。

基本手順は CloudWatch LogGroup と同様ですが、
異なる部分だけ記載します。

手順

CloudFormation のテンプレート取得し template.yml にインポートしたいリソースを追記

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
Resources:
...

CWLogRole:
DeletionPolicy: Retain
Type: AWS::IAM::Role
Properties:
RoleName: xxx-Bot-Stack
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: apigateway.amazonaws.com
Action: sts:AssumeRole
Description: Allows API Gateway to push logs to CloudWatch Logs.
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs

API Gateway のアクセスログ管理用ロググループへログを配信する IAM Role をインポートします。

続きを読む

SAM テンプレートに既存リソースをインポートする手順 - CloudWatch Logs 編 -


手順

CloudFormation のテンプレート取得

既にデプロイ済みの SAM プロジェクトは CloudFormation に Stack が作成されています。
その Template タグで template の内容をローカル環境で template.yml で保存しましょう。
保存先はどこでも良いです。

template.yml にインポートしたいリソースを追記

1
2
3
4
5
6
7
8
9
10
11
12
13
...
Resources:
...

# インポートしたいリソースを追記
# API Gateway の アクセスログ管理用ロググループ
ApiGatewayAccessLogGroup:
Type: AWS::Logs::LogGroup
# NOTE: リソースを作成せず、Stack にインポートする為の設定
# see: https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html
DeletionPolicy: Retain
Properties:
LogGroupName: /aws/apigateway/xxx-Bot-Stack

今回は API Gateway のアクセスログ管理用ロググループをインポートします。
DeletionPolicy: Retain としているのは、リソースを作成せず、Stack にインポートする為です。

続きを読む

fix: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device

RPi 4B で以下エラーで詰まった時の備忘録です。

1
2
3
$ pip3 install xxx

Could not install packages due to an EnvironmentError: [Errno 28] No space left on device

一時的に tmp ディレクトリを指定してからインストールを再度実行することで回避してみます。

1
2
3
4
$ mkdir $HOME/tmp
$ export TMPDIR=$HOME/tmp

$ pip3 install xxx

これでうまくいきました ♪

以上
参考になれば幸いです。

AWS Savings Plans Coverage API 実行時に DataUnavailableException エラーが発生する


概要

AWS Savings Plans Coverage API 実行時に DataUnavailableException エラーが発生しました。

1
2
3
$ aws ce get-savings-plans-coverage --time-period Start=2023-05-31,End=2023-06-01 --group-by Type=DIMENSION,Key=INSTANCE_TYPE_FAMILY Type=DIMENSION,Key=REGION Type=DIMENSION,Key=SERVICE

An error occurred (DataUnavailableException) when calling the GetSavingsPlansCoverage operation:

発生する条件を AWS サポートに確認しました。

サポートの回答

「対象期間について Savings Plans 適用対象サービスを使用していない場合、上記エラーが発生する」
とのこと。

Cost Explorer で確認

Cost Explorer で Savings Plans > Coverage report にも以下メッセージがありました。

No savings plans coverage data was returned for this time period. Please adjust the time period or filters if this seems incorrect.」

まとめ

Savings Plans カバレッジ取得時に DataUnavailableException エラーが発生する
= Savings Plans 適用対象サービスを使用していない
= Savings Plans を買う必要がない

ということでした。

以上
参考になれば幸いです。

Raspberry Pi 4 Model B に google-cloud-speech インストール時にハマったこと

Raspberry Pi 4 Model B に google-cloud-speech インストール時にハマったこと

Raspberry Pi 4 Model B の環境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cat /etc/os-release

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

$ cat /proc/version

Linux version 5.10.103-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022

$ uname -a

Linux pi4b-talk 5.10.103-v8+ #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022 aarch64 GNU/Linux

google-cloud-speech インストール

1
2
$ sudo apt-get install -y libffi-dev libssl-dev
$ pip3 install grpcio google-cloud-speech

「デバイスに空き領域がありません」エラーが発生した場合

1
Could not install packages due to an EnvironmentError: [Errno 28] デバイスに空き領域がありません

一時的に tmp ディレクトリを指定してからインストールを再度実行することで回避できます。

1
2
$ mkdir $HOME/tmp
$ export TMPDIR=$HOME/tmp

それでも以下エラーが出ました。

1
2
3
$ pip3 install grpcio google-cloud-speech

Command "python setup.py egg_info" failed with error code 1 in /home/pi/tmp/pip-install-qocpvlue/grpcio/

デフォルトの pip でなく
python3 で https://bootstrap.pypa.io/get-pip.py 実行し
pip をインストールし直し、再チャレンジしてみます。

1
2
3
4
5
6
7
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
$ pip --version

pip 23.1.2 from /usr/local/lib/python3.7/dist-packages/pip (python 3.7)

$ pip install --upgrade google-cloud-speech

以上で成功しました。

参考になれば幸いです。

Raspberry Pi に USB スピーカーを接続しテキストを音声変換しお話しさせる

Raspberry Pi に USB スピーカーを接続しテキストを音声変換しお話しさせる


概要

Raspberry Pi と OpenAI を通じて英会話しよう!という動機から
最初の一歩として USB スピーカーから指定したテキストを読み上げる様にしてみました。

環境

Marstudy Raspberry Pi 4 Model B Starter キット
プリインストールされた Raspbian OS を利用しています。

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/os-release

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

usb スピーカー接続

サンワサプライ コンパクト PC スピーカー MS-P08UBK を利用します。

自分が購入した 2023-05-10 は ¥857 でした。

接続先の USB スピーカーのカード番号・デバイス番号を確認

1
2
3
4
5
6
7
8
9
10
11
12
$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 1: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones]
サブデバイス: 8/8
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
サブデバイス #7: subdevice #7
  • カード番号 = 1
  • デバイス番号 = 0

音がスピーカーから聞こえるかテスト

1
2
3
4
// plughw:<カード>,<デバイス>
$ speaker-test -D plughw:1,0 -t wav

// Ctrl+c で中断し終了します

python スクリプトから再生してみる

1
$ pip3 install pygame
1
$ curl https://www.soundjay.com/buttons/button-3.mp3 -o button.mp3
  • play_sound.py
1
2
3
4
5
6
7
8
9
10
11
12
13
import pygame


def play_sound_file(file_path):
pygame.mixer.init()
pygame.mixer.music.load(file_path)
pygame.mixer.music.play()

while pygame.mixer.music.get_busy() == True:
continue

if __name__ == "__main__":
play_sound_file('button.mp3')

以下実行し mp3 が再生されることが確認できます。

1
$ python3 play_sound.py

テキストから音声ファイルを作成し読み上げる

  • speech.py
1
2
$ pip3 install gTTS
$ pip3 install pydub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play
import sys


def speechja(stext):
tts = gTTS(stext, lang="ja")
tts.save("/tmp/out.mp3")

sound = AudioSegment.from_mp3("/tmp/out.mp3")
play(sound)


if __name__ == "__main__":
msg = "はい、お元気ですか?"
speechja(msg)

以下実行しスピーカーから「はい、お元気ですか?」と再生されます。

1
$ python3 speech.py

以上
参考になれば幸いです。

次回はマイクから音声認識させる設定を執筆したいと思います。

alpine イメージに awscli をインストールする


alpine イメージで awscli をインストールする際の備忘録です。

1
2
3
4
5
6
7
RUN apk add --no-cache \
python3 \
py3-pip \
&& pip3 install --upgrade pip \
&& pip3 install --no-cache-dir \
awscli \
&& rm -rf /var/cache/apk/*