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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
toyo-da01
September 27, 2024
Technology
23
0
Share
業務効率化したいのに時間がない??OSSとLambdaを用いたツールのスピード開発術
AWS Jr.Champions登壇資料。AWS関連のOSSをLambdaを用いたサーバーレスで実現する方法とユースケースの紹介。
toyo-da01
September 27, 2024
More Decks by toyo-da01
See All by toyo-da01
AWSからLANケーブルへ!パブリッククラウドエンジニアのホームラボ挑戦
da01toyo
0
12
Amazon Connect コンタクトフローの大量移管?!
da01toyo
0
41
AWS ハッカソン体験記~ゲーム開発で得られたAWSスキル紹介~
da01toyo
0
21
UTM (統合脅威管理; FortiGate) on AWSを構築するにはどんなネットワーク設定??
da01toyo
0
260
悪用厳禁! SQLインジェクションやってみた!
da01toyo
0
16
普通のやり方だとできない!?💦 Amazon Connect x Lambdaのレア?な連携のご紹介!
da01toyo
0
24
CI/CD ツール導入で達成した、開発と運用の協力関係強化とストレスフリーなリリースプロセスの実現に迫る!
da01toyo
0
20
CI / CDって具体的にどう動いている??
da01toyo
0
12
監視オペレータはもういらない?~Amazon Connectを用いたスペシャリスト自動手配システムの内製開発~
da01toyo
0
11
Other Decks in Technology
See All in Technology
Claude Codeですべての日常業務を爆速化しよう!
minorun365
PRO
16
16k
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
300
Datadog 認定試験の概要と対策
uechishingo
0
190
エンジニアは生成AIと どのように向き合うべきか? ことばの意味という観点から
verypluming
3
290
Platform engineering for developers, architects & the rest of us (AI agents)
danielbryantuk
0
130
Cloud Run のアップデート 触ってみる&紹介
gre212
0
230
Kaggle未経験社員をメダリストに育てる「AIドラゴン桜」
lycorptech_jp
PRO
0
650
ポスター発表&デモと総括 / Poster Presentations & Demonstrations and Summary
ks91
PRO
0
160
大規模災害時でも高い信頼性を維持するアプリケーション基盤の実現/nikkei-tech-talk46
nikkei_engineer_recruiting
0
120
OpenClawとHermesAgentでAI新入社員を作った話
takanoriyanada
0
140
Anthropic AIネイティブ・スタートアップ構築のプレイブック を理解する
nagatsu
0
220
類似画像検索モデルの開発ノウハウ
lycorptech_jp
PRO
4
1k
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Tell your own story through comics
letsgokoyo
1
930
WCS-LA-2024
lcolladotor
0
610
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
380
The agentic SEO stack - context over prompts
schlessera
0
790
Writing Fast Ruby
sferik
630
63k
Designing Experiences People Love
moore
143
24k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
70
39k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
180
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