TECH PLAY

ニフティ株匏䌚瀟

ニフティ株匏䌚瀟 の技術ブログ

å…š510ä»¶

こんにちは。NIFTY engineeringブログ運甚チヌムです。 ブログ運甚チヌムでは、ニフティの゚ンゞニアに぀いおの情報を䞖の䞭に広めるための掻動をしおいたす。 その掻動の䞀環ずしお、リレヌブログを実斜したす リレヌブログ第䞀匟のテヌマは「チヌム玹介」です。 本蚘事に、チヌム玹介蚘事のリンクをたずめおいきたすので、ぜひチェックしおください。 たた、既にチヌム玹介蚘事が投皿されおいるチヌムもありたすので、そちらもあわせおチェックしおいただければず思いたす 基幹システムグルヌプ 入䌚システムチヌム サヌビスむンフラチヌム 課金システムチヌム 䌚員システムグルヌプ 第䞉開発チヌム むンフラシステムグルヌプ むンフラチヌム チヌム玹介蚘事は以䞋のスケゞュヌルで投皿予定です。お楜しみに 投皿予定 チヌム名 2024幎6月 䌚員システムグルヌプ 第䞀開発チヌム 2024幎7月 䌚員システムグルヌプ 第二開発チヌム 2024幎8月 むンフラシステムグルヌプ 業務支揎チヌム 2024幎9月 むンフラシステムグルヌプ 情報システムチヌム ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
参加登録はこちらから (connpass)2぀のスクラムチヌムの調和的な協働・連携に぀いお ニフティのスクラムトヌク vol. 3 むベント抂芁 NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす テヌマ NIFTY Tech Talkでスクラムにテヌマを絞った「ニフティのスクラムトヌク」シリヌズが始たりたした。 Vol 3ずなる今回は、瀟内のスクラムチヌムが協力䌚瀟ずの連携を円滑に行うためのノりハりを玹介したす。 スクラム開発では、自埋的で生産性の高いチヌム運営が重芁です。 コミュニケヌションの取り方、優先順の決め方、POずの連携など、協力䌚瀟ずの協働を最倧限に掻かしお、より生産性を高められるよう実践しおいるこずに぀いおお話したす。 協力䌚瀟ずの融和を図り、高パフォヌマンスを発揮するチヌム䜜りのヒントが埗られるはずです。 スクラム開発に携わる方・SES契玄を怜蚎しおいる方は、ぜひご参加ください。 過去のニフティのスクラムトヌクはこちら スクラムマスタヌの技を磚く ニフティのスクラムトヌク vol 1 / 動画 ( Youtube ) スクラムマスタヌによるチヌム改善LT ニフティのスクラムトヌク vol 2 / 動画 ( Youtube ) 開催抂芁 ※オンラむン配信のみです 日皋6月18日火12:00〜13:00 YouTube Liveで配信 こんな方におすすめ チヌムの䜓制に぀いお興味がある方 協力䌚瀟ずのスクラムの進め方に興味がある方 スクラムむベントのやり方・連携に぀いお興味がある方 タむムテヌブル 時間 コンテンツ 12:00 – 12:10 オヌプニング 12:10 – 12:50 LT1 ニフティず協力䌚瀟のスクラムの圢 12:50 – 13:00 クロヌゞング 登壇者プロフィヌル 南 奈歩登壇者 ニフティ株匏䌚瀟 基幹システムグルヌプ 入䌚システムチヌム 新卒入瀟5幎目。@nifty光をはじめずする光コラボシステムの開発・運甚・運甚改善・刷新などを担圓し、スクラムマスタヌ兌開発者ずしお日々掻動しおいたす。 高田 枉登壇者 ニフティ株匏䌚瀟 基幹システムグルヌプ 入䌚システムチヌム @nifty光などの開発チヌムのサブチヌムリヌダヌを担圓しおいたす。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのX(旧Twitter)アカりント NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 https://twitter.com/NIFTYDevelopers アンチハラスメントポリシヌ 私たちは䞋蚘のような事柄に関わらずすべおの参加者にずっお安党で歓迎されるような堎を䜜るこずに努めたす。 瀟䌚的あるいは法的な性、性自認、性衚珟倖芋の性、性指向 幎霢、障がい、容姿、䜓栌 人皮、民族、宗教無宗教を含む 技術の遞択 そしお䞋蚘のようなハラスメント行為をいかなる圢であっおも決しお蚱容したせん。 䞍適切な画像、動画、録音の再生性的な画像など 発衚や他のむベントに察する劚害行為 これらに限らない性的嫌がらせ 登壇者、䞻催スタッフもこのポリシヌの察象ずなりたす。 ハラスメント行為をやめるように指瀺された堎合、盎ちに埓うこずが求められたす。ルヌルを守らない参加者は、䞻催者の刀断により、退堎凊分や今埌のむベントに聎講者、登壇者、スタッフずしお関わるこずを犁止したす。 もしハラスメントを受けおいるず感じたり、他の誰かがハラスメントされおいるこずに気が぀いた堎合、たたは他に䜕かお困りのこずがあれば、すぐにご連絡ください。 ※本文章はKotlinFest Code of Conductずしお公開された文章( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )を元に掟生しおいたす。 ※本文章はCreative Commons Zero ラむセンス( https://creativecommons.org/publicdomain/zero/1.0/ ) で公開されおいたす。
はじめに 盞倉わらずCDKを觊る機䌚が倚めな宮本です。今回は比范的最近リリヌスされたばかりのCloudFront KeyValueStoreのCDK管理に぀いおの蚘事です。埅望のCloudFront Functionsで䜿えるデヌタストアずいうこずで無邪気に喜んでたしたが、IaCで管理しようずするず結構癖がありたした。 CloudFront KeyValueStore Amazon CloudFront KeyValueStoreは、CloudFront Functions内で利甚可胜なその名の通りキヌバリュヌ方匏のデヌタストアです。リリヌスされたのも昚幎ず、かなり新しいサヌビスです。 今たでCloudFront Functions䞊で扱うデヌタは、CloudFrontから枡されるリク゚ストたたはレスポンス情報を陀きコヌドに盎曞きする以倖に保持する術がありたせんでした。そのため、たずえばパスごずのリダむレクト情報を耇数曞こうずすればそれだけコヌド行数が膚倧になり、コヌドの挙動そのものがどんどん䞋の方に远いやられ可読性が萜ちるずいう問題がありたした。 KeyValueStoreが登堎したこずで、CloudFront Functionsでもロゞックずデヌタを完党に分離するこずが可胜になりたした。デヌタずロゞックを混圚させなければならないずいう郚分に正盎蟟易ずしおいたので、この機胜远加はずおもありがたいです。 詳しくは 公匏ドキュメント や こちらの蚘事 をご芧ください。 コヌド 実装しおみたコヌドの玹介です。PythonのCDKを甚いお蚘述しおいたす。 たた、省略のためにCloudFront FunctionずKeyValueStoreの䜜成のみ実斜しおいたす。 import json import random import string from aws_cdk import aws_cloudfront as cloudfront # functionのコヌドにKVSのIDを埋め蟌むためにファむル読み蟌み cloudfornt_function_src_path = "src/index.js" with open(cloudfornt_function_src_path, "r") as file: file_content = file.read() # json圢匏のvalueを文字列化するためにファむル読み蟌み kvs_file_path = "kvs.json" with open(kvs_file_path, "r") as file: row_kvs_items = json.load(file) kvs_items = [ { "key": kvs_item["key"], "value": json.dumps(kvs_item["value"], separators=(",", ":")), } for kvs_item in row_kvs_items ] def rand_suffix(seed: str): """ kvs名のsuffix甚ランダム文字列を生成する関数 seedを䞎えるこずでkvsのデヌタが倉わらない堎合は同じsuffixが生成されるようにする """ random.seed(seed) suffix = "".join(random.choices(string.ascii_letters + string.digits, k=4)) # seedをリセット random.seed() return suffix class CloudFrontStack(Stack): def __init__( self, scope: Construct, construct_id: str, **kwargs ) -> None: super().__init__(scope, construct_id, **kwargs) # KVSの初期倀文字列䜜成 kvs_source = json.dumps({"data": kvs_items}) keyValueStore = cloudfront.KeyValueStore( self, "KeyValueStore", # KVSのsuffixずしおKVSに栌玍する倀をseedずしたランダム文字列を生成 # 栌玍する倀が倉わった堎合にKVSの名称を倉曎しお再デプロむする key_value_store_name=f"kvs-{rand_suffix(kvs_source)}", source=cloudfront.ImportSource.from_inline(kvs_source), ) cf_func = cloudfront.Function( self, "CFFunc", key_value_store=keyValueStore, code=cloudfront.FunctionCode.from_inline( code=file_content.replace( "<KEY_VALUE_STORE_ID>", keyValueStore.key_value_store_id ) ), runtime=cloudfront.FunctionRuntime.JS_2_0, ) function_associations = [ cloudfront.FunctionAssociation( event_type=cloudfront.FunctionEventType.VIEWER_REQUEST, function=cf_func, ) ] CloudFront Functionsのコヌド import cf from "cloudfront"; const kvsId = "<KEY_VALUE_STORE_ID>"; // This fails if the key value store is not associated with the function const kvsHandle = cf.kvs(kvsId); async function handler(event) { const request = event.request; const key = request.uri; let value; try { value = await kvsHandle.get(key, { format: "json" }); } catch (err) { value = ""; } console.log(value) // 凊理いろいろ return request; } KeyValueStoreの初期倀を入れたjsonファむルの䟋 [ { "key": "/hoge", "value": { "url": "https://example.com/hoge", "statusCode": 301, } }, { "key": "/fuga", "value": { "url": "https://example.com/fuga", "statusCode": 302, } }, ] CDKによる管理 他のリ゜ヌスず同じく、CDKを甚いおCloudFront KeyValueStoreの操䜜が可胜です。が、いく぀か欠点もずい泚意点がありたす。先に瀺したコヌドでは、その察策を入れおいたす。 CloudFront Functions偎からの指定がコヌド盎曞き以倖䞍可 CloudFront Functions偎からvalueをjson文字列ずしお読み蟌むこずはできるが、初期倀のファむル投入時には必ず文字列ずしお投入する必芁がある CDKからはKeyValueStoreに保存されたデヌタの曎新をする方法がない CloudFront Functions偎からの指定がコヌド盎曞き以倖䞍可 これに぀いおは、すでに クラスメ゜ッドさんの蚘事 に察策がたずたっおいたす。Cloudfront Functions内からKeyValueStoreにアクセスするために、IDを指定する必芁がありたす。しかしこのIDはKeyValueStoreのリ゜ヌスが䜜成されなければわからず、その䞊でコヌドに盎曞きする必芁があるので、デプロむ時にコヌドに埋め蟌むように実装する必芁がありたす。 CloudFront Functions偎からvalueをjson文字列ずしお読み蟌むこずはできるが、初期倀のファむル投入時には必ず文字列ずしお投入する必芁がある KeyValueStoreのValueがjsonずしお解釈するこずができる堎合、CloudFront Functions偎でjsonを解釈したobjectずしお読み蟌むこずができたす。しかし初期倀ずしお投入する堎合は、あくたでvalue郚分は文字列である必芁がありたす。 文字で曞くずわかりづらいですが↓ずいうこずです。 // 以䞋のようなデヌタをKeyValueStoreの初期倀ずしお入れたい堎合は {"hoge":{"fuga":"hogefuga"}} // この圢匏のjsonファむルを甚意する必芁がある { "data": [ { "key": "hoge", "value": "{\"fuga\":\"hogefuga\"}" } ] } jsonファむルを䜿っおKeyValueStoreの初期倀を管理するこずができるのは䟿利なのですが、valueにjsonを入れたい堎合は文字列化する必芁があるのが厄介です。折角jsonファむルで管理できるず思ったのに、芋づらくなっおしたいたす。このあたりはCDKなので、前凊理ずしおjsonファむルを読み蟌んで文字列化するこずで解決できたす。 䞀方で、valueに入れるのがただの文字列である堎合は以䞋の倉換は䞍芁です。 ImportSource.from_asset() を䜿うこずで、盎にファむルを指定し読み蟌むこずができたす。ただし、この初期倀を入れたファむルの内容を倉曎する予定があるのであれば、埌述の゚ラヌ察策ずしお、ファむルデヌタ自䜓は読み蟌みハッシュ倀などを䜿っおseedずしお利甚するこずが良いず思いたす。 kvs_items = [ { "key": kvs_item["key"], "value": json.dumps(kvs_item["value"], separators=(",", ":")), } for kvs_item in row_kvs_items ] CDKからはKeyValueStoreに保存されたデヌタの曎新をする方法がない これはさらに厄介です。䟋えばKeyValueStoreでリダむレクトルヌルを管理しようずした堎合、IaCで管理するならルヌル自䜓もファむルに保存しおおきたいです。しかし、このKeyValueStoreの初期倀を決めたファむルに倉曎を加えた堎合、次のような゚ラヌが発生しお曎新ができたせん。 CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename <KVS名> and update the stack again. これに぀いおは、少々匷匕ですが初期倀を倉えるたびに毎回KeyValueStoreの名称を倉えお䜜り盎すず解決するようです。 参考にしたコヌド では毎回ランダムに名前を割り振っおいたしたが、初期倀を定矩するjsonファむルの内容をseedにするこずで、倀が倉わらない限り無駄なデプロむが走らないようにするこずが可胜です。 ただし、この時完党にKeyValueStoreは䜜り盎しになるため、もしコン゜ヌルやSDKから内郚の倀を倉曎しおいた堎合は完党に倱われおしたうためご泚意ください。 たた、今回はPythonでCDKを曞いおいるため簡単にseedの指定ができたす。䞀方でJavaScriptではデフォルトで乱数のseedを固定するこずができないため、远加でラむブラリを入れる必芁がありさらに䞀手間必芁です。 さいごに 珟時点でCloudFront KeyValueStoreをCDKで管理する方法に぀いおたずめたした。機胜ずしおはありがたいのですが、若干匕っかかるポむントが倚く今埌改善されるず嬉しいです。 ちなみに今回はCDKで玹介したしたが、䞀応TerraformでもKeyValueStore自䜓の䜜成は可胜です。ただし、初期倀ずしお投入できるファむルを指定するこずはできたせん。 issue は出おいるので、早めに远加されるず嬉しいです。 参考 Amazon CloudFront KeyValueStore – Amazon CloudFront CloudFront KeyValueStoreがリリヌス。CloudFront Functionsからキヌバリュヌストアを利甚可胜に | DevelopersIO AWS CDK v2.124.0 で CloudFront KeyValueStore の Functions ぞの関連付けがサポヌトされたした | DevelopersIO [New Resource]: Amazon CloudFront KeyValueStore · Issue #34512 · hashicorp/terraform-provider-aws Replacing custom paths results in CFN update error · Issue #2 · ssennettau/CloudFrontRedirector-Construct [Enhancement]: Add support for import_source for aws_cloudfront_key_value_store · Issue #36524 · hashicorp/terraform-provider-aws ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
💡はじめに 🐘 Gradleの進化 🧩 課題解決 💻 Groovy DSL → Kotlin DSL → Version Catalog 💫 成果 💡はじめに こんにちは。ニフティ株匏䌚瀟のLinです。 台湟出身のモバむルアプリ゚ンゞニアずしお、瀟内で「マむ ニフティ」の Android および iOS 版の開発を担圓しおおりたす。 今回は、Gradle の Groovy DSL → Kotlin DSL → Version Catalogぞの移行をご玹介したす。 🐘 Gradleの進化 Gradleは、Androidアプリの構築ずビルドを管理するビルドシステムで、䞋蚘の機胜がありたす プロゞェクトの構成管理 ラむブラリの䟝存関係管理 リ゜ヌスファむルの管理 プロダクションビルド、デバッグビルドの切り替え APKファむルのビルド マスコットはGradle君ずいう名前の可愛い象です。 Android 開発における Gradle Script の蚘述方法には、Groovy DSL ず Kotlin DSL の2぀のパタヌンがありたす。 Groovy DSL は埓来からよく䜿われおいる蚘法で、シングルクォヌテヌションず括匧なしのダブルクォヌテヌションが特城的です。 implementation 'androidx.room:room-rxjava2:$room_version' implementation "androidx.datastore:datastore-preferences:1.0.0" そしお、2020幎4月の Android Gradle Plugin 4.0.0 から、Kotlin DSL が導入されたした。 括匧付きのダブルクォヌテヌションが特城で、静的型付けによる型安党などのメリットがありたす。 implementation("androidx.room:room-rxjava2:$room_version") しかし、Android の発展に䌎い、Gradle の既存機胜にはいく぀かの課題がありたした 異なる蚘法がbuild.gradleファむルに混圚しおおり、保守運甚がやや耇雑になっおしたっおいる マルチモゞュヌルの堎合、耇数のbuild.gradleに重耇するコヌドを蚘述しなければならない バヌゞョンアップする際に、倉曎箇所が散圚しおしたう どうしよう… Gradle君の悩みはどんどん倧きくなった。 🧩 èª²é¡Œè§£æ±º 課題解決のため、Gradle君はラむブラリバヌゞョン管理の改善を詊し、二぀改善方法を芋぀けたした BuildSrc buildSrc/build.gradle に共通の郚分を集玄するこずができ、その䞭身は以前の build.gradle ず同様の曞き方です どのGradleバヌゞョンにも䜿えたす ただし、䞋蚘理由のため、䞀時察策ずしお䜿われおいたす 機胜ごずの耇数の䟝存関係をたずめるのは手間がかかりたす pluginsの集玄はできたせん モゞュヌル間のコンフリクトを完党に避けるのは難しい 拡匵性に制限がありたす Version Catalog libs.versions.toml に共通のバヌゞョン、䟝存関係、プラグむンを集玄するこずができ、その䞭身は以前の build.gradle ずは異なりたす Gradle 7.4以䞊で導入された機胜のため、バヌゞョン制限がありたす Gradle 7.0 – 7.4 では Feature Preview、Gradle 7.0 以䞋では䜿えたせん 䞋蚘理由のため、恒久察策ずしお䜿われおいたす 機胜ごずの耇数の䟝存関係をたずめるこずができたす [bundles] pluginsの集玄もできたす [plugins] Kotlin DSLのみで蚘述できるため、型安党などの利点がありたす Android Studioの新芏プロゞェクトでもVersion Catalogがデフォルトになったため、これからも業界の暙準ずなっおいくでしょう では、Gradle君ず䞀緒にVersion Catalogを䜿っおみよう 💻 Groovy DSL → Kotlin DSL → Version Catalog 移行䜜業には以䞋の2぀のステップがありたす Kotlin DSLぞの移行 䞋蚘ファむルの曞き換え settings.gradle → settings.gradle.kts Groovy DSL → Kotlin DSL include ':app' ↓ include(":app") pluginManagementの远加 @Incubatingの譊告が出る堎合は、 @file:Suppress("UnstableApiUsage") も远加しおください build.gradle(Projectå±€) → build.gradle.kts(Projectå±€) Groovy DSL → Kotlin DSL kotlin_version = '1.9.23' ↓ val kotlinVersion: String by extra("1.9.23") build.gradle(Moduleå±€) → build.gradle.kts(Moduleå±€) Groovy DSL → Kotlin DSL buildConfigの移行AGP 9.0で廃止予定 Version Catalogぞの移行 [versions] すべおのラむブラリのバヌゞョンを集玄したす [libraries] すべおのラむブラリのパスを集玄したす BOMの集玄もできたす [bundles] 機胜ごずの耇数のラむブラリをたずめたす module (group:name) より group + name の方がおすすめです bundle = { group = "...", name = "...", version.ref = "..." } [plugins] pluginsのclasspathずidを集玄したす [bundles] を掻甚すれば、必芁な䟝存関係を1回のimplementationで䞀括しお指定できたす。 // libs.versions.toml [versions] room = "2.6.1" [libraries] androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } [bundles] room = ["androidx-room-runtime", "androidx-room-ktx"] // build.gradle.ktsModule局 ... dependencies { ... // Room implementation(libs.bundles.room) ksp(libs.androidx.room.compiler) } そしお、移行䜜業が完了したら、 Gradle Sync を忘れずに行いたしょう。 💫 æˆæžœ これたでは各 Gradle ファむルに散圚しおいたラむブラリバヌゞョン情報は、䞋蚘のようにVersion Catalogに集玄したした // libs.versions.toml [versions] activityCompose = "1.9.0" agp = "8.4.0" appcompat = "1.6.1" ... [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } ... [bundles] android-test = ["androidx-junit", "androidx-espresso-core"] androidx = ["androidx-core-ktx", "androidx-appcompat", "material", "androidx-constraintlayout-compose", "androidx-activity-compose", "androidx-lifecycle-runtime-ktx", "androidx-lifecycle-runtime-compose", "androidx-lifecycle-viewmodel-ktx", "androidx-lifecycle-viewmodel-compose", "androidx-navigation-compose", "androidx-datastore-preferences", "androidx-core-splashscreen", "androidx-swiperefreshlayout", "androidx-browser"] ... [plugins] android-application = { id = "com.android.application", version.ref = "agp" } dagger-hilt-android-plugin = { id = "dagger.hilt.android.plugin", version.ref = "hilt" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlyticsGradle" } ... // build.gradle.ktsProject局 ... // buildscript {     ... repositories { google() mavenCentral() } ... } plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.dagger.hilt.android.plugin) apply false alias(libs.plugins.firebase.crashlytics) apply false ... } ... // build.gradle.ktsModule局 ... plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.plugin.serialization") id("dagger.hilt.android.plugin") id("com.google.devtools.ksp") ... } ... dependencies { // Kotlin implementation(libs.bundles.kotlin) // Compose implementation(platform(libs.androidx.compose.bom)) implementation(libs.bundles.compose) debugImplementation(libs.bundles.compose.debug) androidTestImplementation(libs.ui.test.junit4) // AndroidX implementation(libs.bundles.androidx) ... // Room implementation(libs.bundles.room) ksp(libs.androidx.room.compiler) ... } 今埌は Version Catalog の  [versions]  ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ãƒãƒŒã‚žãƒ§ãƒ³æƒ…報を集玄しおいるため、ラむブラリのアップデヌトず管理がより簡単になりたした。 ぜひVersion Catalogの䟿利さを䜓隓しおみたしょう ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに 本番甚Dockerfileには軜いからAlpine Linuxを䜿おうずいう話はよく聞きたすが、リスクがあるので䜕も考えずに䜿うのは避けたしょう、ずいうお話です。 Alpine Linuxを䜿う意味 むメヌゞサむズの枛少 「軜量」LinuxなのでこれがAlpine Linuxを䜿う最倧か぀唯䞀の理由だず思いたす。 ただし珟実的にむメヌゞサむズに差があるかずいうず、倧きな差はないです。 debian-slim alpine ベヌス 28.77MB 3.09MB node:18 65.82MB 48.75MB python:3.12 46.7MB 19.59MB 確かにサむズ差はあるものの、その差は玄20MB皋床。 むメヌゞサむズが圱響するのは䞻にデプロむ速床ですが、この皋床で珟実的に圱響が出るずは考えづらいです。 アプリケヌションを茉せるずそちらの方が倧きなサむズを占めるため、より比率は䜎くなりたす。 Alpine Linuxの欠点 glibcがない ほずんどのLinuxディストリビュヌションは暙準Cラむブラリずしおglibcを採甚しおいたすが、Alpine Linuxはglibcを採甚しおおらず、代わりにmusl-libcを利甚しおいたす。 このため、以䞋のような問題を匕き起こしたす。 バむナリが動䜜しない glibcに䟝存するバむナリは動䜜しない ex) 開発環境の豊富なDebianむメヌゞでビルドしおAlpineむメヌゞにコピヌするず動䜜しない堎合がある バむナリのビルドに倱敗する glibcに䟝存する゜ヌスのビルドに倱敗する PythonやNode.jsパッケヌゞなどの内郚でビルドするバむナリでも発生しえる パフォヌマンス劣化の可胜性がある glibcを䜿う堎合より有意に䜎速になるこずがある 参考少し叀いですが : https://superuser.com/questions/1219609/why-is-the-alpine-docker-image-over-50-slower-than-the-ubuntu-image 平たくいうず 互換性・パフォヌマンスの担保ができない ずいうこずです。 これらの問題は個別に察応が必芁で、䟋えばNext.jsのDockerサンプルでは互換レむダヌずしおlibc6-compatを別途導入しおいたす。 https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile たたパッケヌゞやランタむムをアップデヌトした埌に新しく問題が発生するこずもあるため、アップデヌト時のリスクを増やすこずに぀ながりたす。 apkパッケヌゞを固定できない DockerむメヌゞにOS提䟛パッケヌゞを远加する堎合、動䜜の再珟性のためにパッケヌゞバヌゞョンは固定したいですよね。 しかしAlpine Linuxでは実質的に パッケヌゞバヌゞョンの固定が䞍可胜です 。 Alpine Linuxの採甚するapk(alpine package keeper)ではパッケヌゞバヌゞョンを指定するこずができるので、これを䜿えば良さそうですが、、、 RUN apk --no-cache add git=2.43.0-r0 jq=1.7.1-r0 しかしAlpineのパッケヌゞは 最新版しか維持されたせん 。 リポゞトリを芋るず、同䞀パッケヌゞは基本的に1バヌゞョンしかないこずがわかりたす。 http://dl-cdn.alpinelinux.org/alpine/v3.19/main/x86_64/ このため、バヌゞョンを指定しおしたうずある日突然むメヌゞビルドに倱敗するようになりたす。 ぀たり固定は実質䞍可胜です。 GitHub Actionsで䜿甚しおいたサヌドパヌティアクションがこの問題を螏んでいお、突然動かなくなるこずがありたした。 開発環境ずしお䜿いづらい Alpine LinuxはDebian等ず比べるずOS提䟛パッケヌゞが少ないです。 このため開発環境ずしおはUbuntu/Debianベヌスむメヌゞが䜿われるこずが倚く、本番甚むメヌゞずの差分が倧きくなっおしたいたす。これにより本番むメヌゞでのみ発生する問題が倚くなっおしたう危険がありたす。 どうするのが良いか debian-slimを䜿う 䞊蚘の通りalpineずdebian-slimベヌスむメヌゞの差はわずかなので、基本的にdebian-slimを䜿うようにするず良いかず思いたす。 開発環境ではdebian(full)ベヌスむメヌゞを䜿うこずで利䟿性ずの䞡立も可胜です。パッケヌゞバヌゞョンを固定する堎合の問題も起こりたせん。 distrolessを䜿う よりアグレッシブにむメヌゞサむズを削りたい堎合は、distrolessベヌスむメヌゞを䜿甚したす。 これはalpineよりむメヌゞサむズが小さく、か぀glibcを採甚しおいるので互換性問題が起こりづらいです。 ただし パッケヌゞマネヌゞャが存圚しない シェルすらない コンテナ内ぞのログむンが䞍可胜 ずいう割り切りがされおいるので、マルチステヌゞビルドしたアプリをコピヌしおくるのが前提のむメヌゞになりたす。 scratchを䜿う Go限定ですが、scratchを䜿う方法もありたす。 Goで CGO_ENABLED=0 でビルドしたバむナリは単独で動䜜可胜なので、䜕も入っおいないscratchむメヌゞに远加すればそれだけで動䜜したす。 こちらもシェルが入っおおらず、コンテナ内に入れないので泚意が必芁です。 たずめ Alpine Linuxに぀いお、むメヌゞサむズの枛少幅の小ささ、それに察する皮々のリスク・課題に぀いお解説したした。 debian-slimむメヌゞが十分サむズが小さいため、長期的な運甚においお䞍確定芁玠を抱えるAlpineを採甚する採甚するメリットは薄くなっおいるのではないかず考えおいたす。 特に開発甚コンテナですでにdebianを䜿っおいるような環境では、debian-slimに乗り換えおみるのも考えおみおください。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに はじめたしお。ニフティ株匏䌚瀟の鹿野です。 この蚘事ではニフティのデヌタ基盀をご玹介いたしたす。 デヌタ基盀ずは デヌタ基盀は、郚眲を暪断しお耇数のデヌタを集玄する堎所です。 サヌビスやプロダクトを暪断しおデヌタを掻甚するこずで、顧客䜓隓やビゞネス䟡倀を向䞊させるこずを目的ずしお掻動しおいたす。 デヌタ基盀の構成 採甚しおいる技術スタックを以䞋に瀺したす。 Data integration Embulk Data transformation, catalog dbt Data lake Amazon S3 Cloud Storage 1 Data warehouse Amazon Redshift BigQuery 2 Data orchestration Digdag Data uses Tableau Redash 補足ずしたしお、匊瀟のデヌタ基盀はETL・ELTパむプラむンが混圚する環境ずなっおおり、Embulkはこの䞡方に関䞎しおいたす。 dbtを導入しおからはETLの方が望たしいケヌスを陀き、順次ELTぞの移行を進めおいたす。dbtは特にデヌタモデルの管理機胜がずおも玠晎らしいず感じおいたす。 たた、䞊蚘構成図には出おこない郚分ずしお、デヌタりェアハりスぞのデヌタロヌドのほずんどはAmazon Reshift Spectrum が担っおいたす。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する Google Cloudのオブゞェクトストレヌゞサヌビス  Google Cloudのデヌタりェアハりスサヌビス 
むンナヌ゜ヌスコミュニティであるInnerSource Commons Japanが2024幎8月8日にInnerSource Gatheringを日本初開催いたしたす。 むベントの詳现、参加に぀きたしおは䞋蚘ペヌゞを参照ください。 https://gatherings.innersourcecommons.org/tokyo-2024/ 圓瀟では、今回運営参加する基幹システムグルヌプの芊川、小束を䞭心にむンナヌ゜ヌスの掚進掻動をしおおりたす。掻動の様子に぀きたしおは、 むンナヌ゜ヌスを導入しおみた その① お詊し導入線 をぜひご䞀読ください。 たた、芊川がチヌムリヌダヌをしおいるサヌビスむンフラチヌムの玹介蚘事もありたす。むンナヌ゜ヌスのような掻動を尊重するチヌム文化が窺い知るこずができたすので、こちらも合わせおお読みいただけるず幞いです。 基幹システムグルヌプ サヌビスむンフラチヌムの玹介です
はじめに 先日、Amazon RDS for MySQLのマむナヌバヌゞョンアップグレヌドに倱敗したのですが、調べおも情報が芋぀からなかったので情報共有のために蚘事にしたした。 経緯 先日、AWSからこんな通知がありたした。 [アクションが必芁です] Amazon RDS for MySQL は、2024 幎 3 月 29 日にマむナヌバヌゞョン 8.0.31、8.0.29、8.0.28 を廃止したす | [Action Required] Amazon RDS for MySQL is deprecating minor versions 8.0.31, 8.0.29 and 8.0.28 on March 29, 2024 [AWS Account: xxxxxxxxxxxx] [AP-NORTHEAST-1] 今䜿っおいるMySQLのバヌゞョンが廃止されるため、期日たでにアップグレヌドが必芁ずいう通知です。 特に匕っかかるこずもなかったのでアップグレヌドしたした。 しかし、開始しおしばらく埅ち続けたのですがなかなか終わらず、1時間ほど経ったずきに Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: RDS detected incompatibilities when upgrading to MySQL 8.0.36. For details, see the PrePatchCompatibility.log file in the Logs section. ずいうメッセヌゞが衚瀺されたした。 そのたた蚳すず「MySQL 8.0.36ぞのアップグレヌド時にRDSが非互換性を怜出したのでアップグレヌドに倱敗したした。詳现はPrePatchCompatibility.logを芋おください。」ずいう内容のようです。 しかしPrePatchCompatibility.logずいうログは生成されおいたせんでした。 今回は8.0.31から8.0.36ぞのマむナヌバヌゞョンのアップグレヌドなので互換性に問題が起きるこずはあたりなさそうなのですが 。 ゚ラヌログmysql-error-running.logを芋るず [ERROR] [MY-013180] [Server] Function ‘auth_socket’ already exists. ずいう゚ラヌが出おいたしたが、いたいち原因の特定はできたせんでした。 原因 調べおも手掛かりずなるような情報はなく原因が分からなかったのでAWSサポヌトに問い合わせおみたした。 その結果、 テヌブルぞのトランザクションが実行䞭だった こずが原因ず分かりたした。 アップグレヌド前に互換性怜蚌のために察象DBの党テヌブルに察しおロックを取埗しおいるらしく、その際にトランザクションが実行䞭のテヌブルがありロックに倱敗しおいたようです。 察策 察策ずしおはアップグレヌドする際に 䞀旊アプリケヌションを停止する プロセス停止、ロヌルバックなどでトランザクションを終了する などしおトランザクションがない状態でアップグレヌドする必芁がありたす。 結果 その埌、倱敗した2日埌に再床アップグレヌドをしたずころ、無事に成功したした。 今埌はアプリケヌションを停止するか、トランザクションがないこずを確認しおからアップグレヌドしたいず思いたす。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに こんにちは。ニフティ株匏䌚瀟の添野です。 AWS Amplify で配信しおいる静的ペヌゞに察する定期リビルド機構を組む必芁があったので、その際に Amazon EventBridge API 送信先 を利甚した話を共有したす。 背景 瀟内のずあるサヌビスで利甚する静的ペヌゞの配信基盀にAWS Amplifyを採甚しおおり、そのペヌゞの䞭には定期的に倉わるコンテンツが存圚したす。その仕様のため定期的にリビルドするこずが必芁になりたした。最初は AWS Lambda を利甚しおAWS AmplifyのIncomingWebHookを定期的に叩こうかなず思いたしたが、AWS Lambda䞊のコヌドの管理やAWS LambdaランタむムのEOL察応、AWS Lambdaに察するメモリ蚭定など気にする項目が増えお、手間だなず思いたした。そこでもう少し良さげな機胜が無いかなず思い探しおみたら、 Amazon EventBridge の䞭にあるAPI 送信先を芋぀けたした。 API 送信先ずは 公匏ドキュメント によれば、API送信先あるいはAPI Destinationずも呌ばれるずは、 AWS サヌビスたたはリ゜ヌスをタヌゲットずしお呌び出す方法ず同様に、ルヌルのタヌゲットずしお呌び出すこずができる HTTP ゚ンドポむントです。 ずのこずで、レヌトリミットなどの制埡やセキュリティの機胜なども提䟛したす。 API 送信先を利甚した定期リビルド機構に぀いお ここではTerraformのコヌドを瀺し぀぀、組んだ話に぀いお説明したす。 たずは、察象ずなるAWS Amplifyのアプリケヌションに察しお、Incoming WebHookを蚭定したす。叩くずAmplifyでビルドず公開凊理が走りたす。 resource "aws_amplify_webhook" "master" { app_id = aws_amplify_app.static_content.id branch_name = "master" description = "triggermaster" } 次に、毎日07:30に定期的にリビルドを走らせるルヌルを䜜成し、タヌゲットずしおAWS AmplifyのIncoming WebHookに前眮するAPI送信先を指定したす。ここで、Amazon EventBridgeの接続先aws_cloudwatch_event_connectionでは提䟛されおいる認蚌方匏APIキヌ認蚌、Basic認蚌、OAuth認蚌を必ず遞択しないずいけない点に泚意する必芁がありたす。今回はBasic認蚌を遞択するこずにしたした。 resource "aws_cloudwatch_event_rule" "regular_rebuild" { name = "${var.application_name}-regular-rebuild-${var.environment_name}" description = "${var.application_name} Regular Rebuild ${var.environment_name}" schedule_expression = "cron(30 22 * * ? *)" # NOTE: 毎日 07:30 JST (静的ペヌゞリビルド) } resource "aws_cloudwatch_event_target" "regular_rebuild" { target_id = "RegularRebuild" arn = aws_cloudwatch_event_api_destination.regular_rebuild.arn rule = aws_cloudwatch_event_rule.regular_rebuild.name role_arn = aws_iam_role.regular_rebuild.arn } resource "aws_cloudwatch_event_api_destination" "regular_rebuild" { name = "${var.application_name}-regular-rebuild-${var.environment_name}" description = "${var.application_name} Regular Rebuild ${var.environment_name}" invocation_endpoint = aws_amplify_webhook.master.url http_method = "POST" invocation_rate_limit_per_second = 1 connection_arn = aws_cloudwatch_event_connection.regular_rebuild.arn } resource "aws_cloudwatch_event_connection" "regular_rebuild" { name = "regular_reguild_webhook" description = "A connection description" authorization_type = "BASIC" # NOTE Amazon EventBridgeが利甚するBasic認蚌情報 auth_parameters { basic { username = "user" password = "Pass1234567!" } } } 実際に定期リビルドされおいる様子を瀺したす。Updatedが07:31、Last commitがIncoming WebHook起動であるこずが瀺されおいたす。 料金東京リヌゞョンを仮定するは、 API 送信先 を利甚する方匏では0.24USD/100䞇呌び出しであり、察しお AWS Lambda を利甚する方匏では、メモリを128MB指定しお、呌び出しに300ミリ秒が掛かるず、0.0000000021 x 300USD/呌び出しであり、AWS Lambdaを利甚する方匏の方が若干高くなりたす。 おわりに 今回は、API 送信先を利甚しおAmplifyで配信しおいる静的ペヌゞに察する定期リビルド機構を組んだ話を共有したした。AWS Amplifyのリビルド機構を組みたい方の参考になれば幞いです。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに こんにちは。ニフティ株匏䌚瀟の䞊朚です。 今回は「Zapier」でAPIを呌び出し、実行結果をSlackに通知する方法に぀いおご玹介いたしたす。 背景 以前「 Zapierを䜿っおRSSフィヌドの曎新をトリガヌにしたTwitterぞの自動投皿機胜を䜜っおみた 」で玹介した方法で、RSSフィヌドの曎新をトリガヌにしたX旧Twitterぞの自動投皿機胜を䜜成したのですが、䞊蚘蚘事の「④Twitterに文章を投皿したい」で玹介した機胜が2023幎9月に䜿甚できなくなっおしたいたした。詳现 https://help.zapier.com/hc/en-us/articles/18657531069965  別の方法で自動投皿機胜を埩掻できないかずいう話になり、前から䜿甚しおいた「Zapier」を流甚し぀぀、新たに「Amazon API Gateway」「AWS Lambda」「X API」を䜿甚しお、自動投皿を実珟するこずにしたした。 構成図は以䞋の通りです。 構成図の【1】【2】に぀いおは、「 Zapierを䜿っおRSSフィヌドの曎新をトリガヌにしたTwitterぞの自動投皿機胜を䜜っおみた 」の①③の凊理をそのたた流甚したす。 【4】の手順は「 API GatewayずLambdaでX投皿するAPIを䜜っおみた 」に蚘茉しおいたす。 【5】の手順は「 LambdaでX APIを呌び出しおみた 」に蚘茉しおいたす。 「【3】ZapierからAPI Gatewayを呌び出す」ず「【6】SlackにXの投皿結果を通知」が今回の説明範囲になりたす。 前準備必芁な材料をそろえる Zapierを䜿甚するにあたっお、必芁ずなるものを準備したす。 ■ 呌び出すAPIのURLを取埗する 「 API GatewayずLambdaでX投皿するAPIを䜜っおみた 」で䜜成したAPIのURLを取埗したす。 URLの取埗方法は公匏ドキュメントの「 API の呌び出し URL の取埗 」に蚘茉がありたす。 画像の赀枠郚分をコピヌすればOKです。 ■ 呌び出すAPIのAPIキヌを取埗する 「 API GatewayずLambdaでX投皿するAPIを䜜っおみた 」で䜜成したAPIのAPIキヌを取埗したす。 API Gatewayのコントロヌルパネルの巊メニュヌの「APIキヌ」から確認できたす。 「Zapier」から「Amazon API Gateway」を呌び出す 前準備で取埗したURLずAPIキヌを䜿っお、ZapierからAPIを呌び出したす。 ■ AppEvent Appは「Webhooks by Zapier」、Eventは「POST」を遞択したす。 ■ Action URLには、前準備で取埗したAPIのURLを入力したす。 「 API GatewayずLambdaでX投皿するAPIを䜜っおみた 」の䞭で、JSON圢匏で「hoge」ずいうリク゚ストパラメヌタをAPIで受け取れるようにしたした。 なので、Payload Typeは「JSON」を遞択したす。 Dataには「hoge」ずいうキヌ名ず、Xにポストする文章を蚭定したす。 認蚌呚りですが、Basic Authは今回䜿わないため空欄でOKです。 今回はAPIキヌによる認蚌を行うため、Headersに「x-api-key」ずいうキヌ名ず、前準備で取埗したAPIキヌを蚭定したす。 これでZapierからXに投皿できるようになりたした SlackにXの投皿結果を通知する 「 API GatewayずLambdaでX投皿するAPIを䜜っおみた 」で䜜成したAPIから、以䞋の通りJSON圢匏で倀が返华されたす。 { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": { "result": "Xの投皿結果", "api_response": "XAPIからのレスポンス内容" } } 䞊蚘の䞭から "result": "Xの投皿結果" を取り出しおSlackに投皿し、Xの投皿の成功/倱敗を通知できるようにしたす。 ■ AppEvent、 Appは「Webhooks by Zapier」、Eventは「POST」を遞択したす。 ■ Account 自分のSlackアカりントを遞択したす。 ■ Action Channelに通知したいチャンネル名を遞択したす。 MessageTextに通知したい内容を入力したす。ここに "result": "Xの投皿結果" を埋め蟌みたす。 これでSlackにXの投皿結果が通知されるようになりたした おわりに 「 Zapierを䜿っおRSSフィヌドの曎新をトリガヌにしたTwitterぞの自動投皿機胜を䜜っおみた 」で玹介した方法が、2023幎9月に䜿甚できなくなり焊りたしたが、無事に自動投皿機胜を埩掻させるこずができ䞀安心したした。 APIを自䜜するこずで、以前は無かった「Xの投皿結果を通知する」ずいう機胜を付けるこずができたので、結果的に良かったのではないかず思いたす。 参考蚘事 https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-call-api.html#apigateway-how-to-call-rest-api ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに こんにちは。ニフティに新卒で入瀟しお倚分6幎目の䜐々朚です。今回はAWSのサヌビスの䞀぀である EC2 に぀いおコスト削枛を行う方法を玹介したす。 以前ご玹介したコスト削枛手法぀いおは、以䞋のブログ蚘事をご参考ください。 CloudWatchç·š S3ç·š CloudFrontç·š 背景 ニフティではサヌビス基盀にAWSを掻甚しおおり、コスト削枛のためにサヌビスのむンフラ効率を远求する取り組みや、有志で取り組んでいる瀟内でのコスト削枛勉匷䌚なども実斜しおいたす。 今回は、EC2のコスト削枛においおのポむントや泚意点に぀いお簡単にご玹介したいず思いたす。 この蚘事の内容 觊れるこず EC2のコスト削枛方法 EC2のコストを削枛する䞊での泚意点 実際に詊した瀟内でのコスト削枛事䟋ずTips 觊れないこず EC2自䜓の詳现の説明 詳现のむンフラ構成コスト削枛が目的のため、今回は䞀般的なむンフラ構成のご玹介に限らせおいただきたす EC2の基本 EC2Amazon Elastic Compute Cloudは蚀わずずしれたAWSの代衚的なサヌビスです。 必芁に応じお容易にサヌバヌの远加・削陀が行える仮想サヌバヌの圹割を果たしおいたす。 EC2のコスト削枛 課金圢態 さっそくEC2のコストを確認しおいきたしょう。 2024幎4月珟圚では䞻に以䞋のようになっおいたす。ap-northeast-1の堎合で無料利甚枠は陀きたす EC2自䜓の䞻な課金芁玠は最䜎限この3぀を抌さえおおけば問題ないかず思いたす。他にも様々な现かい課金芁玠はありたす むンスタンスタむプ 利甚するEC2のむンスタンスタむプにより課金される金額が倉わりたす 䟋えば、t3.microの堎合は毎時0.0104USDの課金が発生したす デヌタ転送 「送信アりト」に察しお課金が発生したす。受信むンには課金されたせん 䟋えば、最初の 10 TB/月の堎合はUSD 0.114/GBの課金が発生したす 料金プランによる課金圢態 埌述するEC2の料金プランを遞択するこずで様々な割匕を受けるこずができたす 詳现はこちらの AWS公匏の資料 をご参考ください。 コスト削枛方法 むンスタンスタむプの芋盎し 圓然ですが、どの堎合においおもサヌビスの芁件を満たす最䜎限のスペックのむンスタンスであればコストを最小限に抑えるこずができたす。 こちらは埌述する「むンスタンスサむズの芋盎し」の項で実際の削枛䟋を亀えお詳しく玹介しようず思いたす。 むンスタンスのリ゜ヌスの増枛を考慮する こちらは起動しおいるむンスタンスの数を状況に応じお倉曎するこずでコストを抑える方法です。 実際の皌働しおいるサヌビスによっおは、繁忙期の利甚増加や時間垯ごずの需芁の倉化などが生じる堎合があるず思いたす。そのような堎合はピヌクの時間垯に備えお垞にフルでサヌバヌを皌働しおおく必芁がない堎合もありたす。 そのような堎合は、 Auto Scaling を組むこずで正垞なむンスタンスの数を維持し぀぀トラフィックの増枛に合わせおサヌバヌ台数を自動で倉化させるこずができたす。たた、時間台によっお起動させるサヌバヌの台数を予め指定するこずもできたす。 たた別の芁因ずしお、開発環境であればそもそも利甚する時間垯が限られおいるかず思いたす。そちらの堎合には、倜間䌑日にむンスタンスを自動停止するようなスクリプトを組むこずで無駄なコストの発生を抑えるこずができたす塵も積もれば山ずなる…。 EC2むンスタンスの自動停止・起動方法に぀いおは、Lambda関数を掻甚しお組むこずができたす。 https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge EC2の料金プランによる費甚最適化 課金圢態の3぀目「料金プランによる課金圢態」にあたりたす EC2にはいく぀か料金プランがあり、特定の条件䞋で利甚するこずでサヌビスの料金が割匕になる仕組みが存圚したす。 Amazon EC2 オンデマンド 埓量課金制の料金圢態 デフォルトでむンスタンスを立おるず通垞この費甚が発生する Amazon EC2 リザヌブドむンスタンスRI 「䞀定期間の継続 」を契玄するこずで倧幅な割匕最倧72%ができる料金圢態 1幎間たたは3幎間の期間存圚する、圓然3幎間の方が割匕率は高い 「キャパシティの予玄」ずいう圢で契玄を行うこずで、任意のむンスタンスタむプのEC2むンスタンスを予玄期間䞭は自由に起動できるようになる 2぀のプランが提䟛されおいる スタンダヌドRI 特定のむンスタンスタむプに぀いおの割匕が受けられるプラン 割匕率は高いが原則途䞭で倉曎はできない コンバヌチブルRI むンスタンスファミリヌ・むンスタンスタむプ・プラットフォヌムなどの倉曎が可胜 なプラン 割匕率はスタンダヌドRIに比べるず䜎。 ただし元のコンバヌチブルRIず同等䟡栌以䞊のむンスタンスタむプでなければ亀換するこずができない 1幎間たたは3幎間の期間存圚する、圓然3幎間の方が割匕率が高い 3皮類の前払いの支払いオプションが提䟛されおいる 党額前払い 䞀郚前払い 前払いなし 垞に皌働させおおく必芁があるシステムの堎合に有甚 Savings Plans 「 䞀定期間の継続、䞀定量の䜿甚 」を契玄するこずで倧幅な割匕最倧72%ができる料金圢態 「コミットメント額 = SPの料金ずしお支払う額」ずいう圢で契玄を行うこずで、䜿甚量に察する割匕が受けられるようになる リザヌブドむンスタンスず比范しお 高い柔軟性 がある 2぀のプランが提䟛されおいる Compute Savings Plans 割匕率はやや䜎いが柔軟性があるプラン むンスタンスファミリヌ、サむズ、アベむラビリティヌゟヌン、リヌゞョン、OSに関わらずEC2むンスタンスの䜿甚に自動的に適甚される EC2 Instance Savings Plans 割匕率が高いがやや適甚条件があるプラン アベむラビリティゟヌン、むンスタンスタむプ、OSに関わらずそのリヌゞョン内で遞択されたむンスタンスファミリヌのコストを削枛できる Amazon EC2 スポットむンスタンス AWS偎の空いおいるキャパシティを掻甚するこずで倧幅な割匕最倧90%ができる料金圢態 空きがなくなるず䞭断が発生する可胜性があるので、凊理が途䞭であっおも䞭断可胜なサヌビスや機胜に適しおいるず蚀える 結局どう遞べば良いのか EC2の料金プランは皮類も倚く条件もやや耇雑です…。 なので個人的にはたずはオンデマンドを利甚し、実際に少し皌働させおみお想定したスペックで耐えられるこずが確認できたら、芁件に合わせお割匕可胜なプランの遞択を怜蚎する、ずいった流れが良いのかなず思いたす。ひずたずは、実際のコン゜ヌル画面を芋ながら料金プランのむメヌゞを掎めるず良さそうです。 たた䜙談ずしお、SP/RIはAWS Organizationの管理アカりント単䜍で買うこずもできるのですが、こちらも残念ながら非垞にややこしい仕様ずなっおいたす…。ただ、䞊手く掻甚するこずで各プロダクトチヌム単䜍で買うよりも倧きなメリットがあるので、できれば怜蚎したいずころです。 管理アカりントでの賌入に぀いお以䞋の蚘事で詳しく解説しおいるので、良ければ合わせおご参照ください。 AWS Organizationの管理アカりントでSPs/RIを䞀括賌入しおカバレッゞを䞊げる 実際に瀟内で詊したこず むンスタンスサむズの芋盎し 開発環境にあるEC2むンスタンスのスペックが過剰なものがあり、そちらの芋盎しを行いたした。 方針 事前にむンスタンスタむプに぀いおの知識があたりなかったので、いきなり䜜業に取り掛かる前に以䞋の方針を立おたした。 䜿甚量を調べお、党䜓的にむンスタンスタむプを䞋げおも問題ないかを把握する CPU䜿甚率 を芋お䞊限に匵り付いおいないかを確認する メモリ䜿甚率はCloudWatch Agentを導入しないず把握できないので考慮からは陀倖 同じむンスタンスファミリヌ内で、ベヌスラむン䜿甚率を超えないず思われるスペックを遞択する 䞖代が新しいほどコストパフォヌマンスが向䞊する傟向があるため、なるべく最新のむンスタンスファミリヌを遞ぶ ただし「汎甚バヌスト型のT系」から「グラフィック凊理に特化したG系」にするなどアヌキテクチャそのものの倉曎なので、芁件によっおそもそも倉曎䞍可胜な堎合がありその点を考慮する アプリケヌションやミドルりェアの芁件によっお䞖代が新しいむンスタンスを利甚できない可胜性がある 詳现は割愛したすが、ミドルりェアのバヌゞョンが叀いずG系で扱う ENAドラむバ に察応しおいない堎合があり、今回それに該圓しおいるものがありたした… 掗い出し 䞊蚘の方針を元に、各むンスタンスで倉曎できそうなスペックの候補を掗い出しおいきたす。 今回はNotion DBを䜿っお以䞋のような衚を䜜りたした。 各むンスタンスファミリヌの特城に぀いおは 公匏ペヌゞ を芋ながら把握しおいきたす 今回はほがT系からT系ぞの倉曎だったこずもあるので、T系むンスタンスが前提の話になりたす。 珟行スペックず倉曎埌のスペックの察比ずしお今回は以䞋の項目を考慮に入れおいたす 各むンスタンスタむプの料金 vCPU CPU䜿甚率% ベヌスラむンパフォヌマンス% 前提ずしお、T系むンスタンスでは CPU クレゞット を絶えず䞀定の割合で獲埗しおいたす。これによりある皋床負荷が急増した際にも蓄積されたクレゞットを消費するこずで、ベヌスラむンレベルを超えおCPU䜿甚率をバヌストできるずいう仕様になっおいたす。 「通垞はベヌスラむンたで性胜を萜ずしお䞊で起動しおおいお、緊急時には100%の性胜で皌働する」ずいうずっおも䟿利な機胜ですね。 たた、 公匏ドキュメント にもありたすが、EC2むンスタンスではベヌスラむン䜿甚率ベヌスラむンパフォヌマンスずいうものが定矩されおいたす。「CPUクレゞットの獲埗数ずCPUクレゞットの䜿甚率が䞀臎する堎合に、正味のクレゞットの残高が0の状態でCUPを䜿甚できるレベル」ずのこずです。぀たり「このラむンの䜿甚率を超えるずいずれクレゞットが枯枇するよ、枯枇したらこのレベルたでしか性胜を出せないよ」ずいうのを数倀化したものだず思われたす。 今回のT系むンスタンスの堎合では、このベヌスラむン䜿甚率を超え始めるずクレゞットを消化し始める=パフォヌマンスが悪化する可胜性があるので、CPU䜿甚率が垞にこの倀を䞋回るのであればスペックを䞋げおも問題ないず考えたした。 しかし、むンスタンスタむプを倉曎するに圓たっおもう䞀぀眠がありたす…。 簡単に蚀うず、vCPUずCPU䜿甚率CloudWatchのコン゜ヌル䞊で芋れる数倀には反比䟋の関係性があるようです。 CPUクレゞットの抂念 の項にもありたすが、1クレゞットあたりの定矩が以䞋になっおいたす。 1 CPU クレゞット = 1 vCPU × 100% 䜿甚率 × 1 分 1 CPU クレゞット = 1 vCPU × 50% 䜿甚率 × 2 分 1 CPU クレゞット = 2 vCPU × 25% 䜿甚率 × 2 分 䞊蚘の蚈算匏から、今回は「むンスタンスタむプを倉曎しおvCPUが半分の倀になった堎合はCloudWatchメトリクス䞊で衚瀺されるCPU䜿甚率は倍の倀になる」ず芋積もっお蚈算を行いたした。 たた、同じく CPUクレゞット獲埗 の項では、「衚内のベヌスラむン䜿甚率は vCPU 別の割合です。CloudWatch では、CPU 䜿甚率は vCPU 別に衚瀺されたす」ずあるので、そう読み取っお良さそうです。 たたここでは考慮しおいたせんが、実際にはむンスタンスの䞖代による差新しい䞖代だずパフォヌマンスの郚分で改善されおいたりするもあるので、そちらも圱響しおくるず思いたす。 倉曎 最埌に先ほど決めた倉曎埌のスペックに手動で倉えおいきたす。 今回は開発環境なのでダりンタむムを考慮せずに簡単に倉えるこずができたした。 これで削枛完了です。 埐々に芋盎しを行った結果以䞋のようにEC2の䜿甚量を半分以䞋に枛らすこずができたした Cost Explorer などで実際に削枛されおいるのを芋るずモチベヌションが䞊がっお嬉しいですね。 たずめ 今回むンスタンスタむプの芋盎しやEC2の割匕仕様を調べるにあたっおは、ドキュメントから刀別が぀かない点も倚く、実際の事䟋を参考に倚分こういう仕様だろう、ずいう掚定をしながらずりあえずやっおみる郚分がそこそこありたした。 䞀通り各むンスタむプの特城や割匕プランを把握しおおくこずで、実際の運甚にも圹立おるず思うので、たずはドキュメント化などをし぀぀チヌム内での認知䞍可を䞋げお、少しず぀瀟内の共通知にしおいきたいなず思っおいたす。 怜蚌環境ずはいえ、初めおむンスタンスタむプを倉えたずきはこれでよいのかなず䞍安になったので、実際に倉曎したり買っお孊べる環境があるず良いなず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに 「春から゚ンゞニアだけど䜕もわからなくお䞍安。どんな準備をしたらいいのだろう」 そんなお悩みを抱えおいる人達に向けお、ニフティの゚ンゞニアが曞き䞊げたブログの䞭から新米゚ンゞニアに是非読んで頂きたいブログを厳遞したした。 このブログには以䞋の内容が曞かれおいたす。 新米゚ンゞニアにおすすめな汎甚的な技術曞 業務効率化方法 新人゚ンゞニアずしおの心構え   【初心者向け】゚ンゞニアになりたいなりたおの人におすすめの本3遞 【初心者向け】゚ンゞニアになりたいなりたおの人におすすめの本3遞 こちらのブログではネットワヌク、DB、Linuxずいった様々な芳点で初孊者向けの曞籍を玹介しおいたす。 特定の蚀語に䟝存しない汎甚的な内容なので、たずはこれらの䞭から䜕か手に取っおみるのはいかがでしょうか。 技術初心者の私が業務䞭に埗た、仕事の効率化の方法の話 技術初心者の私が業務䞭に埗た、仕事の効率化の方法の話 圓時入瀟幎目だった瀟員が実務を通しお圹に立った業務効率化Tipsに぀いおたずめおいるブログです。 ツヌル導入だけでなくCLIのコマンド単䜍のTipsもありたす。これはず思ったものがあれば明日から取り入れおみたしょう。 効率化小ネタ集 効率化小ネタ集 以䞋のような䟿利なツヌルの導入方法や掻甚方法に぀いおたずめおいたす。 アプリケヌションの定期実行を可胜にする「タスクスケゞュヌラ」 特定のペヌゞからのみ怜玢を行う「サむト内怜玢」 珟圚開いおいるりェブペヌゞに察しおJavaScriptの凊理を適甚する「ブックマヌクレット」 これらは応甚が効く内容のため、芚えたら早速業務に掻甚できるかもしれたせん。 新人のすゝめ 文系卒が゚ンゞニアずしお過ごした入瀟1幎目の気付き 新人のすゝめ 文系卒が゚ンゞニアずしお過ごした入瀟1幎目の気付き 新人゚ンゞニアの時に感じた䞍安や悩みを語り぀぀、そこから今に至るたでに埗た気付きを語っおいたす。 入瀟しお間もない時期は仕事の進め方や質問の仕方などで困っおいたせんか そういった堎面でこちらのブログに曞いおある内容を思い出しおみおください。   トラブル察応で私はいっぱい成長しおきた トラブル察応で私はいっぱい成長しおきた 長幎゚ンゞニアをしおいた瀟員が、「゚ンゞニアの孊習ず成長」に぀いお自身の経隓を通しおお話しおいたす。 孊習を行っおいく䞭で䜕を倧切にすべきか、成長できる人はどういった状況にある人なのか興味がある堎合は是非読んでみおください。   さいごに 今回は新米゚ンゞニアに向けたブログたちを玹介したした。 興味を匕く点や新たな発芋はありたしたか。 NIFTY engineeringでは様々な技術の話題・情報を取り䞊げおいたす。 どれも玠敵なブログばかりですので是非芗いおいっおください。 このブログが、新たな挑戊を始めるための䞀歩になればず考えおいたす。 たた、貎方が゚ンゞニアの䞀人ずしおご掻躍できるこずを心から祈っおおりたす ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
マむ ニフティ ずいうニフティ䌚員向けアプリのチヌムで、スクラムマスタヌを務めおいる西野です。 スクラムマスタヌずしおPOプロダクトオヌナヌのサポヌトが十分にできおいるか課題を感じおおり、去幎PO向けの研修を受けおきたした。研修䞭、POずしお振る舞っおみるず「意思決定の怖さ」を感じるシヌンが倚くあり、それをきっかけずしお「効果的な意思決定」に぀いお考えおみたした。 POでなくずも、小さなものから倧きなものたで䜕かを決定するずきに、少し䞍安な気持ちになったりしたせんか。 䟋えば、倖食時のメニュヌ遞択は、意思決定の個人的な傟向が珟れる䞀䟋です。自分はわりずすぐにメニュヌを決められるのですが、泚文を取る時に突然倉曎しおしたい、友達に「ええ  」ず蚀われるタむプです。 マむ ニフティでは、意思決定の際に少しず぀デヌタ面での理由づけができるような環境を敎えおきたした。今回は、デヌタでどのように意思決定を行うかに぀いお玹介したす。 意思決定のプロセス なんずなくする意思決定も、理由を぀けおする意思決定も、等しく意思決定ではありたす。意思決定には様々な方法がありたすが、代衚的なものに぀いお挙げおみたした。たずはそれぞれの特城を把握したしょう。 盎感 合理的意思決 倚数決 コンセサスをずる デヌタドリブンで行う 盎感で決める 「肌感でこっちがいい」「えいやで決めたしょう」「経隓䞊こちらがいいず思う」ずいうものです。 GOOD 即断できる BAD 意思決定者のバむアスがかかる 呚囲ぞの説明や説埗が難しい 決断者も自分を説埗しきれおおらず、遞ばなかった遞択肢で迷いだす 効果があっおも再珟性がない 盎感は、経隓者が䞀番倚い意思決定方法ずいえたす。BADポむントも倚いですが、最短で意思決定ができるメリットが倧きく倚甚されがちです。 匷力なリヌダヌシップ䞋でないず機胜しにくく、もし機胜しおもそのリヌダヌがいなくなるず意思決定ができなくなっおしたうずいう課題がありたす。 合理的意思決定 すべおの遞択肢を比范怜蚎し最良を遞ぶ方法です。 GOOD 再珟性が高い 関係者ぞの説埗がしやすい BAD ずおも時間がかかる すべおの遞択肢を出せる情報があるずは限らない 比范怜蚎の過皋で「どのような理由で遞択に至ったか」ずいう理論がうたれるため、もしその意思決定が効果的だった堎合、その成功は再珟できる可胜性が高いです。 しかし、珟実問題ずしお「すべお」の遞択肢を出せたずいう蚌明の困難さ、それを出すたでにかかる時間は膚倧になりやすいです。たた、ここたでの合理性を求められるような意思決定のシヌンは限られたす。 倚数決 倚数決原理です。賛同者が倚い方で決定したす。 GOOD 即断できる BAD 倚数決に参加しおいない人ぞの説明や説埗が難しい 再珟性がない 少数掟の意芋が無芖されおしたう 倚数決で決める際に重芁なこずは、関係者党員がその堎に参加しおいるこずです。もし䞀郚の人だけで決をずり「倚くがそう思った」ずいう説明をしたずしお、関係者は玍埗がいくでしょうか。 遞択の理論がないので、メンバヌの入れ替わりや状況・気分などが圱響し、うたくいったずきの再珟性もありたせん。 少数意芋を支持した人ずの分断を招いおしたうこずも課題です。 コンセサスをずる 関係者党員の合意圢成をしたす。 GOOD 関係者の分断が起きない 合意をずる課皋である皋床の理論が生たれれば、再珟性がある BAD 時間がかかる コンセサスをずるべき範囲を決めにくい みんなが玍埗するたでやりきるこずができればいいですが、そうではない堎合、劥協による同調を招きやすいです。 もし玍埗できるたでやりきれたずしおも、合意しおない人・すでに合意しおいる人の間に枩床差がうたれ、モチベヌション維持が課題ずなりたす。 デヌタドリブンで行う デヌタを起点ずしお意思決定を行いたす。 GOOD デヌタを正確に解釈できれば再珟性が高い 関係者ぞの説埗がしやすい(客芳性をもちやすい BAD 䞀定の質のデヌタを事前に集めないずいけない デヌタを正確に解釈しないず再珟性が䜎くなる 革新的なアむデアは出にくい ナヌザヌの行動デヌタなどを元にした意思決定方法です。 デヌタを恣意的に解釈しおしたわないかずいった課題はあるものの、デヌタ゜ヌスを開瀺しおいればそれが正しいかずいう怜蚌も可胜です。 意思決定の根拠がはっきりずしおいるので、意思決定埌の迷いや倉曎がおきにくい利点がありたす。 意思決定のポむント 意思決定は、プロダクトやチヌムを良い方向にも悪い方向にも動かすこずがありたす。䜕かを動かすためには、意思決定を行うこずが重芁です。しかし、頻繁に意思決定を倉曎するこずは、プロダクトやチヌムを䞍安定にする可胜性がありたす。 しかし、理由もなく頻繁に意思決定を倉曎するような行為は、プロダクトやチヌムを厩壊させる方ぞどんどん動かしおしたいたす。 意思決定の方法をいく぀か玹介したしたが、意思決定のポむントは「遞んだ理由」だけでなく、それ以倖の遞択肢を最良だず「遞ばなかった理由」がわかるかどうかを重芖するず良いでしょう。 デヌタドリブンが意思決定に有効だず思う理由のひず぀に、決定に至る論理の立おやすさがありたすが、最も効果的な点は「意思決定を倉えにくい」こずにあるず思いたす。 人の意思ずいうものは、想像以䞊に脆く、倉わりやすいものです。そのために、䞻芳ではなく客芳的な情報をひず぀でも倚く持っおおくこずで、決定の倉化や遞ばなかった遞択肢に぀いお思い悩むこずを防ぐこずができたす。 デヌタを集める、共有する では、実際にニフティの䌚員向けアプリである「マむ ニフティ」で、どのようにデヌタドリブンによる意思決定を行なっおいるかを玹介したいず思いたす。 基本デヌタ「のみ」をダッシュボヌドに衚瀺する アプリをリリヌスする前の時点、぀たりデヌタを集める前の意思決定は、実デヌタに基づいた刀断ができたせん。珟実が芋えおいない段階では、あたり確認するデヌタ範囲を欲匵らないこずが倧切です。 デヌタ収集を開始するにあたり、最も重芁なのは、必芁最䜎限の条件を満たしおいるかを確認するこずです。 デヌタ収集が可胜な必芁最䜎限のデヌタを特定できるか ダッシュボヌドの内容が必芁最䜎限の範囲に絞られおいるか 䞊では必芁最䜎限のデヌタず曞きたしたが、本圓はリリヌス初期から可胜な限りデヌタの蓄積をしおおいたほうが良いです。これは、適切なデヌタの欠劂が正確なデヌタ解釈を劚げ、効果的な意思決定を遅らせる可胜性があるためです。 しかし、どれだけ網矅的にデヌタを収集しようず努力しおも、リリヌス埌には必ずず蚀っおいいほど必芁なデヌタが䞍足しおいるこずに気づきたす。 いち早くデヌタ蚈枬を開始するこずず、リリヌス前にデヌタ収集点を網矅するこずは盞反するこずに泚意しおください。適切な劥協点を探る必芁がありたす。 デヌタは意思決定に掻甚されるため、意思決定者だけでなく、関係者党員にずっお意味のある指暙ずしお可芖化されるべきです。 マむ ニフティの堎合、最䜎限の可芖化ずしお、ログむンナヌザヌの环蚈ず日・週・月のアクティブナヌザヌ数をダッシュボヌドに衚瀺するこずに決めたした。 ダッシュボヌドに衚瀺する内容を決めるコツは「もしかしたらいるかも」レベルの情報は省いおしたうこずです。プロダクトの䞻芁KPIや、成長にずっお本圓に必芁な数字だけに絞りたす。 画面衚瀺やボタンタップのむベントなども取っおいたすが、初期段階では毎日芋るダッシュボヌドにはあえお茉せおいたせん。毎日芋る必芁があるデヌタず、意思決定をするために必芁なデヌタは粒床や質が異なるからです。 フィヌドバックを反映する いったん最䜎限の情報が芋られるようになったダッシュボヌドができたら、それを関係者に芋せ、デむリヌで知りたい情報に぀いおフィヌドバックをもらいたす。 フィヌドバックは、ダッシュボヌドの運甚開始埌、䞻芁メンバヌ党員が1-2週間は毎日芋たうえでの芁望を採甚したほうがより効果的です。 私たちスクラムチヌムの堎合、デむリヌスクラムでダッシュボヌドを毎日芋お、気づいたこずを共有するようにしおいたす。 䟋えば、デむリヌでアクティブナヌザヌを芳察する䞭で「回線の契玄コヌスによっおナヌザヌ行動が異なるのでは」ずいうフィヌドバックがありたした。 コヌス別の継続率をダッシュボヌドに远加しおからは、䌚員党䜓向けの斜策だけでなく、コヌス別のニヌズに応えるための斜策も動き出した実感がありたす。 なかなか芋せられない情報が倚いので、ダッシュボヌドの䞀郚分の雰囲気だけ   ダッシュボヌドを成長させる ダッシュボヌドを掻甚するこずで、デヌタドリブンによる意思決定プロセスが促進されたす。 プロダクトの成長や斜策の効果を芖芚的にリアルタむムで評䟡し、継続的な改善に぀なげるこずができるからです。 継続的な改善斜策においお、チヌムは斜策立案時にその斜策が数倀で効果枬定可胜であるかを確認し、ダッシュボヌド䞊でその斜策効果が可芖化されるようにしたす。 ダッシュボヌドは、斜策やプロダクトの成長や方向性ずずもに項目の远加・削陀を行い、プロダクトの珟状に適合するように管理し続けたす。 ダッシュボヌドの導入・運甚フロヌ図 ここたでの内容をフロヌ図にするずこうなりたす。 デヌタドリブンを始めるための工倫 デヌタドリブンは、新芏プロダクトの立ち䞊げや、斜策が少ない段階では比范的受け入れやすいです。 䞀方で、デヌタがあたり取れおいない既存プロダクトに今からデヌタを远加したい堎合、「やりたいこずがいっぱいあるのに、ナヌザヌから芋えないデヌタ郚分の優先床は䞊げられない」ずPOに受け入れられないケヌスもあるかもしれたせん。 この堎合、意思決定者は「自分はナヌザヌを理解しおおり、デヌタなんかなくおも意思決定はできる」ず思っおいたす。しかし本圓は、斜策を絞りきれず、䜕をしないかを決定できおない状態です。 開発者ずしお、この状態を受け入れおいいかは泚意したしょう。䞻芳による意思決定は、斜策Aをやっおいる途䞭で、やっぱり斜策Bがいいかも、ず蚀い出しやすい環境を぀くっおいたす。 やりたい斜策がどれだけたくさんあっおも、10個の斜策のうち、あえお9個を倱敗させたい人はいたせん。 デヌタがあるこずで、成功する斜策だけでなく倱敗する斜策もある皋床パタヌン化できたす。やらなくおもいい斜策を朰し、やるべき斜策にいち早くフォヌカスするためにも、デヌタ収集ず芋える化はセットで必芁です。 デヌタに基づく意思決定の効果 意思決定のプロセスそれぞれに利点ず欠点がある䞭で、デヌタドリブンによる意思決定の意矩は䜕でしょうか。 開発者は、POなど意思決定者の決断が効果的になるよう、デヌタ収集ずビゞュアラむれヌションで支揎するこずができたす。たた、意思決定者が決断埌に「やっぱり  」ず迷わせない仕組みを぀くるこずは、開発フロヌをシンプルにし、開発者自身の環境を守るこずにも繋がりたす。 デヌタドリブンを開始するず、よく「分析を専門的に孊習したわけではないので、デヌタを扱う自信がない」ずいう䞍安の声を聞きたす。 たしかに、デヌタ分析の専門性が高ければデヌタ解釈の粟床が高たりたす。しかし、どれだけ高い専門性をもっおいたずしおも、垞に正しい意思決定ができるわけではありたせん。 デヌタ分析の専門家でなくおも、デヌタを効果的に掻甚するこずは可胜です。「埌戻りをしない」「埌から迷わない」ための意思決定であれば、もし迷う気持ちがあっおもデヌタがその決定の劥圓性を裏付けおくれたす。 デヌタを掻甚した戊略的アプロヌチ ここたでデヌタの重芁性を語っおきたしたが、デヌタを集めるだけで自ずず効果的な斜策になるわけではないこずに泚意しおください。 デヌタを効果的に掻甚するためには、デヌタの解釈ず仮説の怜蚌、ひいおはPOず開発の協力が䞍可欠です。 POが戊略を立おる際は、事実ず掚枬を分けるこずに気を぀けおください。そしおその掚枬をできるだけ掚枬でなくなるように怜蚌し、プロダクト戊略を組織の目暙ず合臎させおいきたす。 開発チヌムは、ABテスト、アンケヌト回答内容ずいったさたざたなデヌタを組み合わせるこずで、POの仮説怜蚌を支揎したす。 このような倚角的なデヌタ分析により、掚枬の粟床を高め、戊略の砎綻リスクを軜枛するこずが可胜です。 デヌタドリブンなアプロヌチを成功させるには、単にデヌタを集めるだけでなく、そのデヌタを基に仮説を立お、怜蚌し、そしお戊略を調敎するずいう継続的なプロセスが必芁です。 デヌタを基に、明確で説埗力のある意思決定を行うこずでプロダクトの成長に繋げおいきたしょう 私たちマむ ニフティチヌムも、デヌタドリブンによる意思決定を行なっおいたす。2024幎4月珟圚、アプリ゚ンゞニア特にiOSを募集䞭です カゞュアル面談もやっおたす 5月䞭旬ごろから面談可胜です ぜひお気軜にお問い合わせいただければ幞いです。 求人情報は以䞋よりご確認ください。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに こんにちは。宮氞です。 友人が勉匷し始めるずいうのでノリで受隓しおきたした。申請曞取り寄せから免蚱申請たで䞀連の䜓隓談を曞いおいきたす。 先に癜状するず、8時間勉匷で合栌したのは私の事前知識が関係しおいたす。勉匷面以倖の工皋が他の資栌ず比べおかなり特殊だったので、これから受隓する人の参考になればず思いたす。 ※2024幎4月から受隓申請等の手続きが色々倉わったようです。受隓䌚堎が远加された・電子申請ができるようになったらしいですが、あくたで私の䜓隓談ずしお読んでいただければず思いたす。 衛生管理者ずは 職堎においお劎働者の健康障害を防止するために、䞀定の人数以䞊がいる事業堎に察しお有資栌者を遞任しなければならないず定められおいたす。その資栌が衛生管理者免蚱です。 法定の有害業務を扱う事業堎も担圓できる第䞀皮衛生管理者ず、有害業務を陀く業務を扱う事業堎を担圓できる第二皮衛生管理者がありたす。今回は第二皮衛生管理者を受隓したした。 色々条件はありたすが、垞時50人以䞊の劎働者がいる事業堎には少なくずも1人以䞊の衛生管理者がいるはずです。思ったより身近な資栌です。 受隓資栌 第䞀皮・第二皮共に受隓資栌が決たっおいたす。 劎働衛生の実務に埓事した経隓 が必芁で、必芁な幎数は孊歎によっお違いたす。私は「倧卒埌、1幎以䞊の実務」ずいう受隓資栌を利甚したした。ほかにも10パタヌン以䞊ありたすが、どれも実務経隓が必芁です HP参照 。 受隓申請時に 劎働衛生の実務に埓事した経隓 があるこずの蚌明曞を事業者に曞いおもらい、それを提出したす。぀たり自分で適圓に経歎があったこずにはできたせん。 劎働衛生の実務 にどのような業務が圓たるかは 既定の蚌明曞 に曞いおありたす。該圓するか分からない堎合は事前に詊隓センタヌぞ問い合わせるず良いそうです。 受隓申請曞取り寄せ 衛生管理者詊隓は受隓申し蟌みが 郵送申請のみ で、既定の受隓申請曞を郵送で取り寄せる必芁がありたす。請求方法の案内に埓っお取り寄せたす。封筒に必芁郚数や䜏所のメモ、切手を貌った返送甚封筒を入れお送りたす。 什和ずは思えないアナログスタむル です。 投凜から1週間で受隓申請曞が届きたした。冊子になっおおり、申請曞・事業者蚌明曞・受隓料払蟌甚玙・受隓申請ず詊隓圓日の泚意事項などがすべおたずたっおいたす。HPに曞いおいない情報もすべおたずたっおいるので、受隓を完党に決めおない堎合でも受隓申請曞を先に取り寄せおしたう方が良いず思いたす。 1通のみ取り寄せにするず曞き損じや再受隓するずきに再床取り寄せる必芁が出おきたす。面倒なので私は2通取り寄せたした。 ※ブログ執筆時に協䌚HPを芋たずころオンラむン申請が远加されたようです。どちらにしろ郵送が必芁なようですが、少しは䟿利になったみたいです。 受隓申請必芁蚌明曞の準備 先述の通り受隓資栌が決たっおおり、受隓資栌を満たすこずの蚌明曞を受隓申請時に添付する必芁がありたす。私の堎合は 倧孊の卒業蚌明曞 劎働衛生の実務に埓事した経隓に぀いおの事業者蚌明曞 を準備したした。私は倧孊→倧孊院→就職ずいう経歎で、倧孊院圚籍䞭にアルバむトをしおいたので、倧孊院圚籍䞭のアルバむト経隓で受隓資栌を満たせたす。元アルバむト先に頌み蟌んで事業者蚌明曞を曞いおもらいたした。 申請曞は冊子に䟋があるのでそれに埓っお曞きたす。受隓䌚堎は遞択肢がなく、関東圚䜏であれば千葉にある関東安党衛生技術センタヌです2024幎4月から東京詊隓堎が远加されたようです。月5~6回ほど詊隓が行われおいたす。HPに 詊隓の申し蟌み状況が芋れるペヌゞ があるので、先に確認したほうが良いです。 受隓料払蟌甚玙の控えず顔写真を受隓申請曞に貌り、郵送したす。 投凜から1週間で受隓祚が届きたした。 勉匷方法 第二皮衛生管理者の詊隓科目は 劎働衛生有害業務に係るもの以倖のもの 関係法什有害業務に係るもの以倖のもの 劎働生理 の3科目です。各科目40%以䞊か぀合蚈60%以䞊で合栌です。 第䞀皮衛生管理者は䞊蚘に加えお 劎働衛生有害業務に係るもの 関係法什有害業務に係るもの が远加されたす。科目ごずの問題数が若干違いたすが、科目の範囲は倉わりたせん。 たた、第二皮衛生管理者を持っおいる人が第䞀皮衛生管理者を受隓する際は、差分の科目のみ合栌すればよいずいう制床もありたす。完党䞊䜍互換です。 先述の通り、第䞀皮ず第二皮は科目数の違いだけなので、テキストは第䞀皮衛生管理者のものを遞びたした。第二皮に比べお第䞀皮のほうがテキストが充実しおいるためです。 たずは芁点がたずたっおいるテキストを䜿っお詊隓範囲党䜓を拟っおいきたした。範囲は広いですが詊隓に出るポむントは9割決たっおいるので、テキストが倧事ず蚀っおいるポむントを確実に芚えおいきたす。 ある皋床知識が付いたら過去問呚回に入りたした。月に3~4回行われおいる詊隓ずいう事もあり、半分以䞊が過去問から出題されたす。なので、過去問をひたすら繰り返しお完ぺきにしたした。 総勉匷時間は玄8時間でした。ずいうのも、぀い数幎前たで塟講垫のアルバむトをしおおり、䞭孊生で習う理科の内容を完ぺきに芚えおいたす。突然䞭孊校の定期テストを枡されおも満点を取る自信がありたす。 出題範囲には䞭孊生の理科で扱うような内容も倚く、远加で芚えなくお良い内容が倚かったため、短時間の勉匷で合栌できたした。消化酵玠の名前や圹割・心臓の郚屋の名前などを憶えおいる方は比范的簡単に勉匷できるかず思いたす。 詊隓䌚堎ぞのアクセス 詊隓䌚堎は倚くなく、関東圚䜏であれば千葉にある関東安党衛生技術センタヌに行くこずになりたす。  この関東安党衛生技術センタヌ、 お䞖蟞にも䟿利な堎所ずは蚀えない 所にありたす。東京駅から玄1時間ほどの所にあるJR五井駅から、詊隓日のみ運行しおいる乗り合いバスで20分です。 私は面倒だったので車で行っおしたいたした。無料駐車堎はありたすが受隓者に察しお少ないです。平日でも 詊隓開始1時間前には満車 になっお止められない人が出おきおいたした。車で行く際はかなり早めに行くこずをおすすめしたす。 たた、䌚堎の呚りにはコンビニ等が䞀切ないです。食べ物飲み物は持参したほうが良いです。 詊隓 詊隓は孊校の教宀を広くしたような郚屋でした。いわゆる「小孊校みたいな机ず怅子」で、荷物を眮くスペヌスが少なかったです。空調はちゃんずしおおり、暑くも寒くもない環境でした。 䞀郚屋に100人ほどおり、幎霢局は30~40代が倚く、男女比はバラバラでした。 カンニングに぀いお厳しめで、消しゎムの裏、受隓祚、電卓に曞き蟌みが無いかしっかりチェックされたした。詊隓開始前ず退出時のダブルチェックです。疑わしいものは持っお行かないほうが無難です。 詊隓時間は3時間あるのですが、私は20分で解き終わりたした。過去問呚回しおいれば芋たこずある問題ばかり出おくるので䞀瞬で終わりたす。1時間経過するず途䞭退出できるので、䜕床も解きなおしをしお途䞭退出したす。半分以䞊の人が1時間経過時点で途䞭退出するので、時間に远われる詊隓ではないです。 垰る際に、 免蚱発行の必芁曞類を持っお垰る必芁がありたす 。受付のような堎所に倧量に眮いおあるので取っお垰りたす。忘れるず郵送で取り寄せる必芁があるそうなので、合栌した自信がなくおも持っお垰ったほうが良いです。 結果発衚・免蚱申請 詊隓から1週間埌、HPで合栌者の受隓番号䞀芧が掲茉されたす。その数日埌に合栌通知曞が郵送されたす。 詊隓時に持っお垰っおきた免蚱申請甚玙を蚘入し、収入印玙を貌り、合栌通知曞の原本を同封しお郵送したす。 2週間埌に免蚱が届きたした。これで晎れお衛生管理者ず名乗るこずができたす。 かかった費甚 受隓料 8800円 他手数料免蚱申請など2000円 切手代 2192円 テキスト代 3190円 亀通費 玄5000円 合蚈 箄20000円 母数の倧きい詊隓なので、受隓料やテキストは良心的な倀段です。蚌明曞取り寄せ等いろんな堎面で郵送を぀かうので、家の切手がものすごい勢いでなくなりたした。 たずめ 特に意味もなく受隓した資栌の割に準備や申請が倧倉だったのでブログにしおみたした。受隓者の倚い詊隓なので、この䜓隓談が誰かの助けになれば幞いです。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
ニフティのN1! Machine Learning Product Engineer 䞭村です。 最近はRustを曞いおいお、TerraformずRustの組み合わせでの知芋がネット䞊にないなず思ったので曞き残したす。 TerraformでLambdaのデプロむを完了させる 業務利甚からプラむベヌト開発に至るたで、自分自身はLambdaのデプロむは倚くをTerraformで完結させおいたす。 Terraformにアプリケヌションコヌドを含めたくないずいう声があるのは知っおいるのですが、Lambdaはちょっずしたコヌドを曞くこずも倚く、特にプラむベヌトの開発などにおいおはLambda1個をデプロむするためにCI/CDを敎備したりするのは倧袈裟すぎるなず考えおいたす。そこで、自分自身はLambdaのアプリケヌションコヌドもむンフラの䞀郚だず考えお、terraform applyのみでデプロむたで完結させるようにしおいたす。 今回はその手順を蚘したす。 ここからの手順は以䞋のレポゞトリにコヌドを残しおいたすので、こちらも参照しおください。 inakam/cargo-lambda-terraform-sample Contribute to inakam/cargo-lambda-terraform-sample development by creating an account on GitHub. github.com Cargo LambdaでRustコヌドを準備する Rustのコヌド管理にはCargo Lambdaを甚いたす。 cargo-lambda/cargo-lambda: Cargo Lambda is a Cargo subcommand to help you work with AWS Lambda. Cargo Lambda is a Cargo subcommand to help you work with AWS Lambda. – cargo-lambda/cargo-lambda github.com LambdaにRustコヌドをデプロむするためには、クロスコンパむルなどで適切な蚭定をする必芁があるのですが、cargo-lambdaはそれらの蚭定をやりやすくしおくれたす。 今回はTerraformでデプロむするので、実はcargo-lambdaを䜿う必芁性は薄い自前でRustのコンパむル蚭定などを調敎すればそれでもデプロむ可胜のですが、プロゞェクトのセッティングなどでも手間が少なくなるので、cargo-lambdaを䜿甚したす。 cargo lambdaのむンストヌル Macの堎合は以䞋でcargo-lambdaをむンストヌルしたす。 brew tap cargo-lambda/cargo-lambda brew install cargo-lambda そのほかのシステムにおいおは、以䞋を参考にむンストヌルしおください https://www.cargo-lambda.info/guide/installation.html cargo lambda new cargo-lambdaを䜿っおLambda関数のテンプレヌトを䜜成したす。 cargo lambda new --http rust-lambda 今回はAWS Lambda Function URLsを䜿いたいので、HTTP functionを統合するようにしおテンプレヌトを䜜成したす。lambda_httpが䜿える状態でテンプレヌトが䜜成されたす ビルドしおみる 䜜成されたフォルダに移動しお、プロゞェクトをビルドしおみたしょう。 cd rust-lambda cargo lambda build --release --arm64 コヌドのコンパむルが無事に完了すれば、コヌドの準備は完了です。 Finished release [optimized] target(s) in 30.26s TerraformでLambdaをデプロむする準備をする 次にTerraformを敎備しおいきたす。今回想定しおいるフォルダ構成は以䞋のようになりたす。 . ├── rust-lambda │   ├── Cargo.lock │   ├── Cargo.toml │   ├── src │   │   └── main.rs │   └── target └── terraform ├── lambda.tf ├── lambda_archive ├── modules │   └── lambda_rust_module │   ├── main.tf │   ├── outputs.tf │   └── variables.tf ├── outputs.tf └── variables.tf 先ほどcargo-lambdaで䜜成したrust-lambdaフォルダず同じ階局にterraformフォルダを䜜成し、そこから terraform apply を行うこずでデプロむできるようにしたす。 Terraformの蚭定 それではterraformフォルダ内にファむルを䜜成し、むンフラの蚭定を行なっおいきたす。 以䞋のようにTerraformを蚭定したす。S3 Remote Stateなどが必芁であれば適宜蚭定を远加したす。AWSのプロファむルはロヌカルマシンなどに蚭定されおいるプロファむル名を指定しおください。 terraform/variables.tf provider "aws" { region = "ap-northeast-1" shared_credentials_files = ["~/.aws/credentials"] profile = "[AWSのプロファむル名]" } terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } variable "name" { default = "rust-lambda" } Lambdaのモゞュヌルを䜜成する RustでLambdaにデプロむするためのモゞュヌルを䜜成したす。このようにモゞュヌルを䜜成しおおくこずで、Lambdaごず分離したい・Lambdaを別の甚途で増やしたいずいう堎合に手軜に増やすこずができお䟿利です。 modulesずいうフォルダの䞭にlambda_rust_moduleフォルダを䜜成し、以䞋の蚘述をしたす。 terraform/modules/lambda_rust_module/variables.tf variable "function_name" { description = "The name of the Lambda function." type = string } variable "role" { description = "The ARN of the IAM role to be used by Lambda function." type = string } variable "environment_variables" { description = "A map of environment variables to pass to the Lambda function." type = map(string) default = {} } variable "rust_src_path" { description = "The path to the Lambda function's Rust project." type = string } variable "cargo_lambda_env_name" { description = "name in cargo lambda new [name]" type = string } variable "lambda_zip_local_path" { description = "The path where the Lambda function's zip archive will be saved." type = string } terraform/modules/lambda_rust_module/main.tf output "lambda_function_url" { value = aws_lambda_function_url.this.function_url } terraform/modules/lambda_rust_module/variables.tf # Lambdaの定矩 resource "aws_lambda_function" "this" { function_name = var.function_name filename = data.archive_file.this.output_path source_code_hash = data.archive_file.this.output_base64sha256 role = var.role architectures = ["arm64"] handler = "bootstrap" runtime = "provided.al2" timeout = 30 environment { variables = var.environment_variables } } resource "aws_lambda_function_url" "this" { function_name = aws_lambda_function.this.function_name authorization_type = "NONE" } # ロヌカル環境でcargo-lambdaでビルドするための蚭定 # ファむルのsha256ハッシュを党お連結させ、連結した文字列からsha512ハッシュを蚈算し、差分があればビルドする resource "null_resource" "rust_build" { triggers = { code_diff = sha512(join("", [ for file in fileset(var.rust_src_path, "**/*.rs") : filesha256("${var.rust_src_path}/${file}") ])) } provisioner "local-exec" { working_dir = var.rust_src_path command = "cargo lambda build --release --arm64" } } # バむナリをzip化 data "archive_file" "this" { type = "zip" source_file = "${var.rust_src_path}/target/lambda/${var.cargo_lambda_env_name}/bootstrap" output_path = var.lambda_zip_local_path depends_on = [ null_resource.rust_build ] } このTerraformコヌドの䞭では、ロヌカル環境でビルドを行い、バむナリをzip化し、Function URLs付きのLambda関数ずしおデプロむするずいう構成が含たれおいたす。 ファむルに぀いおハッシュを蚈算するこずで、差分があった時のみデプロむするずいうこずを可胜にしおいたす。 Lambdaを蚭定する モゞュヌルが完成したらLambdaを䜜成したす。 terraform/lambda.tf module "api_lambda" { source = "./modules/lambda_rust_module" function_name = "${var.name}-api" role = aws_iam_role.lambda_iam_role.arn rust_src_path = "../rust-lambda" cargo_lambda_env_name = "rust-lambda" lambda_zip_local_path = "../lambda_archive/api.zip" environment_variables = { RUST_BACKTRACE = 1 } } Lambdaに付䞎するIAM暩限も同時に䜜成したす。Lambdaから䜿うサヌビスが増えおきたら、ここの暩限を远加するずいいでしょう。 terraform/iam.tf # lambda甹Roleの蚭定 resource "aws_iam_role" "lambda_iam_role" { name = "${var.name}-iam-role" assume_role_policy = <<POLICY { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "Allow", "Sid": "" } ] } POLICY } # lambda甹Policyの䜜成 resource "aws_iam_role_policy" "lambda_access_policy" { name = "${var.name}-access-policy" role = aws_iam_role.lambda_iam_role.id policy = <<POLICY { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents" ], "Resource": "*" } ] } POLICY } 実際にデプロむを行う terraformフォルダ内から実際にデプロむしおみたしょう。 $ terraform init $ terraform apply 最埌に出おくるURLにアクセスしお、Hello worldが衚瀺されるず完成です。 Apply complete! Resources: 5 added, 0 changed, 0 destroyed. Outputs: api_lambda_function_url = "<https://4wrzwdaows4h3z7vcdc2xlodou0wogpb.lambda-url.ap-northeast-1.on.aws/>" WebAPIを䜜成するためのLambdaテンプレヌト Rustを䜿甚したLambdaの堎合に比范的需芁があるのはWebAPIの䜜成だず思いたす。しかし、Lambdaを利甚した堎合にはactix-web, axum, Rocketなどのフレヌムワヌクをそのたた適甚するこずができたせん。たた、lambda_httpを䜿ったサンプルがWeb䞊に少なく、構築に苊劎するケヌスが倚いです。苊劎したした そこで以䞋のようにmain.rsを蚘述するこずで、Lambda䞊で比范的扱いやすくWebAPIを構築できるずいう䟋を茉せおおきたす。 rust-lambda/main.rs use std::future::Future; use std::pin::Pin; use lambda_http::{Body, lambda_runtime::Error, Request, RequestExt, Response, run, service_fn}; use serde_json::{json, Value}; type LambdaResult = Result<Response<String>, Error>; fn build_response(status_code: u16, message: Value) -> LambdaResult { let response = Response::builder() .status(status_code) .header("Content-Type", "application/json") .body(message.to_string()) .map_err(Box::new)?; Ok(response) } async fn echo_query(event: Request) -> LambdaResult { let params = event.query_string_parameters(); let name = params.first("name").unwrap_or("world"); let message = json!({ "message": format!("Hello, {}!", name) }); build_response(200, message) } async fn echo_body(event: Request) -> LambdaResult { let body = event.body(); let body_str = match body { Body::Text(text) => text, _ => return build_response(400, json!({ "error": "Invalid request body" })), }; let data: Value = serde_json::from_str(body_str)?; let response = json!({ "message": "Received POST request", "data": data }); build_response(200, response) } async fn not_found() -> LambdaResult { build_response(404, json!({ "error": "Not Found" })) } async fn hello_world() -> LambdaResult { build_response(200, json!({ "message": "Hello, world!" })) } fn route_request(event: Request) -> Pin<Box<dyn Future<Output = LambdaResult> + Send>> { Box::pin(async move { match (event.method().as_str(), event.uri().path()) { ("GET", "/hello") => hello_world().await, ("GET", "/echo") => echo_query(event).await, ("POST", "/echo") => echo_body(event).await, _ => not_found().await, } }) } #[tokio::main] async fn main() -> Result<(), Error> { run(service_fn(route_request)).await } rust-lambda/Cargo.toml [package] name = "rust-lambda" version = "0.1.0" edition = "2021" [dependencies] lambda_http = "0.11.1" tokio = { version = "1", features = ["macros"] } serde_json = "1.0.115" serde = { version = "1.0.197", features = ["derive"] } たた、axumはlambda_httpず統合しお利甚できるようなので、こちらを利甚しおもいいかもしれたせん。この蚘事のレビュヌ䞭に瀟内で教わりたした  aws-lambda-rust-runtime/examples/http-axum/src/main.rs at main · awslabs/aws-lambda-rust-runtime A Rust runtime for AWS Lambda. Contribute to awslabs/aws-lambda-rust-runtime development by creating an account on GitHub. github.com たずめ 今回はcargo-lambdaずTerraformを甚いおRustでLambdaの環境を手軜に構築する方法に぀いお解説したした。 勉匷がおらRustに觊れおみたのですが、AWSサヌビスずの組み合わせにおいおもRustの速床は非垞に高速で、孊習コストは高いずいうデメリットはありたすが、高速に動䜜するず蚀う䜕者にも倉え難いメリットを埗るこずができたす。特に埓量課金型のLambdaずいう環境においおは高速に動䜜するずいうのは金銭的にもメリットがあるず蚀えるず思いたす みなさんも良きRustラむフをお送りください。
基幹システムグルヌプ N1! オヌトメヌションスペシャリストの南川です。 今回は、Docker Compose v1 ( docker-compose コマンド) が GitHub Actions の Ubuntu ず Windows のむメヌゞで䜿えなくなった件に぀いお説明したす。 背景 2024幎4月3日の朝に、以前玹介したDockerむメヌゞのビルド倱敗を通知するGitHub Actionsのワヌクフロヌが倱敗しおいるのを確認したした。 GitHub Actions で Docker むメヌゞを定期的にビルドし、倱敗したら Slack に通知させる その時の実行結果のログ (䞀郚マスク枈み) は以䞋の通りです。 Run docker-compose build docker-compose build shell: /usr/bin/bash -e {0} env: ACTION_URL: https://github.com/***/***/actions/runs/*** /home/runner/work/_temp/********-****-****-****-************.sh: line 1: docker-compose: command not found Error: Process completed with exit code 127. どうやら、 docker-compose コマンドが芋぀からないようです。 原因 Ubuntu ず Windows むメヌゞから Docker Compose v1 が削陀されたのが原因でした。 2024幎4月1日から 3~4 日間 かけお削陀されるずのこずです。 https://github.com/actions/runner-images/issues/9557 ちなみに、この Issue は GitHub ホステッドランナヌに プリむンストヌル枈みの゜フトりェア䞀芧ペヌゞ から芋぀けたした。 For the overall list of included tools for each runner operating system, see the  Available Images  documentation the runner images repository. https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#preinstalled-software 察応 以䞋のペヌゞを参照し、Docker Compose v1 から v2 に移行する必芁がありたす。 https://docs.docker.com/compose/migrate/ 今回のケヌスでは、 docker-compose build コマンドを docker compose build コマンドに曞き換えるだけで動くようになりたした。 修正前 - name: define run url run: echo "ACTION_URL=https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" >> $GITHUB_ENV - name: docker-compose build run: docker-compose build 修正埌 - name: define run url run: echo "ACTION_URL=https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" >> $GITHUB_ENV - name: docker compose build run: docker compose build 「 path:.github/workflows AND ("docker-compose build" OR "docker-compose pull") 」で怜玢するず、修正が必芁なワヌクフロヌファむルを確認できたす。 https://github.com/actions/runner-images/issues/9557#issuecomment-2033320632 https://docs.github.com/ja/search-github/github-code-search/understanding-github-code-search-syntax たずめ 今回の問題は、 Docker Compose v1 が非掚奚になっおからも docker-compose コマンドを䜿い続けおいたのが原因でした。 今回、すぐに気づけた芁因は 以前に䜜成した定期的にビルドするワヌクフロヌ のおかげであり、興味のある方は是非導入しおみおください宣䌝 みなさんも EOL に気を付けながら、ツヌルを䜿っおいきたしょう。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
前回の蚘事では、ニフティのオプションチヌムで働く瀟員に、業務内容やチヌム環境に぀いおむンタビュヌを行いたした。 今回はむンタビュヌの埌線をお届けしたす。前線はこちらの蚘事をご芧ください。 【むンタビュヌ】ニフティのオプションサヌビスを開発しおいるチヌムに仕事に぀いお聞いおみたした【オプション前線】 オプションチヌムではどんなスキルが䌞ばせたすか T.Mさん 幅広くやるのでフルスタック゚ンゞニアを目指せたす。䞭でも奜きな分野を䌞ばしおくずいうスタンスなので曎に各々の埗意分野で尖っおいけたすね。私はクリヌンアヌキテクチャヌやドメむン駆動蚭蚈に぀いお倖郚発信したりもしおいたす。 たけろいど さん Svelteで倖郚向けのむベントに登壇したり、UI/UX勉匷䌚を䞻催したりしおいたす。 H.Sさん @nifty ADクリヌナヌのむンフラは私が䜜りたした。むンフラのこずなら盞談に乗りたす。あずはいた勉匷しおいるKubernetesに぀いお瀟内向けの勉匷䌚を開いおいたすね。 T.Mさん 専門分野を瀟内倖に発信できる人材が育っおいっおたす。あずはチヌムの䜓制がスクラムなのでスクラムの知識が぀くし、サヌビスの立䞊げ>開発>運甹>グロヌス>サヌビス終了たでの党工皋を経隓できたすね。フロント゚ンド、バック゚ンド、むンフラ、それぞれ埗意分野がある゚ンゞニアがいお、どのスキルを䌞ばすにしおも目暙になる人が揃っおいたす。 ずヌたすさん サヌバヌサむドをPythonで䜜っおいるずころは珍しいず思いたすね。䞖の䞭javaが䞻流なので。Flask、マむクロフレヌムワヌクを身に着けおいきたい人にはずおもいいず思いたす。 チヌムで取り組んでいるこずを教えおください。 T.Mさん スクラム䜓制を採甚しおいるのですが、スプリントは1週間で回しおいお、コミュニケヌションの頻床を意識的に䞊げおいたす。1週間単䜍でプロダクトオヌナヌがやりたいこずが倉わったりするのでしっかりキャッチしたいんです。 ずヌたすさん 前の職堎では振り返りの習慣があたりなかったので、レトロスペクティブが新鮮でした。自分たちの仕事効率化にも぀ながるしニフティの仕事のしやすさにも぀ながっおいるず感じたす。 今埌の展望を教えおください。 T.Mさん 新しいサヌビスのリリヌスに向けお開発を進めおいたす。䞊行しお既存補品の改善も行うので、しばらくは2軞で動いおいく予定です。 H.Sさん 基盀の刷新もありたすね。 T.Mさん この先1幎はスケゞュヌルが埋たっおいたす楜しみです。 皆さんに぀いお教えおください。 䌑日はどう過ごしおいたすか T.Mさん たけろいどさんは料理ですよね たけろいど さん 料理はかなり奜きで、䌑日に関わらずやっおいたすね。最近お匁圓を぀くるようになりたした。 H.Sさん えらすぎでしょ 。 たけろいど さん パスタにはたっおいお、僕のパスタは䞖界䞀うたいです。 T.Mさん レトロスペクティブの時にパスタの写真芋せおもらうんですが、マゞでうたそうです。 ▲たけろいどさんのパスタ H.Sさん マむクラやパルワヌルドなんかのゲヌムもやりたすが、最近は勉匷しおたす。いたはKubernetesがアツいです。家にk8sのクラスタがありたす。毎日1時間やっおるコツコツやっおる感じです。 たけろいど さん  僕も毎日料理しおたす笑 ずヌたすさん 私はセキュリティ゜フトが奜きなんですが笑 䞭でもいわゆる゚ンドポむントセキュリティが奜きで。プラむベヌトでセキュリティ゜フトを党郚䜿っお怜蚌しおみたり、第䞉者機関のレポヌトを読んだりしおいたす。転職先にニフティを遞んだのはプロダクトに゚ンドポむントセキュリティがあり、そこが魅力を感じたからです。 T.Mさん ずヌたすさんにはこれから商品知識をいっぱい身に着けおもらっお、倖郚゚ンゞニアずの亀流䌚にもいっおほしいです。 いた楜しみなこずはなんですか たけろいど さん 秒速5センチメヌトルのリバむバル䞊映です H.Sさん CKAを受けるのが楜しみですね。 ずヌたすさん セキュリティ゜フト以倖の趣味のラむブ遠埁です。あずは䌚瀟のテニス郚に入っおいお、郚掻での亀流が楜しみですね。 T.Mさん 海倖出匵が控えおいるので、ロヌマのゎハンが楜しみです。 今回はニフティのオプション開発チヌムのむンタビュヌの様子をお届けしたした。ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する .is-style-rounded + .has-text-color{ font-size:95%; }
自己玹介 T.Mさん 新卒5幎目で、サブリヌダヌをやっおたす。入瀟時からオプションサヌビスの開発運甚を担圓しおいお、珟圚は垞時安党セキュリティ24や@ nifty セキュア・プラむバシヌなどのセキュリティサヌビスを䞭心に、おしゃべりなども担圓しおいたす H.Sさん 同じく新卒5幎目で、@nifty ADクリヌナヌのバック゚ンド、むンフラ䞭心に開発を行っおいたす。オプションチヌムには2023幎3月に配属されたした。前のチヌムでは課金システムチヌムの開発を担圓しおいたした。勉匷が趣味で今は CKA 取埗に向けお毎日コツコツ勉匷しおいたす。 たけろいどさん こんにちは、たけろいどです。フロント゚ンドずたけのこの里が奜きな新卒3幎目です。ずくにSvelteずいうフレヌムワヌクが奜きで業務・趣味問わずよく䜿いたす。奜きじゃないものはきのこの山です。察戊ペロ ずヌたすさん 2023幎10月に入瀟したばかりのキャリア瀟員です。ニフティに入瀟する前は金融系のシステム開発に関わっおいたした。前の職堎ではコヌディングを倖泚しおいたしたが今は自らコヌドを曞く機䌚を埗お゚ンゞニアらしい仕事ができる環境になったず思いたす。たたBtoBからBtoCぞの転向ずいう面もあり自分にずっお倧きな倉化でした。 ニフティの「オプションサヌビス」ずは ニフティの「オプションサヌビス」ずはなんですか T.Mさん 光回線サヌビスをニフティのメむンサヌビスず捉え、それに付属するサヌビスなのでオプションサヌビスず呌ばれおいたす。 垞時安党セキュリティ24、@nifty ADクリヌナヌ、@nifty たかせお365などたくさんのサヌビスがありたす。(オプションサヌビスの玹介ペヌゞは こちら オプションサヌビスを通じ、お客様に通信回線に留たらない付加䟡倀をお届けしたいずいう想いでサヌビスのブラッシュアップに日々取り組んでいたす。 ニフティのオプションチヌムに぀いお教えおください オプションサヌビスすべおをこのチヌムで担圓しおいるんですか T.Mさん このチヌムではオプションサヌビスの䞭でもセキュリティ系のサヌビスを担圓しおいたす。他のチヌムずしおは入䌚システムチヌム、サヌビスむンフラチヌム、メヌルチヌム、光電話や回線埓属系のものは回線チヌムがありたす。 たけろいど さん オプションに関わっおいるチヌム、改めお聞くず倚いですね T.Mさん オプションサヌビスチヌムは、オプションサヌビスを専業でやっおいる唯䞀のチヌムです。最近は回線ずは別にオプションサヌビスを単䜓ずしお販売するこずもあるので、オプションずいう枠を超えおメむンのサヌビスずしお提䟛しおいたりもしたすね。垞時安党セキュリティ24、@nifty ADクリヌナヌがそれにあたりたす。 このチヌムで立䞊げしたサヌビスはありたすか T.Mさん @nifty ADクリヌナヌに぀いおは立䞊げからやりたした。 ずヌたすさん 䌚瀟の売䞊にも貢献できおいる、チヌムの看板サヌビスず蚀えたすね。 開発スタむルや環境に぀いお教えおください。 たけろいど さん バック゚ンドはPython(Flask)で、フロントはSvelteかJinja2を䜿っおいたす。元はphpでしたが思い切っお刷新したした。コヌドに぀いおもリファクタリングが必芁だったので、環境倉曎に䌎い曞き換えたした。 T.Mさん フロントの刷新に぀いおはたけろいど君がグむグむ匕っ匵っおくれたした。 たけろいど さん そう、フロント゚ンドは自分が匕っ匵りたした。 Jinja2ずいう話が出おいたしたが、UI/UXの面でナヌザヌ䜓隓が䞋がるず考えおチヌムを説埗しお抌し切りたした笑。 T.Mさん フレヌムワヌク等々、たけろいど君に質問攻めをしおこれはやっおくれそうだなず思っお任せたした たけろいど さん ただ2幎目だったのですが、フロント゚ンドに詳しい人が自分しかいなかったので抌し切るこずができたした笑。 ベヌスはAPIもあったので土壌はずおもよくやりやすかったので先達に感謝です。無事モダンな環境を実珟できお良かったです。 どんな運甚があるか教えおください。 T.Mさん オプションチヌムにおける運甚ずはサヌバヌ保守等のいわゆる運甚だけではなく、お客様の困りごずを解消するための改善行動もありたす。 たけろいど さん 店頭でお客様からご盞談があった堎合、開発チヌムに察応䟝頌がくるこずがありたす。その堎で解決できた時はずおも嬉しいですね。 T.Mさん 䜿い方のサポヌトであったり、申し蟌み凊理をした぀もりができおいなかった堎合のリカバヌなどですね。お客様ず盎接お話しするこずで改善に繋げられるこずもありたす。 たけろいど さん 運甚はどうしおも時間がかかっおしたうので倧倉ですね。でも、ずおもやりがいがありたす。 今のチヌム䜓制になるたでの倉遷を教えおください。 T.Mさん 元は䌁画ず開発がワンチヌムでやっおいたんです。自分が12幎目のころは郚眲も䞀緒でした。その埌、組織改線によっお䌁画・開発に別れはしたしたが、そのころの経緯もあっおサヌビスに぀いおの意芋亀換も掻発ですしフィヌドバックを受ける機䌚も倚いですね。スクラム䜓制を採甚しおいるのですが、いたも毎朝デむリヌスクラムで話をしおたす。 H.Sさん 盎接䌚話する機䌚の他に、Slackでも密にやりずりしおいたす。仕様の確認なども気軜にできる関係なのでずおもいいですね。 ずヌたすさん 䌁画あっおの開発なので぀ながりを倧切にしおいたす。䌁画の方で契玄しおいるベンダヌの方ずも関わりを持぀ように心がけおいたす。 T.Mさん 商品を販売するバむダヌに商品の売り方を提案する堎にも、䌁画ず開発䞀緒になっお臚んだりしおいたす。取り扱っおいるプロダクトのベンダヌの拠点があるペヌロッパにいっお、珟地の゚ンゞニアず意芋亀換したりもしたす。 たけろいど さん 近々たた海倖に行きたすよね。次はどこでしたっけ。 T.Mさん ロヌマです。今回は䌁画ず僕ずで行っお、珟地の開発の゚ンゞニアやセヌルスず意芋亀換をする予定です。ちなみに昚幎はオランダぞいきたした。英語はぜんぜんなんですが笑、なんずかなりたす たけろいど さん 英語はオンラむンゲヌムでちょっず䜿うくらいですね笑。 T.Mさん 開発チヌムの話に戻りたすが、実は僕ずたけろいど君の二人䜓制になっちゃった時期があっお。そこにH.S君がヒヌロヌ的に他のチヌムからやっおきたんです。 H.Sさん ヒヌロヌかぁ笑。 圓時、自分は4幎目でキャリアを芋盎したかったんです。瀟内公募制床ずいう垌望したチヌムに異動できる仕組みがあるのでそれを利甚したした。前にいたチヌムでは課金システムのバック゚ンドずむンフラ呚りを担圓しおおり、4幎の䞭でいろんな経隓をさせおいただいたので知識はかなり぀いおいたのは確かですね。 ずヌたすさん 異動しおきお特に違和感ずかはなかったですか H.Sさん なかったです。党然違うスキルセットが必芁でしたが、元のチヌムは今のチヌムずの接点もありたしたし、蚀語は同じでPythonだったので党く問題ありたせんでした。 ずヌたすさん 私も前職でPythonを䜿っおいたのですぐに銎染めたしたね。 たけろいど さん ずヌたすさんっお前職ではどんなこずをされおいたんでしたっけ ずヌたすさん 金融系です。前職では開発はほが委蚗しおいたので、゚ンゞニアずしおプロダクトに関わる機䌚があたりなかったですね。基本的にBtoBになるのですが、BtoBだず玍品埌のサヌビスの姿が芋えないこずが倚いんです。ニフティでは内補開発ですし、BtoCなのでプロダクトに察するフィヌドバックが聞けたりや売䞊高を远うこずができるのでやりがいを感じたす。 埌線に続きたす 今回はニフティのオプション開発チヌムのむンタビュヌの様子をお届けしたした。続きは埌線の蚘事をご芧ください。 【むンタビュヌ】ニフティのオプションサヌビス開発゚ンゞニアっおどんな人【オプション埌線】 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに  Gemini AI  事前準備  3分でAIアプリを䜜りたしょう  詳しい䜿い方 DIの導入  詊しおみよう はじめに はじめたしお。ニフティ株匏䌚瀟のLinです。 台湟出身のモバむルアプリ゚ンゞニアずしお、瀟内で「マむ ニフティ」の Android および iOS 版の開発を担圓しおおりたす。 2023幎末に、GoogleがGemini APIをリリヌスしたこずで、モバむルアプリでもAIサヌビスずの連携が容易になりたした。 今回はGemini AIアプリの䜜り方をご玹介いたしたす。  Gemini AI Gemini AIはGoogleが開発したマルチモヌダルAIモデルで、2023幎12月6日米囜時間に初リリヌスされたした。 マルチモヌダルのため、テキストだけでなく、動画や画像、音声など様々な皮類のデヌタを入力、出力ずしお扱えるこずができたす。 モデルは䞋蚘3皮類がありたす Gemini Ultra 非垞に耇雑で幅広いタスクに察しお最も高いパフォヌマンスを提䟛する、Gemini最倧のモデル。 Gemini Pro 匷力なパフォヌマンスを維持し぀぀、コストやレむテンシがバランスよく最適化された、䞭芏暡のモデル。 Gemini Nano デバむス䞊で実行甚に蚭蚈された、最も効率的なモデル。 䜎メモリデバむス甚にNano-118億パラメヌタ、高メモリデバむス甚にNano-232.5億パラメヌタが提䟛されたす。 Gemini AIのモデル皮類 2024幎珟圚、 Gemini Pro は1分間に60回のリク゚ストたで無料です。今回はGemini ProのAPIを䜿いたしょう。  äº‹å‰æº–å‚™ APIキヌ Android Studio Preview Jellyfishから Gemini API Starter が远加されたした。  3分でAIアプリを䜜りたしょう Android Studio PreviewJellyfishを起動しお、 Gemini API Starter を遞択したす。 プロゞェクト情報を入力したす。 先ほど䜜ったGemini APIキヌを入力したす。 入力したAPIキヌは local.properties での apikey に保存され、 BuildConfig を経由しお䜿われおいたす。 ビルドが完了するず、デフォルトアプリが䜜成されたした。 SDKの䟝存関係は、以䞋のようにモゞュヌルアプリレベルのGradle蚭定ファむル䟋 <project>/<app-module>/build.gradle.kts に蚭定されおいたす。 ... dependencies { ... // Gemini AI implementation("com.google.ai.client.generativeai:generativeai:0.1.2") }  è©³ã—い䜿い方 Gemini AIを呌び出すには、モデルずプロンプトの蚭眮が必芁です。 モデルは䞋蚘2皮類を䜿えたす gemini-pro文字のみの入力。 startChat 経由でチャット機胜を実装できたす。 history でチャット履歎の蚭眮ず確認が可胜です。 gemini-pro-vision画像ず文字の入力。 画像の入力は必須です。 文字のみの入力に察しおぱラヌが発生したす。 画像のフォヌマットはBitmapずなりたす。 たた、temperatureなどのコンフィグ蚭定ず 安党性蚭定 もできたす // 安党性蚭定 val harassment = SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.ONLY_HIGH) val hateSpeech = SafetySetting(HarmCategory.HATE_SPEECH, BlockThreshold.MEDIUM_AND_ABOVE) // コンフィグ蚭定 val config = generationConfig { temperature = 0.99f // 生成するテキストのランダム性を制埡 topK = 50 // 生成に䜿甚するトヌクンの环積確率を制埡 topP = 0.99f // 生成に䜿甚するトップkトヌクンを制埡 } プロンプトに぀いおは、モデルによっお内容が異なりたす。 gemini-proの堎合は以䞋の䟋をご参考にしおください // モデルを蚭眮したす val generativeModel = GenerativeModel( // 文字入力のみ modelName = "gemini-pro", apiKey = BuildConfig.apiKey ) val viewModel = GeminiViewModel(generativeModel) // ViewModelでプロンプトを蚭定したす class GeminiViewModel( private val generativeModel: GenerativeModel ) : ViewModel() { private val _uiState: MutableStateFlow<UiState> = MutableStateFlow(UiState.Initial) val uiState: StateFlow<UiState> = _uiState.asStateFlow() fun respond(inputText: String) { _uiState.value = UiState.Loading // プロンプトを蚭眮したす // 文字必須 val prompt = inputText viewModelScope.launch { try { val response = generativeModel.generateContent(prompt) response.text?.let { outputContent -> _uiState.value = UiState.Success(outputContent) } } catch (e: Exception) { _uiState.value = UiState.Error(e.localizedMessage ?: "") } } } } gemini-pro-visionの堎合は以䞋の䟋をご参考にしおください // モデルを蚭眮したす val generativeModel = GenerativeModel( // 画像文字入力 modelName = "gemini-pro-vision", apiKey = BuildConfig.apiKey ) val viewModel = GeminiViewModel(generativeModel) // ViewModelでプロンプトを蚭定したす class GeminiViewModel( private val generativeModel: GenerativeModel ) : ViewModel() { private val _uiState: MutableStateFlow<UiState> = MutableStateFlow(UiState.Initial) val uiState: StateFlow<UiState> = _uiState.asStateFlow() fun respond(inputText: String, inputImageList: List<Bitmap>) { _uiState.value = UiState.Loading // プロンプトを蚭眮したす val prompt = content { // 画像必須 inputImageList.forEach { image -> image(image = image) } // 文字 text(text = inputText) } viewModelScope.launch { try { val response = generativeModel.generateContent(prompt) response.text?.let { outputContent -> _uiState.value = UiState.Success(outputContent) } } catch (e: Exception) { _uiState.value = UiState.Error(e.localizedMessage ?: "") } } } } DIの導入 HiltなどのDI䟝存性泚入ラむブラリも導入したい堎合、以䞋の䟋をご参考にしおください // GeminiModule.kt @Module @InstallIn(SingletonComponent::class) object GeminiModule { // 必芁によるモデルのコンフィグ蚭定ず安党性蚭定を远加したす private val harassment = SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.ONLY_HIGH) private val hateSpeech = SafetySetting(HarmCategory.HATE_SPEECH, BlockThreshold.MEDIUM_AND_ABOVE) private val config = generationConfig { temperature = 0.95f topK = 50 topP = 0.9f } @Provides @Singleton @GeminiPro fun provideGemini(): GenerativeModel { return GenerativeModel( modelName = "gemini-pro", apiKey = BuildConfig.apiKey, safetySettings = listOf( harassment, hateSpeech ), generationConfig = config ) } @Provides @Singleton @GeminiProVision fun provideGeminiVision(): GenerativeModel { return GenerativeModel( modelName = "gemini-pro-vision", apiKey = BuildConfig.apiKey, safetySettings = listOf( harassment, hateSpeech, SafetySetting(HarmCategory.DANGEROUS_CONTENT, BlockThreshold.ONLY_HIGH), SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, BlockThreshold.MEDIUM_AND_ABOVE) ) ) } @Provides @Singleton fun provideGeminiRepository( @GeminiPro geminiProModel: GenerativeModel, @GeminiProVision geminiProVisionModel: GenerativeModel ): GeminiRepository = GeminiRepositoryImpl(geminiProModel, geminiProVisionModel) @Provides fun provideApplicationContext(application: Application): Context { return application.applicationContext } } @Qualifier @Retention(AnnotationRetention.BINARY) annotation class GeminiPro @Qualifier @Retention(AnnotationRetention.BINARY) annotation class GeminiProVision // GeminiRepository.kt interface GeminiRepository { fun getGeminiProModel(): GenerativeModel fun getGeminiProVisionModel(): GenerativeModel } // GeminiRepositoryImpl.kt class GeminiRepositoryImpl @Inject constructor( @GeminiPro private val geminiProModel: GenerativeModel, @GeminiProVision private val geminiProVisionModel: GenerativeModel ) : GeminiRepository { override fun getGeminiProModel(): GenerativeModel = geminiProModel override fun getGeminiProVisionModel(): GenerativeModel = geminiProVisionModel } // GeminiViewModel.kt @HiltViewModel class GeminiViewModel @Inject constructor( geminiRepository: GeminiRepository ) : ViewModel() { // 文字のみのモデル private val geminiProModel = geminiRepository.getGeminiProModel() private val chat = geminiProModel.startChat(history = emptyList()) // チャット機胜 // 画像文字のモデル private val geminiProVisionModel = geminiRepository.getGeminiProModel() ... } これで、ViewModelで䞀床GeminiRepositoryを泚入するず、2぀のモデルを利甚できるようになりたした。  è©Šã—おみよう メッセヌゞ画面を远加するず、以䞋のようなアプリを䜜れたす。 䞋蚘サンプルは自由にクロヌンしお詊せたす。 サンプル 今埌のモバむルアプリでは、たすたすAIサヌビスが導入されたす。 ぜひAI系のアプリ䜜りを䜓隓したしょう ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
はじめに こんにちは、䌚員システムグルヌプの枡邊です。 瀟内にNotionが導入されお2幎以䞊立ちたした。 最近は䜕でもNotionで管理すればいいじゃんずいう気持ちになっおきおいお、詊しにDB蚭蚈をNotionで行っおみたのでその感想を曞いおいきたす。 範囲 今回はDB蚭蚈における゚ンティティ抜出ずデヌタモデリング、ER図䜜成たでをNotionだけで行いたす。 ゚ンティティ抜出ずモデリング NotionはMermaid蚘法が䜿えるため、こちらを䜿っお゚ンティティ抜出を行うこずが可胜です。 しかし、いきなりコヌドベヌスで図を䜜成するのは難易床が高いため、今回はdraw.ioを䜿っお゚ンティティ抜出ずデヌタモデリングを行っおいきたす。 draw.io for Notion ずいう拡匵機胜を䜿うこずで、SVGファむルをNotionに貌り付けるだけで盎接draw.ioの操䜜を行うこずができたす。 ゚ンティティ抜出 今回はナヌザヌが蚘事投皿をし、そこにコメントを投皿できるサヌビスを実装するこずを想定しお蚭蚈しおいきたす。 デヌタモデリング 次に各テヌブルの関係性を玐づけおいきたす。 これもNotion䞊で操䜜できるので楜ですね。 ER図䜜成 ER図を䜜る前にテヌブル定矩をしおいきたす。 各テヌブルの属性情報をNotionのデヌタベヌスで管理しおいきたす。 実際に䜜ったものが以䞋になりたす。テヌブルでグルヌプ化するずかなり芋やすくなりたすね。 続いおこちらをMermaid蚘法を䜿っおER図化しおいきたす。 ここで䞀工倫しおMermaid蚘法に合う圢に敎えおいきたす。 Mermaidコピヌ甚のビュヌを䜜成し、型ず論理名をMermaid蚘法に合わせるための関数を䜜成したす。 今回は桁数を制限しおいるのでこちらを型ず合わせお衚瀺できるようにするため、新芏に 型Mermaid甚 ずいうプロパティを䜜成し、以䞋の関数を蚭定したす。 if(!empty(prop("桁数")), ((prop("型") + "(") + format(prop("桁数"))) + ")", prop("型")) 続いお論理名をダブルクォヌテヌションで囲っお゚ラヌが出ないようにするため、新芏に 論理名Mermaid甚 ずいうプロパティを䜜成し、以䞋の関数を蚭定したす。 ("\"" + prop("論理名")) + "\"" 完成したものが以䞋になりたす。 最埌に先ほど䜜成したテヌブルの内容をコヌドブロックに貌り付けおいきたす。 貌り付けはUSER,POST,COMMENTの䞭にコピペするだけです。 erDiagram USER { INT comment_id PK "コメントID" INT post_id FK "PostID" TEXT(10) user_id FK "ナヌザヌID" TIMESTAMP comment_at "コメント日時" TEXT content "内容" } POST { INT post_id PK "PostID" TEXT(10) user_id FK "ナヌザヌID" TIMESTAMP post_at "投皿日時" TEXT content "内容" TEXT title "タむトル" } COMMENT { TEXT(10) user_id PK "ナヌザヌID" TIMESTAMP last_login_at "最終ログむン日時" TIMESTAMP created_at "䜜成日時" TEXT(256) email_address "メヌルアドレス" TEXT password "パスワヌド" } USER ||--o{ POST : "Creates" POST ||--o{ COMMENT : "Has" USER ||--o{ COMMENT : "Writes" これで完成です。 テヌブル構成が倉わる堎合は、Notionのデヌタベヌスを修正しおコヌドブロックにコピペし盎すだけでER図の曎新ができるようになるので非垞に䟿利です 終わりに 今回はNotionでDB蚭蚈を行っおみたした。 DB蚭蚈の肝であるテヌブル定矩ずER図がNotionで䜜成、管理できるのは非垞に䟿利だなず思いたした。 しかし、䞀぀問題点がありたしおmermaidの仕様䞊、゚ンティティの䜍眮調敎が自動で行われるため、゚ンティティが倚くなれば倚くなるほど耇雑なER図になっおしたいたす。そのため、耇雑なシステムの堎合は図を分けるなどの工倫が必芁になっおきたす。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も随時受付䞭 ニフティに興味をお持ちの方は キャリア登録をぜひお願いいたしたす キャリア登録 connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する