継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS Lambda + Go で初歩的なミスをまとめる

タダです.

AWS Lambda を Go で書くことを久々にやっていると,そもそも初歩的なミスでコードを実行するとことまで至るのに時間がかかってしまいました.そのため,備忘録的に何をしたのかをまとめていきます.

ハンドラーの指定

Lambda ハンドラーの指定はビルド後の実行可能なバイナリファイル名を指定する必要があります.適当な名前にしておくとエラーになるため,適宜修正します.

ローカル環境が M1 で発生したエラー

コードを zip でアップロード後にテストを実行したら, fork/exec /var/task/main: exec format error: PathError というエラーが発生しました.ハンドラーの指定も合っているのになぜ?と思って調べたら M1 環境だと zip ファイルにする前のビルドで気をつけるべきことがありました. GOARCH=amd64をつけてビルドをする必要があり,ビルド後に zip ファイル化してテストしたらエラーが発生せずに通りました.

$ GOARCH=amd64 GOOS=linux go build ./main.go
$ zip main.zip ./main

まとめ

AWS Lambda を Go で動かす時にやった初歩的ミスとその対処をまとめました.

2022年の振り返り

タダです。

2022年も終わりなので,今年の振り返りを行ってきます.

目標の振り返り

まずは,年始に立てた目標を振り返ってみます.3つ達成しました.

No. 目標概要 アクション 結果
1 読み手を意識するアウトプット 月間のPV数を平均5,000超えを目指す
2 AWS認定資格を取得する Bigdata Speciality が今年でなくなるため Data Analytics Specialty を取得する
3 CKAD/CKA を受験する 昨年受験のチケットを買ったけど受けてないから...
4 コードで何かしらチャレンジする 個人的に Go が気になっててちまちま勉強しているので何かしらのチャレンジをしていきたい
5 SRE のロードマップを引いて取り組む 昨年SLO/SLI/エラーバジェットの策定や運用をやったが今後の取り組みのロードマップを引いて継続的に取り組みたい

転職してメンタルやられたりしていろんなやる気が落ちたときもあったけど,なんとか元気にやっています.が,仕事ばかりでチャレンジが過去数年で見ても少なかった気がするため,不完全燃焼感があります.来年はやる気がまったくないって期間を極力少なくして今年の悔しい気持ちを変えていきたいです.

アウトプットの振り返り

ブログ

今年も PV 数は5000以上を目標にして続けてきていたのですが,7月以降は安定的に突破するようになりました,来年は月平均6000 PV 以上を目標にさらに多くの人に見てもらえるようなブログにしていけたらと思います.今年は56記事を書きました(この記事のあとに56記事目を公開します).

PV 数
1 4310 pv
2 4588 pv
3 5567 pv
4 4159 pv
5 4137 pv
6 7695 pv
7 5150 pv
8 5569 pv
9 5604 pv
10 5761 pv
11 6075 pv
12 5644 pv(12/29時点)

読者数と Twitter のフォロワー数

読者数と Twitter のフォロワー数の推移も増えているのでいい傾向かと思います.来年も自分を知ってもらって興味持ってもらえる方を増やすようにアウトプットをやっていきます.

読者数 Twitter フォロワー 数
107(5人増) 732(110人増)

登壇

今年はできませんでした...来年チャレンジできるタイミングでやってみたいな.

Podcast の自分たちの番組作り

諸々の事情やメンバーとの間で相談して今年の途中で番組を終了することにしました.続けられたら良かったけど、終わらせるという判断をメンバーでできたのはよかったです.継続って難しい...

まとめ

2022年の一年の振り返りました.今年関わってくれた皆さん本当にありがとうございました,来年もよろしくお願いします!2023年の抱負の記事も書いていきます.

過去の振り返り

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

Athena のクエリ結果をダウンロードした CSV が文字化けした時の対処

タダです.

Athena のクエリ結果をダウンロードした CSV ファイルで文字化けしていました.その時の対処をまとめます.

文字化けの原因

ダウンロード後のファイルが文字化けした原因は, クエリ結果を暗号化 の選択で CSE_KMS を選択していたためでした.KMS キーを使って復号するために SDK でのスクリプトやツールを作成する必要があります.

ただ,今回の要件でクライアントサイドで復号化する必要がなかったので, SSE_KMS に変更したところ文字化けがなくなりました.

まとめ

Athena のクエリ結果をダウンロードしたファイルで文字化けした際の原因と対処をまとめました.

KMS を利用をしている IAM ロールを抽出する

タダです.

KMS を利用して暗号化や復号化をしている IAM ロールを調査しようと思い,CloudTrail のログから Athena で抽出するクエリを書くことがありました.この記事で備忘録としてまとめます.

抽出用のクエリ

抽出するためのクエリとして以下を実行しました.なお,CloudTrail ログのテーブルはドキュメントに沿って作りました.

SELECT userIdentity.sessioncontext.sessionissuer.arn as rolearn,
    eventname,
    requestparameters
FROM "hoge"."cloudtrail_logs_pp" t
    CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE eventsource = 'kms.amazonaws.com'
    AND unnested.resources_entry.ARN LIKE '%arn:aws:kms:ap-northeast-1:123456789010:key/xxxx-xxxx-xxxx-xxxx-xxxx'
    AND useridentity.type != 'AWSService'
    AND useridentity.type != 'arn:aws:iam::123456789010:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_AdministratorAccess_xxxx';    

resources カラムではドキュメントを参照し,CROSS JOIN UNNESTで配列のネストを解除しました.加えて,AWS サービスから KMS 呼び出しや IAM Identity Center を利用している場合にはその IAM ロールを除外しました.

抽出結果

抽出した結果は次のような形ででます.rolearn が KMS を使っている IAM ロールです.eventname が使っている KMS の API で,requestparameters がリクエストパラメーターにあたります.

rolearn   eventname   requestparameters
arn:aws:iam::123456789010:role/hoge01   GenerateDataKey {"encryptionContext":{"aws:s3:arn":"arn:aws:s3:::hoge/xxx"},"keyId":"arn:aws:kms:ap-northeast-1:123456789010:key/xxxx-xxxx-xxxx-xxxx-xxxx","keySpec":"AES_256"}
arn:aws:iam::123456789010:role/hoge02   GenerateDataKey {"keySpec":"AES_256","encryptionContext":{"aws:s3:arn":"arn:aws:s3:::hoge/xxx"},"keyId":"arn:aws:kms:ap-northeast-1:123456789010:key/xxxx-xxxx-xxxx-xxxx-xxxx"}
arn:aws:iam::123456789010:role/hoge03   GenerateDataKey {"keyId":"arn:aws:kms:ap-northeast-1:123456789010:key/xxxx-xxxx-xxxx-xxxx-xxxx","encryptionContext":{"aws:s3:arn":"arn:aws:s3:::hoge/xxx"},"keySpec":"AES_256"}

まとめ

Athena で CloudTrail ログから KMS の利用している IAM ロールを抽出してみました.

アカウント跨ぎでの CloudTrail のログを Athena で検索する

タダです.

AWS のマルチアカウント運用を行っていると,各システムアカウントのログをログ管理用アカウントに集約して管理することがあると思います.今回はログ集約アカウント(この記事ではアカウント B とします)に対して別の AWS アカウント(こちらはアカウント A とします)から Athena でクエリを行った時の備忘録記事です.

事前準備

まず事前準備としてアカウント B 側で以下の作業を行います.

  • S3 バケットポリシー更新
  • Glue のデータカタログポリシー変更
  • S3 オブジェクト所有者の変更

S3 バケットポリシー更新

CloudTrail ログが格納されたバケットポリシーを更新します.以下の定義を追記して更新しました.

        {
            "Sid": "Policy_For_CrossAccount_GetObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウントA]:root"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::[ログバケット名]",
                "arn:aws:s3:::[ログバケット名]/*"
            ]
        }

参考情報

docs.aws.amazon.com

Glue のデータカタログポリシー変更

Athena で使う Glue のデータカタログには以下のポリシーを設定しました.

{
  "Version" : "2012-10-17",
  "Statement" : [ {
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::[アカウントA]:root"
    },
    "Action" : "glue:*",
    "Resource" : [ "arn:aws:glue:ap-northeast-1:[アカウントB]:catalog", "arn:aws:glue:ap-northeast-1:[アカウントB]:database/*", "arn:aws:glue:ap-northeast-1:[アカウントB]:table/*" ]
  } ]
}

参考情報

docs.aws.amazon.com

S3 オブジェクトの所有者の変更

デフォルトの設定ですと,オブジェクトの所有者は aws_cloudtrail_ap-northeast-1 になっていて,Athena でクエリを行っても権限不足のエラーが出たのですが,S3 のオブジェクト所有者の変更を行いました.これを行うことで設定変更後以降のオブジェクトの所有者は アカウントの管理者の名前に変更されます.

Athena 実行アカウントの設定

次にアカウント A 側の設定です.アカウント A 側で次の設定を行いました.

  • Athena 実行ユーザーへの権限追加
  • Athena のデータソースの追加
  • Athena のクエリ実行ログ出力先の追加

Athena 実行ユーザーへの権限追加

アカウント A での実行ユーザー権限を追加します.検証目的だったこともあり,自分の設定では IAM Identity Center の Administrator ロールを使っていたのですが,そこにクロスアカウント用の権限を追加しました(本来は別ロール作るべきですが,面倒くさがりその辺をしてませんでしたmm).

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "glue:*",
            "Resource": [
                "arn:aws:glue:ap-northeast-1:[アカウントB]:catalog",
                "arn:aws:glue:ap-northeast-1:[アカウントB]:database/[データベース名]",
                "arn:aws:glue:ap-northeast-1:[アカウントB]:table/[テーブル名]/*"
            ]
        }
    ]
}

Athena のデータソースの追加

Athena のデータソースに S3 - AWS Glue Data Catalog でアカウント B の情報を埋めていきます.

Athena のクエリ実行ログ出力先の追加

Athena のクエリ実行ログ出力先の追加をします.Athena V2 になってから使うのが初めてだったためこの設定も必要でした.

Athena の実行

以上の設定をして CloudTrail のテーブル作成を行ってクエリ発行したら,CloudTrail のログを見えました.

まとめ

Athena のアカウント跨ぎでのクエリ実行を行ったので備忘録にしました.