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
16
業務効率化したいのに時間がない??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
AWSからLANケーブルへ!パブリッククラウドエンジニアのホームラボ挑戦
da01toyo
0
6
Amazon Connect コンタクトフローの大量移管?!
da01toyo
0
28
AWS ハッカソン体験記~ゲーム開発で得られたAWSスキル紹介~
da01toyo
0
13
UTM (統合脅威管理; FortiGate) on AWSを構築するにはどんなネットワーク設定??
da01toyo
0
180
悪用厳禁! SQLインジェクションやってみた!
da01toyo
0
12
普通のやり方だとできない!?💦 Amazon Connect x Lambdaのレア?な連携のご紹介!
da01toyo
0
16
CI/CD ツール導入で達成した、開発と運用の協力関係強化とストレスフリーなリリースプロセスの実現に迫る!
da01toyo
0
14
CI / CDって具体的にどう動いている??
da01toyo
0
6
監視オペレータはもういらない?~Amazon Connectを用いたスペシャリスト自動手配システムの内製開発~
da01toyo
0
6
Other Decks in Technology
See All in Technology
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
120
Greatest Disaster Hits in Web Performance
guaca
0
300
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
4
1.4k
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
260
マネージャー視点で考えるプロダクトエンジニアの評価 / Evaluating Product Engineers from a Manager's Perspective
hiro_torii
0
190
pool.ntp.orgに ⾃宅サーバーで 参加してみたら...
tanyorg
0
1.4k
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
130
Exadata Fleet Update
oracle4engineer
PRO
0
1.1k
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
360
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
7
2.5k
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
410
Featured
See All Featured
The Invisible Side of Design
smashingmag
302
51k
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
760
Exploring anti-patterns in Rails
aemeredith
2
260
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
130
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
260
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
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