ã¯ããã«
ããã«ã¡ã¯ïŒKDDIã¢ã€ã¬ããã§ã26æ°åã®å¶æ¥ãšããŠæ¥ã
å匷äžã®çžç°ã§ãã
ç§ã¯æç³»åºèº«ã§ãITæ¥çãã¯ã©ãŠããæªçµéšã®ç¶æ
ãããã®äžçã«å
¥ããŸããã
çŸåšã¯å¶æ¥ã®æ°åãšããŠãåè«ãžã®ååžãå¶æ¥ã®åºç€ãOJTã§åŠã¶ã ãã§ãªããAWSãGoogle Cloudãäžå¿ã«æè¡ã®å匷ãé²ããŠããŸãã
ãããªäžãåŠç¿ãç¶ããŠããŠäžã€æ©ã¿ããããŸããã
ãå匷ããå 容ããçµå±å¿ããŠããŸãã
ãšããåé¡ã§ãã
ãã®å Žã§ã¯çè§£ããã€ããã§ããæ°æ¥åŸã«ã¯ææ§ã«ãªã£ãŠããã
è³æ Œå匷ãããŠããæ¹ãªããäžåºŠã¯çµéšããããšãããã®ã§ã¯ãªãã§ããããã
ããã§ã
ãåŠç¿ããå 容ãç»é²ãããã埩ç¿ãã¹ãæ¥ã«èªåã§SlackããæããŠãããä»çµã¿ãäœããªããïŒã
ãšæã£ãããšããä»åã®Botéçºã®ã¹ã¿ãŒãã§ããã
ãããŠä»åã¯ããšã³ãžãã¢ã®åæãªã©ã«äŸé Œããã®ã§ã¯ãªããéãšã³ãžãã¢ã§ããèªåèªèº«ã§èšèšã»æ§ç¯ããŠã¿ãããšã«ããŸããã
ãŸãäœã£ããã®
ä»åäœã£ãã®ã¯ãSlackäžããåŠç¿å
容ãç»é²ãããšããããããèšå®ããåŸ©ç¿æ¥ã«èªåã§Slackãžéç¥ããŠãããBotã§ãã
ããšãã°Slackã§ã
/study S3ãšEBSã®éã
ãšå ¥åãããšã
ç»é²ããŸããïŒ
åŠç¿å
容ïŒS3ãšEBSã®éã
埩ç¿äºå®ïŒ
1åç®ïŒç¿æ¥
2åç®ïŒ3æ¥åŸ
3åç®ïŒ7æ¥åŸ
4åç®ïŒ30æ¥åŸ
ãšãã圢ã§ç»é²ãããŸãã
ãããŠåŸ©ç¿æ¥ã«ãªããšãBotããã
ð 仿¥ã®åŸ©ç¿ã§ãïŒ
1. S3ãšEBSã®éã
æãåºããŠãããå¿
èŠã«å¿ããŠåŠç¿ã¡ã¢ã確èªããŸãããã
ãšããDMãå±ããŸãã
ä»åã¯ãŸãåæçãšããŠã
1æ¥åŸ â 3æ¥åŸ â 7æ¥åŸ â 30æ¥åŸ
ãšãã埩ç¿ééãèšå®ããŸããã
ä»åŸã¯åççµæãç解床ã«å¿ããŠããã®åŸ©ç¿ééèªäœãå€åãããŠããäºå®ã§ãã
ã·ã¹ãã æ§æ
ä»å䜿ã£ãäž»ãªãµãŒãã¹ã¯ä»¥äžã§ãã
Slack
â
Cloud Run
â
Firestore
Cloud Scheduler
â
Cloud Run
â
Firestore
â
Slack
圹å²ãç°¡åã«æŽçãããšã
| ãµãŒãã¹ | åœ¹å² |
|---|---|
| slack | åŠç¿å 容ã®ç»é²ã»åŸ©ç¿éç¥ |
| Cloud Run | Botã®ããã°ã©ã ãå®è¡ |
| Firestore | åŠç¿å 容ã»åŸ©ç¿æ¥ãä¿å |
| Cloud Scheduler | æ¯æ¥æ±ºãŸã£ãæéã«åŸ©ç¿å¯Ÿè±¡ãç¢ºèª |
| Slack API | BotãããŠãŒã¶ãŒãžDMãéä¿¡ |
ãšããæ§æã§ãã
å®éã«åããŠããåŠçã¯éåžžã«ã·ã³ãã«ã§ãã
åŠç¿å
容ãç»é²ãã
â
åŸ©ç¿æ¥ãèšç®ãã
â
Firestoreã«ä¿åãã
â
æ¯æSchedulerã確èªãã
â
仿¥ãåŸ©ç¿æ¥ã®å
容ãååŸãã
â
Slackãžéç¥ãã
ãšããæµãã§ãã
å®éã«æžããã³ãŒã
ä»åãPythonãšFlaskã䜿ã£ãŠCloud Runäžã§åãããŠããŸãã
ããšãã°Â /study ãå®è¡ããããšãã¯ãSlackããåŠç¿ããŒããåãåããŸãã
@app.route("/slack/study", methods=["POST"])
def study():
user_id = request.form.get("user_id")
topic = request.form.get("text", "").strip()
if not topic:
return "åŠç¿ããŒããå
¥åããŠãã ããã"
today = datetime.now(TOKYO)
ããããåŸ©ç¿æ¥ãèšç®ããŸãã
review_dates = [
today + timedelta(days=1),
today + timedelta(days=3),
today + timedelta(days=7),
today + timedelta(days=30),
]
ãããŠFirestoreãžä¿åããŸãã
db.collection("studies").add({
"user_id": user_id,
"topic": topic,
"created_at": today,
"review_dates": review_dates,
"review_count": 0,
})
äžæ¹ãæ¯æCloud SchedulerããåŒã³åºãããåŠçã§ã¯ãFirestoreã«ä¿åãããããŒã¿ã確èªããŸãã
@app.route("/daily-review", methods=["GET"])
def daily_review():
today = datetime.now(TOKYO).date()
docs = db.collection("studies").stream()
åŸ©ç¿æ¥ãšä»æ¥ã®æ¥ä»ãäžèŽããŠãããããã®ããŒããæœåºããŸãã
for review_date in data.get("review_dates", []):
review_date_jst = review_date.astimezone(TOKYO).date()
if review_date_jst == today:
user_id = data.get("user_id")
topic = data.get("topic")
æåŸã«Slack APIã䜿ã£ãŠDMãéä¿¡ããŸãã
slack_api(
"chat.postMessage",
{
"channel": channel_id,
"text": text,
},
)
ãã¡ããæåãããã®ã³ãŒããæžããããã§ã¯ãããŸããã
ãããä»åäžçªå匷ã«ãªã£ãã®ã¯ãã³ãŒããæžãããšãããåããªãåå ãäžã€ãã€åãåããŠããéçšã§ããã
åœç¶ããããªããšã¯åããªãã£ã
ä»åãèªåã«ãšã£ãŠåããŠã®å®æ§ç¯ã ã£ãããšããããããªãå€ãã®å£ã«ã¶ã€ãããŸããã
1, éãGoogle Cloudãããžã§ã¯ãã«äœã£ãŠãã
æåã®å€§ããªãã¹ã¯ãCloud Shellã§æäœããŠããGoogle Cloudãããžã§ã¯ããšãFirestoreãäœæãããããžã§ã¯ããç°ãªã£ãŠããããšã§ãã
ãã®çµæã
The database (default) does not exist
ãšãããšã©ãŒãçºçããŸããã
åœåã¯ã³ãŒããããããã®ããšæããŸããããåå ã¯ãã£ãšæåã«ãããŸããã
ãããŸèªåãã©ã®ãããžã§ã¯ããæäœããŠããã®ãã
ãšããã¯ã©ãŠãã§ã¯éåžžã«åºæ¬çãªéšåã§ãã
ããã§ã
gcloud config set project ...
ãªã©ã䜿ããå®è¡å¯Ÿè±¡ã®ãããžã§ã¯ããæç€ºçã«ç¢ºèªããéèŠæ§ãåŠã³ãŸããã
2. IAMæš©éãè¶³ããªã
Cloud Runããããã€ããããšãããšã次ã
ã«æš©éãšã©ãŒãçºçããŸããã
Artifact RegistryãCloud LoggingãCloud StorageãFirestoreãªã©ãCloud Runãè£åŽã§ããŸããŸãªGoogle CloudãµãŒãã¹ãšé£æºããŠããããã§ãã
ããã§ãµãŒãã¹ã¢ã«ãŠã³ãã«å¿
èŠãªIAMããŒã«ãäžã€ãã€ä»äžããŠãããŸããã
ãã®çµéšããã
ãCloud Runã䜿ãã
ãšããäžèšã®è£åŽã§ããå®éã«ã¯è€æ°ãµãŒãã¹ãšIAMã«ããèªèšŒã»èªå¯ãé¢ãã£ãŠããããšã宿ããŸããã
AWSã®IAMãè³æ ŒåŠç¿ãšããŠå匷ããŠãããšããšã¯ãçè§£ã®æ·±ãããŸã£ããéããŸããã
å®éã«403ãšã©ãŒãèžããšãIAMã®æå³ãããåãããŸãã
3. Pythonã®ããŒãžã§ã³ã§ã¢ããªãèµ·åããªã
Cloud Runãžã®ãããã€èªäœã¯æåãããã®ã®ãã¢ããªãèµ·åããªãåé¡ãçºçããŸããã
åå ããã°ãã調ã¹ããšãPython 3.14ãšå©çšã©ã€ãã©ãªã®çµã¿åããã«ãããšã©ãŒã§ããã
ããã§Python 3.13ãæç€ºçã«æå®ã
.python-version
ã«ã
3.13
ãèšå®ããããšã§è§£æ±ºããŸããã
ããã§ã¯ã
ããããã€æåïŒã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«åããŠãããã§ã¯ãªãã
ãšããããšãåŠã³ãŸããã
Cloud Runã®ãã°ã確èªããã©ã®ã¬ã€ã€ãŒã§å€±æããŠããã®ããèŠãããšãéèŠã§ããã
4. UTCãšæ¥æ¬æé
Cloud Runäžã§ã
datetime.now()
ã䜿ã£ãŠãããšãããæ¥æ¬æéãšãºã¬ãå¯èœæ§ãããããšã«ãæ°ã¥ããŸããã
ããã§ã
ZoneInfo("Asia/Tokyo")
ãå©çšããŠãæ¥æ¬æéãæç€ºããŸããã
today = datetime.now(ZoneInfo("Asia/Tokyo"))
ã¯ã©ãŠãäžã®ãµãŒããŒã¯ãèªåã®PCãšåãæéèšå®ã§åããŠãããšã¯éããŸããã
ããã¯å®éã«ã¯ã©ãŠãã§ã¢ããªãåãããŠåããŠæèãããã€ã³ãã§ããã
5. Slackã®ãŠãŒã¶ãŒåãšUser IDã¯å¥ç©
Slackãžã®DMéä¿¡ãã¹ãã§ããšã©ãŒãçºçããŸããã
æåã¯ã
@nawata_xxxxx
ã®ãããªSlackäžã®ååãæå®ããŠããŸããã
ãããSlack APIãå¿
èŠãšããŠããã®ã¯ã
UXXXXXXXXXX
ãšããå
éšçãªMember IDã§ãããæ£ããUser IDãæž¡ãããšã§ãç¡äºDMãå±ããŸããã
ç»é¢äžã§ã¯åãããŠãŒã¶ãŒãã«èŠããŠããAPIã§ã¯å¥ã®IDäœç³»ã䜿ã£ãŠããã
ããããAPIãå®éã«è§Šã£ãããããåãã£ãããšã§ããã
ãAIãããã°èª°ã§ãäœãããã ãã§ã¯ãªãã£ã
ä»åã®æ§ç¯ã§ã¯ãAIãããªã掻çšããŸããã
ã³ãŒãçæããšã©ãŒã®èªã¿è§£ããCloud Runã®èšå®ãIAMã®åãåããSlack APIã®å®è£
ãªã©ãå€ãã®å Žé¢ã§AIãšå¯Ÿè©±ããªããé²ããŠããŸãã
ãã®æå³ã§ã¯ã
以åã§ããã°ãšã³ãžãã¢ãžäŸé Œããªããã°äœããªãã£ããã®ããéãšã³ãžãã¢èªèº«ã§äœããå¯èœæ§ã¯ç¢ºå®ã«åºãã£ãŠãã
ãšæããŠããŸãã
ãã ãå®éã«ãã£ãŠã¿ãŠåãã£ãã®ã¯ã
AIã«ãBotãäœã£ãŠããšãé¡ãããã°ãå
šéšåæã«å®æãã
ãšãã話ã§ã¯ãªããšããããšã§ãã
ããšãã°ä»åã ãã§ãã
ã»Cloud Runãšã¯äœã
ã»Firestoreãšã¯äœã
ã»HTTPãªã¯ãšã¹ããšã¯äœã
ã»IAMãšã¯äœã
ã»ãµãŒãã¹ã¢ã«ãŠã³ããšã¯äœã
ã»APIãšã¯äœã
ã»UTCãšJSTã®éã
ã»ãã°ãã©ãèªãã
ãšãã£ãæäœéã®çè§£ã¯å¿
èŠã§ããã
AIã匷åãªã®ã¯ãåãããªãéšåããã®å Žã§èããªãããå®è£ ãŸã§é²ããããããšã ãšæããŸãã
ã€ãŸãAIã«ãã£ãŠããšã³ãžãã¢ãªã³ã°ã®ç¥èãäžèŠã«ãªã£ãã®ã§ã¯ãããŸããã
ãããããåŠã³ãªããäœããããã®ããŒãã«ãåçã«äžãã£ããšãã衚çŸã®æ¹ãè¿ããšæããŠããŸãã
éãšã³ãžãã¢ããèšèšã»æ§ç¯ããåŽããž
ä»åãã®Botãäœããªããã瀟å
ããã¯ãªãã€ãã³ããUNITE DAYãã§èãã話ãæãåºããŸããã
ç¹ã«å°è±¡ã«æ®ã£ãŠããã®ããAIæä»£ã«ããã瀟å
ã®å
補åã«ã€ããŠã®è©±ã§ãã
AIã«ãã£ãŠããããŸã§ãšã³ãžãã¢ãäžå¿ã ã£ãèšèšã»æ§ç¯ã®é åã«ãéãšã³ãžãã¢ãé¢ãããããã«ãªãã
ä»åãèªåèªèº«ããã®äžã€ã®å®äŸã«ãªããã®ã§ã¯ãªãããšæã£ãŠããŸãã
ç§ã¯ã
æç³»åºèº«
ITæªçµéš
2026幎æ°å
ãããŠçŸåšã®è·çš®ã¯ã
å¶æ¥
ã§ãã
ããã§ãAIãšã¯ã©ãŠããµãŒãã¹ãçµã¿åãããããšã§ããŒãããã
èŠä»¶ãèããæ§æã決ããCloud Runãžãããã€ããããŒã¿ããŒã¹ãäœããAPIã飿ºããèªåå®è¡ããã
ãšãããŸã§å®éã«æ§ç¯ããããšãã§ããŸããã
ãã¡ãããããã®ãšã³ãžãã¢ãšåãã¬ãã«ã«ãªã£ããšãã話ã§ã¯ãããŸããã
ããã§ãã
ãéãšã³ãžãã¢ã ããäœããªãããšããå¢çç·ã¯ã確å®ã«èããªã£ãŠãã
ãšæããŠããŸãã
ãšã³ãžãã¢ãå€ãäŒç€Ÿã ãããããéãšã³ãžãã¢ã®å 補åã«ã䟡å€ããã
KDDIã¢ã€ã¬ããã§ã¯ãå€ãã®ãšã³ãžãã¢ãã¯ã©ãŠããAIã®æè¡ã䜿ã£ãŠã客æ§ãæ¯æŽããŠããŸãã
äžæ¹ã§ãå¶æ¥ãã¯ãããšããéãšã³ãžãã¢ãååšããŸãã
ç§ã¯ãAIæä»£ã«ãããŠã¯ãã®éãšã³ãžãã¢å±€ããäŒç€Ÿã®æè¡çãªäŸ¡å€ãããã«åºããããååšã«ãªãã®ã§ã¯ãªãããšèããŠããŸãã
å¶æ¥èªèº«ããããããªãã®ãäœãããã ããšèããç°¡åãªãããã¿ã€ããäœãããšã³ãžãã¢ãšæè¡çãªäŒè©±ãã§ããã
ãããªãã°ãã客æ§ã«æäŸã§ãã䟡å€ã¯ãåçŽãªãšã³ãžãã¢ã®äººæ°ã ãã§ã¯æž¬ããªããªãã¯ãã§ãã
å¶æ¥ã課é¡ãèãã ãã§ã¯ãªãã
課é¡ãèã â 解決çãèãã â 詊ãã«äœã£ãŠã¿ã â ãšã³ãžãã¢ãšäžç·ã«ããã«é«åºŠåãã
ãšããåããã§ããããã«ãªãã
ããã¯ãAIæä»£ã®SIerãã¯ã©ãŠãã€ã³ãã°ã¬ãŒã¿ãŒã«ãšã£ãŠãããªã倧ããªå¯èœæ§ã ãšæã£ãŠããŸãã
ä»åã¯ãŸã Phase 1
ä»å宿ããã®ã¯ããããŸã§æåã®ãã§ãŒãºã§ãã
çŸåšã¯ã
åŠç¿å
容ãç»é²
â
åŸ©ç¿æ¥ãèšç®
â
Firestoreãžä¿å
â
æå®æ¥ã«Slackéç¥
ãšãããšãããŸã§ã§ãã
ä»åŸã¯Phase 5ãŸã§çºå±ãããäºå®ã§ãã
Phase 1ïŒåŸ©ç¿ãªãã€ã³ã â ä»ãã
SlackããåŠç¿ããŒããç»é²ããæ±ºããããæ¥ã«èªåéç¥ã
Phase 2ïŒAIã«ãã埩ç¿åé¡çæ
ç»é²ãããããŒããããšã«ãGeminiã埩ç¿åé¡ãèªåçæã
Phase 3ïŒSlackäžã§åçã»AIæ¡ç¹
ãŠãŒã¶ãŒãSlackã§åçãããšãAIãå
容ãè©äŸ¡ãæ£è§£ ãæããã çè§£ãäžåå
ãªã©ãå€å®ãããã®å Žã§è§£èª¬ããŸãã
Phase 4ïŒç解床ã«å¿ãã埩ç¿ééã®æé©å
åºå®ã®ã
1æ¥ â 3æ¥ â 7æ¥ â 30æ¥
ã§ã¯ãªãã
å®å
šã«çè§£ â æ¬¡åã¯14æ¥åŸ
å°ãææ§ â 3æ¥åŸ
äžæ£è§£ â ç¿æ¥
ã®ããã«åŸ©ç¿æ¥ãå€ããŠãããŸãã
Phase 5ïŒåŠç¿å±¥æŽã»èŠæåéã®å¯èŠå
æçµçã«ã¯ã
AWS NetworkingïŒç解床 55%
IAMïŒç解床 80%
StorageïŒç解床 90%
ãšãã£ã圢ã§ãèªåã®åŠç¿ç¶æ³ãåæã§ãããšãããŸã§æã£ãŠãããããšæã£ãŠããŸãã
ãããŸã§å®æããã°ãåãªããªãã€ã³ãBotã§ã¯ãªãã
èªåå°çšã®AIåŠç¿ã³ãŒã
ã«è¿ã¥ããŠãããŸãã
æåŸã«
ä»åäžçªå€§ããã£ãã®ã¯ãBotã宿ããããšãã®ãã®ã§ã¯ãããŸããã
ãèªåã§ãäœããããšåãã£ãããšã§ãã
以åã®èªåã§ããã°ãCloud RunãFirestoreãAPIãIAM ãšããåèªãèŠãã ãã§ã
ããã¯ãšã³ãžãã¢ããããã®ãšæã£ãŠããã¯ãã§ãã
ã§ãAIã䜿ããªããäžã€ãã€çè§£ãããšã©ãŒã解決ããŠããã°ãéãšã³ãžãã¢ã§ãå®éã«åããã®ãäœããšãããŸã§å°éã§ããŸããã
ãããèªãã§ããéãšã³ãžãã¢ã®æ¹ã«ãã
ãã³ãŒããæžããããšããªãããèªåã«ã¯ç¡çã
ãšæåããæ±ºãã€ãããäžåºŠå°ããªãã®ãäœã£ãŠã¿ãŠã»ãããšæããŸãã
å®ç§ãªèšèšãã§ããªããŠãããã
æåãããã¹ãŠçè§£ããŠããªããŠãããã
AIã«èããªããã
äœã â åããªã â 調ã¹ã â çŽã â åã
ãç¹°ãè¿ããŠããã
ãã®éçšãã®ãã®ããéåžžã«è¯ãæè¡åŠç¿ã«ãªããŸããã
ãããŠããšã³ãžãã¢ã ãã§ã¯ãªãå¶æ¥ãå«ããéãšã³ãžãã¢ãŸã§ãäœããåŽãã«ãªã£ãŠããã°ãäŒç€ŸãšããŠã客æ§ã«æäŸã§ãã䟡å€ãããã«å€§ãããªãã¯ãã§ãã
ä»åã®Study Reminder Botã¯ããã®å°ããªç¬¬äžæ©ã§ãã
次ã¯Phase 2ã
Geminiã«ãã埩ç¿åé¡ã®èªåçæã«ææŠããŠãããŸãã