Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
業務効率化したいのに時間がない??OSSとLambdaを用いたツールのスピード開発術
Search
toyo-da01
September 27, 2024
Technology
0
8
業務効率化したいのに時間がない??OSSとLambdaを用いたツールのスピード開発術
AWS Jr.Champions登壇資料。AWS関連のOSSをLambdaを用いたサーバーレスで実現する方法とユースケースの紹介。
toyo-da01
September 27, 2024
Tweet
Share
More Decks by toyo-da01
See All by toyo-da01
Amazon Connect コンタクトフローの大量移管?!
da01toyo
0
5
AWS ハッカソン体験記~ゲーム開発で得られたAWSスキル紹介~
da01toyo
0
8
UTM (統合脅威管理; FortiGate) on AWSを構築するにはどんなネットワーク設定??
da01toyo
0
37
悪用厳禁! SQLインジェクションやってみた!
da01toyo
0
5
普通のやり方だとできない!?💦 Amazon Connect x Lambdaのレア?な連携のご紹介!
da01toyo
0
11
CI/CD ツール導入で達成した、開発と運用の協力関係強化とストレスフリーなリリースプロセスの実現に迫る!
da01toyo
0
8
CI / CDって具体的にどう動いている??
da01toyo
0
2
監視オペレータはもういらない?~Amazon Connectを用いたスペシャリスト自動手配システムの内製開発~
da01toyo
0
4
優良な技術サイトを「お気に入り」で終わらせないためのWebアプリケーション開発
da01toyo
0
3
Other Decks in Technology
See All in Technology
論文紹介:LLMDet (CVPR2025 Highlight)
tattaka
0
220
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
140
BrainPadプログラミングコンテスト記念LT会2025_社内イベント&問題解説
brainpadpr
1
180
PHPでWebブラウザのレンダリングエンジンを実装する
dip_tech
PRO
0
220
なぜ私はいま、ここにいるのか? #もがく中堅デザイナー #プロダクトデザイナー
bengo4com
0
1.2k
OPENLOGI Company Profile for engineer
hr01
1
33k
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
150
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
150
フィンテック養成勉強会#54
finengine
0
200
ドメイン特化なCLIPモデルとデータセットの紹介
tattaka
1
340
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
380
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
2
330
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
500
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
KATA
mclloyd
30
14k
How to Ace a Technical Interview
jacobian
277
23k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Adopting Sorbet at Scale
ufuk
77
9.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Transcript
/ 2024/09/27 Jr. Chamipions Meetup LTs 豊岡大地 業務効率化したいのに時間がない?? OSSとLambdaを用いたツールのスピード開発術 少しマニアックな内容になってしまったかもしれません
/ /14 ―― Agenda ―― 0 01. 自己紹介 02. 業務効率化の課題点
03. 今回の業務効率化の契機 04. 技術Tipsの紹介 投影画面だとフォントが小さいので資料もご確認ください
/ /14 ―― 現場で転がっている業務効率化できる数々… ―― 2 自社業務を進めていく中で、 反復的な作業/非効率な進め方を矯正する効率化に取り組んでいる方も多いのではないでしょうか? 解決策はツールには限りませんが、自社業務の効率化ツールは多くのリターンが得られます。 +若手エンジニアの技術的な育成機会創出にもつなげることができます。
弊社の実績例)エスカレーション効率化、設定値の大幅変更など 一方でメリットだけでなく、下記のようなデメリットを見る機会も増えてきました ✓ 自社業務の効率化であるため、優先度がどうしても下がってしまいがち ✓ ツールの運用(異動などによる)の体制がしっかりと組めていない
/ /14 ―― 今回の発表対象とした業務効率化 ―― ある日の日常… Aさん:「今月のクラウド使用料やたら高い!なぜだ??」 Bさん:「稼働し続けているリソースがある!」 ⇒定期的な棚卸しをしたいものの、、 勝手にリソースを削除するとトラブル/インシデントに繋がる可能性も、、
3
/ /14 ―― 弊社の検証環境事情 ―― 弊社の検証環境では、、 常時30名以上が利用する 習熟や案件検証も兼ねたAWS環境 × コスト肥大化
リソース数上限管理 案件のフェーズによって、アカウントを切り替えます。 したがって、時期によっては削除されたら困るものもあり、棚卸しにもヒアリングなどが必要 4
/ /14 ―― 弊社の検証環境事情 ―― パワー(ヒアリング、周知徹底) を掛けて、棚卸しを実施するものの、、 9ヵ月程度で戻ってしまう、、 縦軸:コスト;横軸:月 5
/ /14 ―― 弊社の検証環境管理のアプローチ ―― 恒久的な対策として、下記の解決策で実施。 ※Control TowerのSandBox OUのAccount Factoryも考えていきたい。
棚卸し面 各種アカウントリソースを確認/削除できるサー バーレスウェブアプリケーションを若手主体で 開発着手(デザインはホワイトペーパーとマネコンをイメージ) コスト把握面 月次開催でコストを振り返る会を開催して、 各種アカウント/サービスのコスト傾向を把握 6
/ /14 ―― 現場で転がっている業務効率化できる数々… ―― 再 自社業務を進めていく中で、 反復的な作業/非効率な進め方を矯正する効率化に取り組んでいる方も多いのではないでしょうか? 解決策はツールには限りませんが、自社業務の効率化ツールは多くのリターンが得られます。 +若手エンジニアの技術的な育成機会創出にもつなげることができます。
弊社の実績例)エスカレーション効率化、設定値の大幅変更など 一方でメリットだけでなく、下記のようなデメリットを見る機会が増えてきました ✓ 自社業務の効率化であるため、優先度がどうしても下がってしまいがち ✓ ツールの運用(異動などによる)の体制がしっかりと組めていない
/ /14 7 ―― やっとお伝えしたいTips!!! ―― 棚卸しアプリケーションでは、下記の要件が面倒、、 すでに似たような内容をOSSで作られている方が、、! 特定リソースの詳細情報取得 提供API:
各種サービスのdescribe系 特定リソースの削除 提供API: 各種サービスのdelete系 OSS awsets (trek10inc/awsets) OSS aws-nuke (ekristen/aws-nuke)
/ /14 ―― OSSをAPIとして構築するには、、? ―― 8 OSSで提供されている形式は、Linux上でのコマンド提供がほとんど、、 awsets ```bash
awsets list -–include ${service} -–profile ${AWS_PROFILE} ``` aws-nuke ```bash aws-nuke -c config.yml --profile ${AWS_PROFILE} ``` なるべくサーバーレスにこだわりたい、、 LambdaのランタイムでBashを選択できるのは次の2つの選択肢があります! 1. Custom Runtime:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html 2. Container Runtime:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html
/ /14 ―― OSSをAPIとして構築するには、、? ―― 9 LambdaでOSSが提供するコマンドを叩いてAPI形式のように構築するには、 下記のロードマップを立てました。 01. Custom
Runtime 02. Container Runtime 03. AWS CLI 04. awsets* 検証なのでLambdaURLでAPI形式としてデプロイ *aws-nukeは無し (別途説明)
/ /14 ―― Custom Runtime ―― チュートリアル通りに一度実施、、! bootstrap #!/bin/sh set
-euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018- 06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06- 01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done function.sh #!/bin/bash function handler () { EVENT_DATA=$1 echo "aws --version" 1>&2 RESPONSE="'${EVENT_DATA}'" echo $RESPONSE } 10 【大まかな手順】 1. Bootstrapをlayerとして登録 2. 使いたいコマンド群を追加layerとして登録 ※容量が多すぎると、一度S3にzipを上げる必要がある 3. function.shをzip化して登録 スクリプト内で新しいコマンドが増えると都度 Layer登録の流れになる。 個人的には、、 開発段階のトライ&エラーとしては△ >&2 でCloudWatchlogsに出力
/ /14 #!/bin/bash function handler () { EVENT=$1 echo "${EVENT}"
>&2 if echo "$EVENT" | jq -e 'has("body")' > /dev/null; then BODY=$(echo "$EVENT" | jq -r '.body') else BODY="$EVENT" fi BUCKET_PREFIX=$(echo ${BODY} | jq -r '.prefix') BUCKETS=¥ $(aws s3 ls | grep ${BUCKET_PREFIX} | awk '{print $3}' | jq -R . | jq -s .) RESPONSE=$(jq -n ¥ --arg status "success" ¥ --argjson buckets "$BUCKETS" ¥ '{"status": $status, "buckets": $buckets}' ) echo ${RESPONSE} | cat } ―― Container Runtime with AWS CLI ―― 11 Container Runtimeは、 新規コマンドはレイヤー登録じゃなくてDockerfileに都度記載追加で良いので効率がよい! Dockerfile FROM public.ecr.aws/lambda/provided:alami.2024.09.17.15 RUN yum update -y && ¥ yum install -y unzip wget jq && ¥ wget "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" ¥¥ -O "awscliv2.zip" && ¥ unzip awscliv2.zip && ¥ ./aws/install COPY bootstrap /var/runtime/bootstrap COPY function.sh /var/task/function.sh RUN chmod +x /var/runtime/bootstrap ¥ && chmod +x /var/task/*.sh CMD ["function.handler"] function.sh 【大まかな手順】 1. DockerImageをビルドしてECRにPush 2. Lambdaで更新 ※bootstrapは同じでOK そのまま出力結果を返すと、 APIとしての出力形式は担保されない、、 echoの結果をawk/jqコマンドで整形して あげて返すと、従来の返り値に! #awk, jqの応用編みたいな書き方に、、 内部と外部キックでInputの 渡され方が異なるのでvalidation
/ /14 ―― Container Runtime with AWS CLI ―― 11
Container Runtimeは、 新規コマンドはレイヤー登録じゃなくてDockerfileに都度記載追加で良いので効率がよい! curl -X POST ${url} -H "Content-Type: application/json" -d '{"prefix": “parameter"}'
/ /14 FROM public.ecr.aws/lambda/provided:alami.2024.09.17.15 RUN yum update -y && ¥
yum install -y unzip wget jq RUN wget "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" ¥¥ -O "awscliv2.zip" && ¥ unzip awscliv2.zip && ¥ ./aws/install RUN wget “https://github.com/trek10inc/awsets/releases/${v}.tar.gz” ¥¥ -P /usr/local/src && ¥ tar xvzf /usr/local/src/${v}.tar.gz -C /usr/bin COPY bootstrap /var/runtime/bootstrap COPY function.sh /var/task/function.sh RUN chmod +x /var/runtime/bootstrap ¥ && chmod +x /var/task/*.sh CMD ["function.handler"] ―― Container Runtime with awsets ―― 12 いよいよ本題の要件を満たせるOSS提供のコマンドを実施、、! Dockerfile #!/bin/bash CMD="awsets" export HOME=/tmp export XDG_CACHE_HOME=/tmp/.cache CACHE_DIR="${XDG_CACHE_HOME}/awsets" mkdir -p ${CACHE_DIR} function handler () { EVENT=$1 echo "${EVENT}" >&2 if echo "$EVENT" | jq -e 'has("body")' > /dev/null; then BODY=$(echo "$EVENT" | jq -r '.body') else BODY="$EVENT" fi SERVICE=$(echo ${BODY} | jq -r '.prefix') RESOURCES=$(${CMD} list --include ${SERVICE}) RESPONSE=$(jq -n ¥ --arg status "success" ¥ --argjson resources "$RESOURCES" ¥ '{"status": $status, "resources": $resources}' ) echo ${RESPONSE} | cat } function.sh 新しいコマンド(awsets)を加える内容もDockerfileに 記述してImageを再プッシュするだけで効率が良い! 外部コマンドを入れると、 XDG_CACHE_HOMEを定義しないといけないみたい
/ /14 ―― Container Runtime with awsets ―― 12 先ほどの少ないコード量で情報粒度が細かい内容を取得できた!
curl -X POST ${url} -H "Content-Type: application/json" -d '{"prefix": “parameter"}' AWS Certificate Manager AWS Code Pipeline
/ /14 ―― Container Runtime with aws-nuke ―― 13 aws-nukeはconfig.ymlを事前に用意する必要があります!
```bash aws-nuke -c config.yml --profile ${AWS_PROFILE} ``` ⇒sedコマンドを用いて、 あらかじめの予約語をInputParamaterと置換を考えましたが、 一旦保留することにしました、、
/ /14 ―― まとめ ―― ✓ 業務効率化ツールの開発はリターンも大きいですが、優先度やその後の運用に 課題感もあります。 ✓ 今回はAWSの検証環境の棚卸し業務効率化に着目した、API作成でOSSを利用
した工数削減のアプローチを共有しました。 ✓ 技術的にはLambdaをランタイムBashにするには、 CustomとContainerがあり、個人的には開発効率的に後者がおすすめです! 【残っている課題感】 • Lambda URLからのAPI Gateway vs ALBデプロイ • Lambda URL経由からだと、処理がすごく遅いのでメモリなどの最適化を検討、、 14