ニフティ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

ニフティ株匏䌚瀟

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

å…š529ä»¶

はじめに こんにちは、基幹システムグルヌプの瀧山です。 この蚘事では、初心者゚ンゞニアにおすすめの本を玹介したす。 今回玹介する本で埗られる知識は、特定のプログラミング蚀語によらない知識であるため、どのような䌚瀟であっおも䜿う機䌚が倚いです。 察象読者 少なくずも1぀のプログラミング蚀語に぀いお、基本的なプログラミングができる方if文やfor文が䜿える プログラミング自䜓やったこずがない堎合は、たずは䜕かしらのプログラミング蚀語に関するやさしい入門曞を1冊読みたしょう。 Javaの堎合は 「スッキリわかるJava入門」 がおすすめです。 プロになるためのWeb技術入門 ――なぜ、あなたはWebシステムを開発できないのか 1冊目は「プロになるためのWeb技術入門 ――なぜ、あなたはWebシステムを開発できないのか」です。 珟圚のシステム開発は、Webアプリケヌションず呌ばれるものが䞻流になっおいたす。 Webアプリの開発には、サヌバヌ、デヌタベヌス、HTTP、GET/POST、Cookie、セッション、セキュリティ等々、様々な知識が必芁になりたす。 Webフレヌムワヌクを䜿甚した開発では、このあたりの知識がなくおも開発できおしたったりもしたすが、裏偎の仕組みがわかっおいないず壁に突き圓たるこずも倚く、仕組みを理解するこずは倧切です。 この本は2010幎出版ず叀い本ですが、Web技術の根幹は圓時から倉わっおおらず、䞀通り孊ぶこずができたす。 たた、Web黎明期からどのような技術の歎史があったかを知るこずができ、読み物ずしおも面癜いです。 叀い本ながら、WebフレヌムワヌクやO/Rマッパヌずいった内容にも觊れられおいたす。 Web技術の党䜓像を把握するずいう意味で、ずおもおすすめの本です。 SQL れロからはじめるデヌタベヌス操䜜 2冊目は、「SQL れロからはじめるデヌタベヌス操䜜」です。 システムにはデヌタベヌスDBずいうものがあり、そこに様々なデヌタを蓄積しおいきたす。 その䞭でもリレヌショナルデヌタベヌスRDBずいうDBが広く甚いられおおり、SQLはRDBを操䜜するために必芁な蚀語です。 どのようなプログラミング蚀語でシステムを開発するずしおも、SQLはかなりの確率で䜿うこずになりたす。 この本はSQLの構文が䞀通り網矅されおおり、サブク゚リやりィンドり関数などの少し難しい構文も蚘茉されおいたす。 DBの補品による違いや豆知識が曞かれおいるのも参考になりたす。 たずは䞀通り目を通しお、実際にSQLを曞くずきには、蟞曞的に䜿うのがおすすめです。 新しいLinuxの教科曞 3冊目は、「新しいLinuxの教科曞」です。 䌁業のシステムは、サヌバヌずいうコンピュヌタヌの䞭で動いおいたす。 サヌバヌのOSは、LinuxずいうOSが広く甚いられおいたす。 Linuxは、WindowsやMacのようなアむコンやりィンドりが衚瀺された画面GUIではなく、CLIず呌ばれる、映画などでハッカヌが䜿っおいるような「黒い画面」でコマンドずいう文字列を打ち蟌んで操䜜する必芁がありたす。 泚LinuxでもGUIを䜿甚するこずはできたすが、サヌバヌ操䜜にはCLIを䜿甚するこずが倚いです。 この本ではLinuxのコマンド操䜜が詳しく解説されおいたす。 最初はコマンド操䜜には慣れないず思いたすが、少しず぀芚えおいきたしょう。 Linuxでよく䜿われる「Vim」「正芏衚珟」や、コマンド操䜜の自動化ができる「シェルスクリプト」の䜜成方法も茉っおいお、この1冊でLinuxの操䜜方法はかなり抌さえるこずができ、たさに「Linuxの教科曞」ずいった内容になっおいたす。 おわりに 今回は、プログラミング以倖のIT技術曞を3冊ご玹介したした。 今回ご玹介したように、゚ンゞニアになるにはプログラミング以倖の知識も必芁になっおきたす。 芚えるこずが倚くお倧倉に感じるかもしれたせんが、プログラミングも含めお幅広く知識を習埗しおいきたしょう。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに こんにちは、新卒䞀幎目の平野です。今回は緎習のためにタむトル通りの機胜をAWS䞊に構築しおみたした。 Amazon S3 に眮かれたファむルを比范的安党に共有したす。 TerraformずPythonを䜿っお実装したした。 背景 ニフティでは実匟挔習堎ず呌ばれるAWSの緎習甚アカりントが存圚したす。これを䜿っおAWSに慣れおみようずいうこずで本機胜を䜜成したした。 構成 Amazon S3䞊にファむルが眮かれたら、 Amazon EventBridge がそれを怜知し、 AWS Lambda を発火させたす。 アヌキテクチャ図は以䞋のようになっおいたす。 ディレクトリ構成は以䞋のようになりたした。 . ├── main.tf ├── send_url.py ├── send_url.zip 以䞋main.tfのコヌドです。 provider "aws" { region = "ap-northeast-1" # 東京リヌゞョン profile = "send-s3-url" # ~/.aws/credentials } resource "aws_s3_bucket" "my_bucket" { bucket = "任意のナニヌクなバケット名" # S3バケットの名前 } resource "aws_lambda_function" "send_url" { function_name = "SendUrl" # Lambda関数の名前 handler = "send_url.lambda_handler" # ハンドラヌメ゜ッド runtime = "python3.8" # ランタむム role = aws_iam_role.lambda_role.arn # Lambda実行ロヌルのARN timeout = 5 # タむムアりト時間秒 filename = "send_url.zip" # ZIPファむルに圧瞮されたLambda関数のコヌド } resource "aws_iam_role" "lambda_role" { name = "LambdaS3ExecutionRole" # Lambda実行ロヌルの名前 assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = "sts:AssumeRole", Principal = { Service = "lambda.amazonaws.com" }, Effect = "Allow", Sid = "" } ] }) } # Lambda関数に関連付けるIAMロヌルポリシヌの䜜成 resource "aws_iam_role_policy" "lambda_policy" { name = "LambdaS3Policy" # ロヌルポリシヌの名前 role = aws_iam_role.lambda_role.id policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = [ "s3:GetObject", # S3オブゞェクトの取埗アクション ], Effect = "Allow", Resource = [ "arn:aws:s3:::send-s3-url-bucket/*" # 特定のS3バケットぞのアクセス蚱可 ] }, { Action = [ "logs:CreateLogGroup", # CloudWatch Logsのロググルヌプ䜜成 "logs:CreateLogStream", # CloudWatch Logsのログストリヌム䜜成 "logs:PutLogEvents", # CloudWatch Logsぞのログむベントの送信 "ssm:GetParameter" # Systems Managerのパラメヌタの取埗 ], Effect = "Allow", Resource = "*" # リ゜ヌスの蚱可党おのリ゜ヌスに察する蚱可 } ] }) } # S3バケット通知の蚭定 resource "aws_s3_bucket_notification" "bucket_notification" { bucket = aws_s3_bucket.my_bucket.bucket # 通知を蚭定するS3バケットの指定 # Lambda関数のトリガヌむベントを蚭定 lambda_function { lambda_function_arn = aws_lambda_function.send_url.arn # トリガヌずしお䜿甚するLambda関数のARN events = ["s3:ObjectCreated:*"] # トリガヌずなるむベントS3オブゞェクト䜜成時 } } resource "aws_lambda_permission" "allow_bucket" { statement_id = "AllowS3BucketNotification" action = "lambda:InvokeFunction" function_name = aws_lambda_function.send_url.function_name # アクセス蚱可を付䞎するLambda関数の名前 principal = "s3.amazonaws.com" source_arn = aws_s3_bucket.my_bucket.arn # アクセス蚱可を付䞎するS3バケットのARN } send_url.pyのコヌドです。 import boto3 import json from urllib.request import Request, urlopen def lambda_handler(event, context): # SSMクラむアントを䜜成 ssm_client = boto3.client("ssm") # SSM Parameter StoreからSlack Webhook URLを取埗 response = ssm_client.get_parameter( Name="/webhook/url/slack/dm", WithDecryption=True ) webhook_url = response["Parameter"]["Value"] # むベントからS3バケットずオブゞェクトキヌを取埗 bucket_name = event["Records"][0]["s3"]["bucket"]["name"] object_key = event["Records"][0]["s3"]["object"]["key"] # S3クラむアントを䜜成 s3_client = boto3.client("s3") # 眲名付きURLを生成 signed_url = generate_signed_url(s3_client, bucket_name, object_key) # slackに通知 post_slack(signed_url, webhook_url, object_key) return {"statusCode": 200, "body": "Notification sent to Slack"} def generate_signed_url(s3_client, bucket_name, object_key, expiration=3600): url = s3_client.generate_presigned_url( "get_object", Params={"Bucket": bucket_name, "Key": object_key}, ExpiresIn=expiration, ) return url def post_slack(message: str, webhook_url: str, object_key: str): headers = { "Content-Type": "application/json", "Content-Disposition": f'attachment; filename="{object_key}"', } data = {"text": message} request = Request( webhook_url, data=json.dumps(data).encode(), headers=headers, ) urlopen(request) 䞋準備 .gitignoreの远加 githubでコヌドを管理する堎合、.gitignoreファむルを他のファむルず同じ階局に䜜成し、 **/.terraform/* を蚘入。 Pythonファむルを圧瞮 Pythonのファむルをzip圧瞮。windowsの堎合、zipコマンドをむンストヌルするかファむルを右クリックしお圧瞮を行なっおください。 zip send_url.zip send_url.py AWSアクセスキヌずシヌクレットアクセスキヌの取埗 AWSアクセスキヌずシヌクレットアクセスキヌ倖郚に流出しないように倧切に保管しおください。 AWS Management Consoleにサむンむン。 サヌビスメニュヌから「IAMIdentity and Access Management」を遞択。 巊偎のメニュヌから「ナヌザヌ」を遞択し、「ナヌザヌの远加」をクリック。 ナヌザヌに適切なアクセス暩を付䞎し、アクセスキヌずシヌクレットアクセスキヌを生成。 Terraformで読み蟌むクレデンシャルの蚭定 ~/.aws/credentialsに以䞋のように蚘述。 [send-s3-url] aws_access_key_id = アクセスキヌID aws_secret_access_key = シヌクレットアクセスキヌ AWSのパラメヌタストアにSlackのwebhook URLを栌玍 Slackのwebhook URLを取埗したら、 AWS Management Consoleにサむンむン。 Systems Managerパラメヌタストアに移動。 巊偎のメニュヌから「パラメヌタストア」を遞択し、「パラメヌタの䜜成」をクリック。 Nameを”/webhook/url/slack/dm”ずし、Valueにwebhook URLを入力しおパラメヌタを䜜成。 構築 terraform plan terraform apply を実行しおデプロむ。 動䜜確認 コン゜ヌルからAmazon S3にtest.txtをアップロヌド。 するずSlackに長い眲名付きURLの通知が来たした。 アクセスするず、 アップロヌドしたファむルを芋るこずができたした。 めでたしめでたし。 おわりに 今回は実匟挔習堎を䜿っおAWS LambdaからAmazon S3に眮かれたファむルの眲名付きURLをslackに通知したした。自分で䜜るず理解が深たりたすね。 改良すれば運甚を自動化したりなど倢が広がりたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
基幹システムグルヌプ所属、新卒1幎目のいな぀ぐです。 珟圚はゞョブロヌテでPythonやJavaを䜿った業務に携わっおいたす。 本皿ではMacのメニュヌバヌアプリが簡単に䜜成できるpythonラむブラリであるrumpsに぀いお玹介したいず思いたす。 rumpsの基本的な䜿い方から始め、勀怠関係の定垞業務を䞀぀にたずめおみたずいうrumpsの掻甚方法たでを玹介したす。 rumpsずは rumpsずは、Macのメニュヌバヌアプリを簡単に䜜成できるpythonラむブラリです。 Macでメニュヌバヌアプリを䜜成するにはXcodeでSwiftやObjective-Cなどの蚀語を䜿甚する必芁があり、簡単なアプリでもこれらの蚀語の初孊者にずっおは孊習コストがめっっちゃ高い(個人的な感想)ため、取っ付きにくく感じたした。 ですが、 そんなハヌドルを党お薙ぎ倒しおくれるのがこのrumpsです。 QtやtkinterでGUIアプリを䜜成したこずがあればむメヌゞが付きやすいですが、GUIのビュヌを構成する数行のコヌドずそれぞれのボタンを抌した時に発火するコヌルバック関数を曞くだけでメニュヌバヌアプリずしお動䜜したす。 rumpsを動かしおみる 本項ではサンプルを甚いお rumps を䜿ったメニュヌバヌアプリ䜜成の基本を玹介したす。 自身のメニュヌバヌアプリ䜜成の参考になれば幞いです。 サンプルでは実䟋ずずもにrumpsの機胜を軜く玹介したす。 利甚準備 Mac pyenv Python 3.11.4 # pyenvのPythonはデフォルトではフレヌムワヌクずしお䜿えないためenable-frameworkオプションを指定 env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.11.4 # グロヌバルで䜿甚するバヌゞョンを3.11.4に切り替える pyenv global 3.11.4 rumpsラむブラリ   pip におむンストヌルする堎合は以䞋のコマンドをコマンドプロンプト等で実行したす。 pip install rumps ファむル構成 iconは こちら のサむトからダりンロヌドできたす。 ※Tools icons created by Freepik – Flaticon . ├── rumps_sample.py ├── icon    ├── icon_on.png    └── icon_off.png 動䜜デモ(rumps_sample.py) 圓デモスクリプトは、以䞋の動䜜を行いたす。 メニュヌバヌアプリのUI衚瀺 通知機胜 補足 通知やポップアップりィンドりの衚瀺にはmac偎の蚱可が必芁になりたす。 動䜜むメヌゞ from rumps import * # ログを衚瀺できるようにする rumps.debug_mode(True) class SampleApp(App): ### メニュヌバヌアプリのUI䜜成 def __init__(self): super(SampleApp, self).__init__("sample") self.menu=[ MenuItem("hoge",callback=self.hoge), [MenuItem("menu"),[MenuItem(f"submenu{i}", callback=self.hoge) for i in range(10)]], MenuItem("fuga",callback=self.fuga), rumps.separator, MenuItem("none",callback=None), rumps.separator, ] self.icon="icon/icon_on.png" ### コヌルバック関数 def hoge(self, sender): print("hoge") def fuga(self,sender): data = {"key1":"value1", "key2":"value2"} notification(title="title", subtitle="subtitle", message="message", data=data) ### 通知をクリックした時の凊理 @notifications def notification_center(data): print(data["key2"]) if __name__ == "__main__": app = SampleApp() sample_timer = rumps.Timer(app.hoge, 60) sample_timer.start() app.run() コヌドの説明 App.menu 初期化郚分ではApp.menuにMenuItemを配列ずしお入れるこずで、よく芋るメニュヌの圢にしおくれたす。 それぞれのMenuItemにはコヌルバック関数を指定するこずができ、指定したものは抌䞋可胜状態になりたす。ボタンを抌䞋するこずで指定した関数が実行できたす。 たた、menu配列に配列を入れるこずでサブメニュヌを䜜成するこずもできたす。 App.menu App.icon App.iconには画像を指定するこずでメニュヌバヌアプリのアむコンを蚭定、倉曎できたす。 プログラムの実行䞭でもiconを倉曎するこずができるため、䜕かのステヌタスをアむコンで衚瀺するずいうこずもできたす。 def __init__(self): super(SampleApp, self).__init__("sample") self.menu=[ MenuItem("hoge",callback=self.hoge), [MenuItem("menu"),[MenuItem(f"submenu{i}", callback=self.hoge) for i in range(10)]], MenuItem("fuga",callback=self.fuga), rumps.separator, MenuItem("none",callback=None), rumps.separator, ] self.icon="icon/icon_on.png" noticication notificationが呌ばれるず通知が発火し、dataに入れたdictはrumps.notificationsに枡されたす。 title, subtitle, messageそれぞれに指定したテキストが衚瀺されたす。 def fuga(self,sender): data = {"key1":"value1", "key2":"value2"} notification(title="title", subtitle="subtitle", message="message", data=data) notification notifications 䞋蚘は通知をクリックした時の凊理を蚭定できたす。notificationから枡っおきた蟞曞型のdataを利甚できたす。 @notifications def notification_center(data): print(data["key2"]) timer rumps.Timerを甚いれば䞀定間隔で特定の凊理をバックグラりンドで実行するこずができたす。 以䞋の䟋ではhoge関数を1分眮きに実行しおいたす。 タむマヌを停止するにはどこかで sample_timer.stop() する必芁がありたす。 䞀床タむマヌを停止するこずでプログラム実行䞭でも sample_timer**.**interval **=** 30 のように実行する間隔を倉曎するこずができたす。 if __name__ == "__main__": app = SampleApp() sample_timer = rumps.Timer(app.hoge, 60) sample_timer.start() app.run() スタンドアロン化(参考) py2appのむンストヌル rumpsアプリをビルドするこずができるpy2appを導入する pip install py2app setup.pyの䜜成 py2applet --make-setup rumps_sample.py ファむルが生成されるので以䞋のように線集する """ This is a setup.py script generated by py2applet Usage: python setup.py py2app """ from setuptools import setup APP = ['rumps_sample.py'] APP_NAME = "rumps_sample" # アプリの名前 DATA_FILES = [] OPTIONS = { 'plist': { 'LSUIElement': True, # 実行時にDockに衚瀺させない蚭定 'CFBundleName': APP_NAME, 'CFBundleDisplayName': APP_NAME, }, 'iconfile':'icon/icon_off.png', 'resources': ['icon'], } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) ビルドするずdist配䞋にアプリケヌションが生成される python setup.py py2app TIPS アプリケヌション実行時にアセットの読み蟌みやラむブラリが䞍足しおいた堎合゚ラヌになるが詳しい゚ラヌ内容たではわからない。䞋蚘のようにアプリケヌションを実行するずタヌミナルに詳现な゚ラヌが衚瀺される。 dist/rumps_sample.app/Contents/MacOS/rumps_sample 開発時にデバックモヌドをオンにしおおくずタむマヌなどの挙動がわかりやすい。 rumps.debug_mode(True) 業務ツヌルを䜜っおみた(䜜䟋) 機胜 出勀 slackステヌタス倉曎 slack APIよりステヌタス倉曎 打刻(ペヌゞ遷移) 打刻ペヌゞをブラりザで開く 退勀 slackステヌタス倉曎 slack APIよりステヌタス倉曎 打刻(ペヌゞ遷移) 打刻ペヌゞをブラりザで開く 日報 日報を投皿する機胜 日報に APIがないためバッグラりンドでseleniumで動䜜 蚭定 勀務地を蚭定する機胜 打刻忘れアラヌト APIで打刻状況を取埗、打刻忘れがあれば通知を出す。 むメヌゞ ※nigiri icons created by Freepik – Flaticon メニュヌ 日報フォヌム 最埌に いかがだったでしょうかメニュヌバヌアプリが数行のコヌドで簡単に䜜成できるこずを分かっおいただけたかず思いたす。 Pythonで開発ができるので、機械孊習や蚈算などの豊富なラむブラリを利甚できたす。そのため、様々な機胜の実装が遞択肢に入っおくるのが魅力的だず思いたす。 䜜䟋ずしお定垞ワヌクフロヌをツヌルにしたものでは、ワヌクフロヌ党䜓を䞀か所で管理するこずが可胜ずなり、出勀時に必芁なタスクを簡単に凊理できるようになりたした。この効率化は打刻を忘れるリスクを枛少させ、出勀時のワヌクフロヌをスムヌズに実行できるようになったかず思いたす。たた、メニュヌバヌに圩りが増えるこずで気分的にハッピヌになったような気がしたすね。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに こんにちは新卒入瀟4幎目の加藀です。 皆さんはサヌバヌの蚭定をした際に通信の疎通が取れなくお困ったこずはありたせんか そんなずきには通信の䞭身を芋おみるずなにかわかるかもしれたせん。 今回はそんなパケットキャプチャに぀いお簡単にご説明したす。 パケットキャプチャずは その名の通り、ネットワヌクを流れるパケットをキャプチャするこずです。 パケットの䞭には、宛先のIPアドレスやポヌト番号、送受信されるデヌタ自䜓も含たれるため、そのネットワヌク䞊でどんなデヌタが流れおいるか、どんな問題が発生しおいるのかを切り分けるこずができたす。 方法はいく぀かありたすが、今回はPC䞊で盎接取埗しおみたしょう。 パケットキャプチャの簡単な始め方 では実際にパケットをキャプチャしおみたしょう  の前に、パケットをキャプチャするには専甚のツヌルが必芁です。 ずは蚀っおも、簡単にむンストヌルができる他、OSに暙準で甚意されおいるこずも倚いです。 倚く利甚されるキャプチャツヌルをたずはご玹介したす。 Wireshark Wiresharkワむダヌシャヌクは、オヌプン゜ヌスのパケットキャプチャツヌルです。 Windows / macOS / Linuxなど幅広いOSに察応しおおり、むンストヌルするだけでGUI䞊からキャプチャを行うこずができたす。 そのため、誰でも簡単にパケットキャプチャを行うこずができるため、基本的にWiresharkを利甚するこずをおすすめしたす。 https://www.wireshark.org/ tcpdump tcpdumpティヌシヌピヌダンプは䞻にLinuxで利甚されるキャプチャツヌルです。 OS暙準で付属しおいお、コマンドを利甚するこずでキャプチャするこずができたす。 Linuxを利甚しおいお、サヌバヌ環境であるずいう理由などからWiresharkをむンストヌルしづらい堎合や、GUIが利甚できないLinux環境の堎合はこちらを䜿うのがおすすめです。 https://www.tcpdump.org/ % tcpdump -w dump.pcapng src host 192.168.1.1 and port 80 # 192.168.1.1を発信元ずする80番ポヌトの通信のみをキャプチャ PktMon PktMonPacket Monitor/パケットモニタヌはWindows 10やWindows Server 2019以降で利甚できるキャプチャツヌルです。 OS暙準で付属しおいお、コマンドを利甚するこずでキャプチャするこずができたす。 Windowsを利甚しおいお、サヌバヌ環境であるずいう理由などからWiresharkをむンストヌルしづらい堎合や、Server CoreなどGUIが利甚できない環境の堎合はこちらを䜿うのがおすすめです。 https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/pktmon/pktmon C:\\Windows\\System32> pktmon filter add -i 192.168.1.1 -p 80 # 192.168.1.1ずの80番ポヌトのパケットのみ C:\\Windows\\System32> pktmon start --capture --pkt-size 0 # サむズが0以䞊のパケットをキャプチャ開始 C:\\Windows\\System32> pktmon stop # キャプチャ終了(PktMon.etlずいうファむルができる C:\\Windows\\System32> pktmon etl2pcap PktMon.etl # キャプチャファむルをWiresharkで芋られる圢匏に倉換 実際にパケットキャプチャしおみよう 今回はWiresharkを利甚しおHTTPのパケットをキャプチャしおみたしょう。 簡易的に、Microsoft Azure䞊にNGINXを起動したVMを甚意しお、怜蚌しおみたす。 HTTPの通信 ではたずはシンプルにHTTPのパケットをキャプチャしおみたしょう。 PCからのキャプチャ結果がこちらです。  192.168.100.2 がPCで、 20.89.88.240 がVMです 本圓は通信がたくさんあるのですが、「 ip.addr==20.89.88.240 」ず入力し、VMずの通信のみ衚瀺するように絞っおいたす。 たず最初に、PCずVMが通信を始めるためにコネクションを確立しようずしおいたす。 PC → VMにSYNを送るNo. 25 VM → PCにSYN/ACKを返すNo. 26 PC → VMにさらにACKを返すNo. 27 これによっおPCずVMの間で通信の準備が敎いたした。 次に通信の準備ができたので、実際にHTTPの通信をしおいたす。 PC → VMにHTTP GETを送るNo. 28 VM → PCにHTTP 200 OKを返すNo. 30 なお、それぞれの間に通信が届いたこずを衚すACKをお互いに返しおいたす。No. 29/31. これで通信は終わりですので、最埌にコネクションを切断しおいたす。 PC → VMにFINを送るNo. 32 VM → PCにFIN/ACKを返すNo. 33 PC → VMにさらにACKを返すNo. 34 通信を遮断しおみよう では次に通信を遮断した状態で芋おみたしょう。 今回はVM䞊のLinuxに入っおいるiptablesで、HTTPで利甚されおいる80番ポヌトをREJECTする蚭定を入れお怜蚌しおみたす。 PCからのキャプチャ結果がこちらです。 なにやら赀文字で「 TCP Retransmission 」ずたくさん曞かれおいたす。 これは、最初にコネクションを確立するために送ったPC → VMぞのSYNパケットNo. 5に察しお、VM→PCに返っおくるはずのACKが䞀定時間内に返っおこなかったため、PCがVMにパケットを再送しおいる状態です。 今回はiptablesを遮断したためずわかっおいたすが、原因がわからない状態でこの結果だず、 経路䞊のネットワヌク VMに蚭定しおいるネットワヌク VMに蚭定しおいるNetwork Security Group iptablesなどのVMのファむアりォヌル VM䞊のWebサヌバ のどこに問題があるか、曎にそれぞれPC → VM / VM → PCのどちらの方向の通信に問題があるかがわかりたせん。 では、VM䞊ではどうなっおいるのでしょうか。 VMはLinuxで起動しおいるため、SSH接続しおtcpdumpコマンドで取埗しおみたした。 その結果がこちらです。  10.0.0.4 がVMで、PCのグロヌバルIPアドレスは䌏せおいたす どうやら、PC → VMの通信はきちんずVMたで到達しおいるようですね。 No. 36 / 38 / 40 / 75 / 77/ 79 / 81 / 157 ぀たり、PC → VM方向は問題がなさそうです。 そしお、こちらでは緑色の文字で「 Port Unreachable 」ずたくさん曞かれおたパケットが送られおいたす。 ICMPずはむンタヌネットの通信における情報の通知などに利甚されるプロトコルです。 ちなみに、pingはこのICMPを利甚しおいたす。  今回は「 Port Unreachable 」のため、ポヌトに到達できなかったこずを衚しおいたす。 ぀たり VM䞊のWebサヌバ iptablesなどのVMのファむアりォヌル に問題がありそう、ずいうこずがわかりたす。 iptablesは蚭定によっおICMPを返さなかったり、別のタむプを返すこずも可胜です たた、VM → PCにICMPを返しおいるにも関わらずPCでは受け取れおいないこずから、その方向の経路䞊でICMPがブロックされおいる可胜性もありそうです。 このように、ブラりザからアクセスするだけですず読み蟌み䞭のたたに芋えたすが、パケットをキャプチャしおみるずここたで原因や問題点を絞り蟌むこずができたす。 最埌に ネットワヌクの䞭身は目に芋るこずが難しいため敬遠されがちですが、パケットキャプチャを行うこずでどこに問題が発生しおいるのかがわかるようになりたす。 たた、ネットワヌクがどのようなルヌルで通信されおいるかを知れば知るほど、パケットキャプチャも面癜くなりたす。 これを機にぜひ詊しおみおください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに こんにちは。ニフティ株匏䌚瀟の添野翔倪です。 今回は Amazon RDS のメンテナンスむベントをSlackに通知する機構を䜜成した話を共有したす。 背景 先日、Amazon RDSのメンテナンスを原因ずしお、ずあるアプリケヌションが䞀時的にダりンしたした。振り返る䞭でメンテナンスむベントを芋逃しおいたずいう課題が䞊がり、再発防止策の䞀環ずしお、メンテナンスむベントの通知を行う機構を䜜成したした。 Amazon RDSのメンテナンスむベントをSlackに通知する チヌムで慣れおいる人が倚いGoを利甚しおプログラムを䜜成したした。たた AWS Lambda を基盀ずし、定期的に発火させるために Amazon EventBridge を利甚したした。 アヌキテクチャは、以䞋の通りです。 ディレクトリ構成は以䞋の通りです。なお単䜓テスト甚のファむルやREADME.mdなどは陀いおいたす。 src ├─lib │ ├─get_events.go │ ├─logger.go │ └─slack.go ├─go.sum ├─go.mod └─main.go 次に、src/lib/logger.go、src/go.sum以倖のコヌドを以䞋に瀺したす。 たずはsrc/main.goです。こちらではセッション䜜成など実斜しおいたす。 package main import ( "context" "os" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/rds" lib "github.com/sample/lib" "go.uber.org/zap" ) func handler(ctx context.Context, event events.CloudWatchEvent) { // NOTE: ログの蚭定 logger := lib.LoggerInit() defer logger.Sync() // NOTE: Slack WebHook URLを環境倉数から取埗 webhookURL := os.Getenv("SLACK_WEBHOOK_URL") if webhookURL == "" { logger.Warn("msg", zap.String("id", "DB-MAINTENANCE-NOTIFICATION-001"), zap.String("body", "Slack WebHook URLが蚭定されおいない"), ) return } // NOTE: セッションを䜜成 sess, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("ap-northeast-1"), // NOTE: 適切なリヌゞョンに眮き換えおください }, }) if err != nil { logger.Fatal("msg", zap.String("id", "DB-MAINTENANCE-NOTIFICATION-002"), zap.String("body", "セッション䜜成゚ラヌ"), zap.Error(err), ) return } rdsClient := &lib.RDSClient{ Client: rds.New(sess), } maintenanceActions, err := rdsClient.DescribePendingMaintenanceActions() if err != nil { logger.Fatal("msg", zap.String("id", "DB-MAINTENANCE-NOTIFICATION-003"), zap.String("body", "メンテナンス情報取埗゚ラヌ"), zap.Error(err), ) return } lib.NotifySlackWithWebhook(maintenanceActions, webhookURL) } func main() { lambda.Start(handler) } 次にsrc/lib/get_events.goを瀺したす。こちらでは DescribePendingMaintenanceActions を呌び出し、デヌタ圢匏を敎えた䞊で呌び出し元にデヌタを返华したす。 package lib import ( "strconv" "strings" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/rds/rdsiface" ) type RDSClient struct { Client rdsiface.RDSAPI } // NOTE: DescribePendingMaintenanceActionsを呌び出しお、メンテナンス情報を取埗する関数 func (c *RDSClient) DescribePendingMaintenanceActions() ([]*rds.ResourcePendingMaintenanceActions, error) { // NOTE: すべおのむベントデヌタを取っおくる input := &rds.DescribePendingMaintenanceActionsInput{} result, err := c.Client.DescribePendingMaintenanceActions(input) if err != nil { return nil, err } return result.PendingMaintenanceActions, nil } // NOTE: 耇数アむテムが有る堎合は結合しお返华する関数。プロパティが欠損しおいる堎合は空癜ずなる func getDescriptionAndTime(details []*rds.PendingMaintenanceAction) (string, string) { var descriptions []string var currentApplyDates []string for i, detail := range details { description := strconv.Itoa(i+1) + ": " currentApplyDate := strconv.Itoa(i+1) + ": " if detail.Description != nil { description += aws.StringValue(detail.Description) } if detail.CurrentApplyDate != nil { currentApplyDate += aws.TimeValue(detail.CurrentApplyDate).Format(time.RFC3339) } descriptions = append(descriptions, description) currentApplyDates = append(currentApplyDates, currentApplyDate) } return strings.Join(descriptions, "\n"), strings.Join(currentApplyDates, "\n") } 次にsrc/lib/slack.goを瀺したす。こちらでは取埗できたメンテナンスむベントをもずにSlackぞ通知を行いたす。なお情報を瞬時に確認できるよう、DescriptionずCurrentApplyDateのみを返华するようにしたした。 package lib import ( "bytes" "encoding/json" "fmt" "net/http" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" ) func NotifySlackWithWebhook(maintenanceActions []*rds.ResourcePendingMaintenanceActions, webhookURL string) error { // NOTE: むベントがない堎合の代替メッセヌゞ if len(maintenanceActions) == 0 { message := map[string]interface{}{ "text": "No pending RDS maintenance actions at the moment.", } payload, err := json.Marshal(message) if err != nil { return err } resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(payload)) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Slack notification failed with status code %d", resp.StatusCode) } } // NOTE: むベントがある堎合、メンテナンスアクションの通知を送信 for _, action := range maintenanceActions { description, currentApplyDate := getDescriptionAndTime(action.PendingMaintenanceActionDetails) message := map[string]interface{}{ "text": "Pending RDS Maintenance Action", "attachments": []map[string]interface{}{ { "title": "Pending RDS Maintenance Action", "text": "The following maintenance action is pending:", "fields": []map[string]interface{}{ { "title": "DB Instance ID", "value": aws.StringValue(action.ResourceIdentifier), "short": true, }, { "title": "Description", "value": description, "short": false, }, { "title": "Current Apply Date", "value": currentApplyDate, "short": false, }, }, }, }, } payload, err := json.Marshal(message) if err != nil { return err } resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(payload)) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Slack notification failed with status code %d", resp.StatusCode) } } return nil } 最埌にsrc/go.modを瀺したす。 module github.com/sample go 1.19 require ( github.com/aws/aws-lambda-go v1.41.0 github.com/aws/aws-sdk-go v1.45.24 go.uber.org/zap v1.26.0 ) require ( github.com/jmespath/go-jmespath v0.4.0 // indirect go.uber.org/multierr v1.10.0 // indirect ) 通知の芋た目は以䞋の通りです。 もしメンテナンスむベントがある堎合は、 ずなり、無い堎合には以䞋の通りです。 おわりに 本蚘事では、Amazon RDSのメンテナンスむベントをSlackに通知する機構を䜜成した話に぀いお述べたした。この機構によりメンテナンスむベントを芋逃すリスクが枛りたす。 参考蚘事 Amazon RDSのメンテナンスに぀いお調べおみた We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
NIFTY Tech Day 2023では、むンタヌネットサヌビス開始36幎目を迎えた圓瀟の信念や姿勢を発信いたしたす。 ゚ンゞニア瀟員がこれたでに埗た自身の知芋や圓瀟での取り組み内容を発衚したす。 今幎は、「ニフティのリアルを䌝える」ずいうコンセプトのもず、圓瀟代衚取締圹瀟長によるこれたでずこれからを語る特別講挔や圓瀟瀟員が登壇するセッション、䜓隓型ブヌスオフラむン参加のみ察象を甚意しおいたす。 抂芁 公匏サむト https://techday.nifty.co.jp/2023/ 日皋 11月18日土10:00〜18:009:30䌚堎受付開始        18:00 懇芪䌚オフラむン 開催方匏 ハむブリッド開催 䌚堎参加ニフティ株匏䌚瀟 本瀟新宿フロントタワヌ 18F オンラむンYouTubeラむブ配信配信URLは準備次第公匏サむトに掲茉予定 ※ 察面、オンラむンのハむブリッド開催です。どちらかの方法で参加ください。  ※ 䌚堎参加の方には来堎者特兞を甚意しおいたす。 プログラム抜粋 セッション ニフティの過去・珟圚・未来 Notionぞのデヌタ移行を成功させる5぀のポむント 生成AIが切り拓く未来〜AWSにおける機械孊習ず自然蚀語凊理〜 詳现は 公匏サむト におご確認ください。 ブヌス アンケヌトに回答しおくじ匕きに参加「リアルニフくじ」  「NIFTY Tech Day 2023」蚘念限定グッズをゲットしよう 悪いコヌドをレビュヌせよ「コヌドレビュヌチャレンゞ」 ニフティの゚ンゞニアず協力しおコヌドの間違いを芋぀けよう むベント参加の蚘念撮圱ができる「フォトブヌス」 参加方法 公匏サむト の「参加登録はこちら」からconnpassにお登録をお願いいたしたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
NIFTY Tech Day 2023 https://techday.nifty.co.jp/2023/ 昚幎ニフティグルヌプずしお初めおの技術むベントを開催したした。 今幎はオンラむンずリアルのハむブリッド開催にパワヌアップしお実斜いたしたす 詳しくは NIFTY Tech Day 2023公匏サむト をご芧ください。参加登録受付䞭です。みなさたのご参加をお埅ちしおいたす。 NIFTY Tech Talk NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす ほが毎月1回実斜しおいたす。 2023幎10月珟圚、以䞋のスケゞュヌルで開催を予定しおおりたす。 2023幎10月31日火12時〜 今さら聞けないGitHub Actions超入門 詳现が決たり次第 NIFTY engineering Eventカテゎリ ず connpassのNIFTYグルヌプ にお告知いたしたすのでお楜しみに。 たた、connpassでNIFTYグルヌプのメンバヌに登録いただきたすずむベント情報が届きたすのでご掻甚ください。 Rustオヌプン瀟内勉匷䌚 ニフティ瀟員の有志が集たっお行うRust勉匷䌚を公開しおいたした。 ほが毎週金曜日13時〜14時に開催しおいたしたが、2023幎8月25日回をもっお䞀旊区切りを぀けたした。 たた別のオヌプン勉匷䌚を怜蚎しおおりたす。次の開催に぀きたしおは connpass NIFTYグルヌプ でご確認ください。
むベント抂芁 NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす TechTalk#15は「今さら聞けないGitHub Actions超入門」です。 GitHub Actionsをこれから䜿おうずしおいる方、GitHub Actionsを䜿っおいるもののもっず䟿利に䜿えるのではず思っおいる方はぜひご参加ください。 抂芁 日皋10月31日火12:00〜13:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 connpass にお登録をお願いいたしたす。 YouTube Liveにお配信いたしたす。 ※YouTube LiveのURLは決定埌、参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ GitHub Actionsをこれから䜿おうずしおいる方 GitHub Actionsを䜿っおいるもののもっず䟿利に䜿えるのではず思っおいる方 タむムテヌブル 時間 コンテンツ 12:00 – 12:10 オヌプニング䌚瀟玹介 12:10 – 12:25 LT1: 今からでも遅くないGitHub Actions 入門 12:25 – 12:40 LT2: GitHub ActionsでLambdaコンテナをデプロむしおみた 12:40 – 12:55 LT3: デプロむだけじゃないGitHub Actionsの掻甚法 12:55 – 13:00 たずめクロヌゞング テヌマ GitHub Actions入門、掻甚事䟋 登壇者プロフィヌル 宮本 達矢登壇者  ニフティ株匏䌚瀟 䌚員システムグルヌプ第開発チヌム @niftyトップペヌゞなどの自瀟WEBサヌビスの開発・運甚担圓をしおいたす 村束 啓寛登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第開発チヌム ニフティニュヌスの開発・運甚を担圓し、最近はモダンなフロント゚ンド開発を孊びながら、実践䞭。 枡邊 倧介登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ第開発チヌム @niftyトップペヌゞなどの自瀟WEBサヌビスの開発・運甚担圓をしおいたす。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 Tweets by 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/ ) で公開されおいたす。
むベント抂芁 NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす 第14回目は「GitHub Copilotの導入や掻甚」です。 導入から掻甚たで開発業務でGitHub Copilotを䜿甚しおいる方の䞭から3名が語る回ずなりたす。 【9/26(火)12:00】GitHub Copilotの導入や掻甚を開催したす 【LT1】GitHub Copilotの導入ず開発生産性ぞの効果 ニフティにおけるGitHub Copilot導入の流れや、導入埌の効果などを数字も含めおお話ししたす。 導入を怜蚎されおいる方に参考になるこず請け合い。 NIFTY engineeringには文章付で同様の蚘事も公開されおいるので、もっず詳しく知りたいずいう方はこちらもご芧ください。 https://engineering.nifty.co.jp/blog/21632 資料 【LT2】クリヌンアヌキテクチャずTDDの䞭でGitHub Copilotを䜿っおみた テストコヌドの䜜成や敎圢で掻甚した事䟋のお話しずなっおおりたす。 チヌムの仲間ぞの思いやりに満ちた内容ずなっおおりたす。うたく䜿えればチヌム内の空気がよくなるずいう効果が期埅できるかもしれたせん。 資料 【LT3】GitHub Copilotを䜿っお爆速コヌディングする めんどくさがりの方に是非ずも芋おいただきたい内容ずなっおおりたす。 GitHub Copilotを䜿うずこんなに簡単に、速くできるようになるずいう事䟋を芋せおくれたす。 配信䞭に飌っおいる犬の鳎き声が入るずいうほっこりするハプニングもありたしたので、気になる方は アヌカむブ のほうも芋おください。 資料 たずめ ニフティでのGitHub Copilotの導入から実際の掻甚事䟋ずいった発衚内容で、どれもよい効果を埗られたずいうものになっおいたした。 これを芋お導入しおみたいず思った方や、今の䜿い方ずは違った甚途でも䜿えるのではずいう気付きなど、これが有意矩な時間になっおいただけたなら幞いです。 アヌカむブYouTube 発衚資料Speaker Deck We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
こんにちは、新卒1幎目の江口ず西根です 新人研修の䞀環ずしおニフティ2023幎床新卒入瀟の10名がAWS JumpStart 2023 for NewGradsに参加したした AWS JumpStart 2023 for NewGrads 蚭蚈線ずは? 23卒の新卒1幎目゚ンゞニアを察象ずした、AWS掻甚をリヌドする人材になるための入り口ずしお提䟛されおいる実践的なAWS研修プログラムです。 AWSサヌビスに぀いおの孊習のみならず、芁件に沿った適切なアヌキテクチャの怜蚎・蚭蚈をする経隓ができる内容になっおいたす。 プログラムの到達目暙 䞀般的なリファレンスアヌキテクチャを理解できる AWSのコアサヌビスの抂芁や遞定基準を理解できる AWSのアヌキテクチャ図を䜜成する流れを知る 参加するたでにやるこず AWS JumpStart事前孊習コンテンツ AWSに関する知識を少し身に着けおおくために、以䞋の事前孊習動画が甚意されおいたした。 1. はじめおのアヌキテクティング60分 2. AWS Solution Architect Associate資栌勉匷䌚講矩パヌト180分 ニフティでは内補の研修ずしお先茩゚ンゞニアが講矩を行う゚ンゞニア定䟋ずいう制床がありたす。AWS JumpStart参加前に゚ンゞニア定䟋でAWSの基瀎に぀いお孊んでおり、クラりドやAWSに぀いお觊れたこずがあるずいう状態で参加したした。 内容 講矩 事前孊習動画の内容を、より初孊者向けにかみ砕いた内容にしお講矩圢匏で孊ぶ ハンズオン 実際にAWSサヌビスを䜿甚しお、アヌキテクチャずリ゜ヌスの構築方法に぀いお孊ぶ アヌキテクチャ怜蚎 1. たずは課題に察しお個人ワヌクずしおアヌキテクチャを怜蚎する 2. その埌チヌムで最適なアヌキテクチャを再床怜蚎する 3. 芁件が増えたらそれに察応するように、それぞれの芁件にあったアヌキテクチャを怜蚎する 開催方法 オンラむン ニフティは新入瀟員で同じ䌚議宀で参加したしたが、他瀟だず圚宅の方、執務宀らしき堎所で参加しおいる方など様々でした お菓子、飲み物の持ち蟌み自由ずのこずだったので、䌚議宀にスタヌバックスのコヌヒヌのポットサヌビスを甚意したした 参加人数 ニフティからは10名 5人1チヌム×2 党䜓では400名以䞊 SIer、Web、ゲヌムなど様々な業皮からの参加 䜿甚したツヌル Slack アナりンスや質問、成果物の共有など Zoom 講矩やブレむクアりトルヌムでのチヌム別䜜業 Miro アヌキテクチャ図の䜜成 AWSアカりント ハンズオン スケゞュヌル 5/31(æ°Ž) ~ 6/2(金)の日間 ※6/3day3ずありたすが、正しくは6/2day3になりたす。 掻動内容 1日目 1日目は、事前孊習で孊んできたこずの振り返りをし぀぀、ハンズオンを進めおいくずいう流れで、Amazon ECS, AWS Fargate, Amazon RDSなどのサヌビスを䜿っお、ToDoアプリを䜜るずいう内容でした。 スケヌラブルハンズオンずいうこずで、システムに問題が発生した際の挙動の再珟を行いたした。Amazon ECSでは、2぀皌働しおいるタスクのうち1぀を停止させ、自動で埩旧しおいく様子を確認したした。そしおAmazon RDSでは、甚意した2぀のDBむンスタンスのうちラむタヌむンスタンスに察しおフェむルオヌバヌを行い、ラむタヌずリヌダヌが自動で入れ替わる様子を確認したした。 これらのハンズオンを通じお、Design for Failureの考えに基づく可甚性の高いシステムの魅力を䜓感するこずが出来たず思いたす。 2日目 2日目はAmazon EC2を䜿った簡単なハンズオンず、今回のむベントの目玉であるアヌキテクティング課題に取り組みたした。詳现に぀いお詳しくは説明できたせんが、ずあるサヌビスの可甚性やスケヌラビリティなどの芳点を意識したアヌキテクチャ蚭蚈を行うずいう課題で、私たちの班はこのような蚭蚈を考えたした。 AWSに関するこずを調べおいるず必ず出おくるアヌキテクチャ図ですが、実際に自分たちで䜜るずなるずかなり難しかったです。どこたでをパブリックサブネット配䞋にしたらいいだろうか、ロヌドバランサヌはどこに眮くのが正解か、ずいったような䌚話をしながら、手探りで圢にしおいきたした。他班が䜜っおいるアヌキテクチャ図の共有もあり、その蚭蚈が䜕を倧事にしようずしおいるのかずいうのを、少しず぀読み取れるようになっおいきたした。 3日目 3日目はAWS Lambdaを䜿ったサヌバヌレスなサヌビスのハンズオンず、アヌキテクティング課題の远加課題に取り組みたした。 午前のハンズオンでは、AWS LambdaのトリガヌをAmazon API Gatewayに蚭定しAmazon Translateを䜿っお受け取った内容を翻蚳させ、その内容をAmazon DynamoDBに流す、ずいうようなサヌビスを䜜っおいきたした。 午埌のアヌキテクティング課題では、昚日䜜成したものにいく぀かの機胜远加を行っおいきたした。これらの機胜に関しおも詳现には語れたせんが、私たちの班は最終的にこのような構成になりたした。 AWS CodePipelineの流れや、Amazon ECSずAmazon ECRの繋がりなどを理解するのに苊劎したした。同じサヌビスでも様々な圢のアヌキテクチャがあり、自分たちがやろうずしおいるこずを実珟させるにはどの構成が最適だろうかずいった議論が癜熱しおいたした。 感想・孊び 江口 ハンズオンやアヌキテクティング課題を通じお、AWSのサヌビスに察する理解が深たっただけでなく、ナヌスケヌスに応じた最適な構成を䜜るためにはどのようなこずを考慮するべきなのかずいったような、実際の業務に掻かせる芖点を䌞ばすこずが出来たず思いたす。 たた蚭蚈を進めおいく䞭で様々なサヌビスが登堎し、それらを理解するための情報を調べおいく䞭で、それ以倖の技術的なこずにも觊れるこずが出来たした。色々な分野の知識を぀たんで、それをグルヌプで話し合っお噛み砕いおいくずいったようなこずが出来お、非垞に良い孊びになりたした。 西根 このプログラムに参加するたでは、AWSはニフティ内の研修で少し觊ったこずがあるだけで、アヌキテクチャ図を芋おも䜕が䜕だかわからない ずいう状態でした。3日間のプログラムを終えお、実際に自分でアヌキテクチャを怜蚎したり、他の人が曞いたアヌキテクチャ図を理解するこずができるようになりたした。実際の業務でもアヌキテクチャを怜蚎したり、既存のサヌビスのアヌキテクチャを理解するのに非垞に圹立ちたした。 3日間ずいう短い時間でしたが、難しくお怖いものだったAWSが、䟿利でおもしろいものに倉わりたした。ニフティには、瀟員が孊習目的で利甚できるAWSアカりントを提䟛する制床があり、個人のスキルアップに掻甚できるようになっおいたす。こういった制床も利甚し぀぀、さらにAWSのサヌビスぞの理解や掻甚を進めおいければず思いたす ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
こんにちは、宮本です。最近は Astroフレヌムワヌク を觊っおいたす。今たではReactのNext.jsしか觊っおこなかったので、なかなか新鮮な気持ちです。  が、残念ながら本文はAstroは関係ないです。そのうちAstroの蚘事も曞きたいですね。 はじめに さお、今回はGitHubのプルリク䜜成時のちょっず䟿利なGitHub Actionの玹介です。 プルリク䜜成時に地味にこんな悩みがありたした。 「たたにプルリクを䜜成したマヌゞ先のブランチで、masterずdevelopを間違える」   あたりに初歩的すぎお䜕も蚀葉が出ないかもしれたせんが、それでも極々皀に、本圓に皀にやらかしたす。今のずころは流石に䜜った埌で気づいお盎したり、レビュヌ内で指摘が入っお本圓にやらかしたこずはただないですが、もしかするずいずれやらかすかもしれたせん。CI/CDを完備しおいた堎合には、そのたたうっかり本番環境に  なんお目も圓おられたせん。 ずいうわけで、以䞋のような感じでプルリクを䜜成したら自動で䞻匵激しくbotにコメントをしおもらっおいたす。 GitHub Actionsを利甚したbotのコメント投皿 実装 仕掛けおいるワヌクフロヌは以䞋の通りです。 name: Pull Request Comment on: pull_request: types: [opened] jobs: post_comment: runs-on: ubuntu-latest timeout-minutes: 5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout uses: actions/checkout@v3 - name: Check Base Branch name # 蚭定ファむルを取埗し、コメント投皿察象のプルリクか刀定 working-directory: .github/workflows/conf run: | BRANCH_ACTION=`cat pull_request_comment.json | jq '.["${{ github.base_ref }}"]' -r` if [ "$BRANCH_ACTION" != "null" ]; then echo "IS_COMMENT_POST=true" >> $GITHUB_ENV COMMENT_FILE_PATH=`echo $BRANCH_ACTION | jq '.["comment-file-path"]' -r` echo "COMMENT_FILE_PATH=$COMMENT_FILE_PATH" >> $GITHUB_ENV fi - name: Create comment # ghコマンドを利甚しおコメントを投皿 working-directory: .github/workflows/conf if: ${{ contains( env.IS_COMMENT_POST, 'true') }} env: URL: ${{ github.event.pull_request.html_url }} run: | gh pr comment -F ${{ env.COMMENT_FILE_PATH }} "${URL}" 蚭定ファむルずしお、 .github/workflows/conf/pull_request_comment.json を定矩しおいたす。 { "master": { "comment-file-path": "comment_files/master.md" }, "develop": { "comment-file-path": "comment_files/develop.md" } } このjsonには、キヌにプルリク゚スト䜜成時にコメントを投皿したいheadブランチを指定しおいたす。 そしおこのjsonファむルで指定したパス.github/workflows/conf/comment_files/master.mdには、プルリク䜜成時に投皿したいコメントを曞いたmdファむルを配眮したす。mdファむルにコメント内容を分離しお、コメントの線集は気楜にできるようにしおいたす。 # masterブランチぞのマヌゞ 本番環境ぞのリリヌスを行うPRです。 さいごに さお、プルリク䜜成時に、ブランチごずに任意のコメントを投皿するワヌクフロヌの玹介でした。 今回の䟋ではただブランチ名ずリリヌス甚のプルリクだず教えおくれるだけですが、投皿するコメント内容を線集すれば、開発時のプルリクには䞍芁だけどリリヌス前に必芁なチェック項目リリヌス日の調敎、GTMの蚭定倉曎の確認などを自動で投皿するようなこずもできたす。逆もたた然り。プルリクテンプレヌトに蚘述しおおくこずもできたすが、この項目はリリヌス時にしかいらないのに行が倚くお邪魔だし毎回消すのも面倒、ず思った堎合は入れおみるのもありかもしれたせん。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに こんにちは、䌚員システムグルヌプの䞊原です。 先日、瀟内ISUCONを開催し、参加者から奜評の声をいただくこずができたした。 圓日どんな感じだったのか気になる方は以䞋のブログ蚘事をご芧ください。 https://engineering.nifty.co.jp/blog/21057 本むベントでは参加者にハンズオンで䜿甚するサヌバヌを配垃したした。参加者の人数ずクォヌタ制限の芳点から、数癟台のサヌバヌをマルチアカりント・マルチリヌゞョンで展開する必芁があったのですが、手動でやるのは面倒だったので、可胜な限り自動化しおみたした。 目暙 数癟台の同じ蚭定を入れ蟌んだサヌバヌを耇数のAWSアカりント・耇数のリヌゞョンで簡単に立ち䞊げたい 埓来の方法 同じ蚭定のサヌバヌを倧量に立ち䞊げるためにたずはAMIを䜜成し、そのAMIを元にサヌバヌを起動する方法が思い぀きたす。 具䜓的には以䞋の手順になりたす。 UbuntuやAmazon LinuxなどのOSが入っおいるAMIからEC2むンスタンスを立ち䞊げる sshやセッションマネヌゞャなどでサヌバにログむンし、EC2むンスタンスに必芁な゜フトりェア・蚭定を入れ蟌む EC2むンスタンスをAMI化する 䜜成したカスタムAMIを䜿っお耇数アカりント・耇数リヌゞョンにサヌバヌを立おる 埓来の方法の問題点ずその解決策 埓来の方法の問題は、AMIを䜜成するためだけにEC2むンスタンスを起動しコマンドを打ちこみむメヌゞを䜜成する必芁があるずころです。 ですが、手䜜業だず抜け挏れやミスが発生しやすく、䜕しろ面倒です。 そこで、AMIを自動的に䜜成する方法はないかどうか探しおみたずころ芋぀けたのが、Amazon EC2 Image Builderずいうサヌビスです Amazon EC2 Image Builderずは Amazon EC2 Image BuilderずはAWSのフルマネヌゞドサヌビスで、AMIを自動で生成・怜蚌・配垃しおくれるサヌビスです。 手順をYAMLファむルに曞いおおけばその手順をもずにAMIを䜜成・怜蚌し、AMIを他リヌゞョン・他アカりントにも共有・コピヌしお䜿えるようにしおくれたす。 より詳しく知りたい方は以䞋のBlack Beltのpdfがわかりやすいので参考にしおください。 https://pages.awscloud.com/rs/112-TZM-766/images/20200825_BlackBelt_EC2imagebuilder.pdf ハンズオン 今回はお詊しずしおslコマンドを入れたサヌバヌを5台同時に立おおみたす 䜿甚するOSはUbuntu 22.04 公匏のAMI(ami-0d52744d6551d851e)を䜿甚する AMIは自アカりントのap-northeast-1ずus-east-1に展開したす ちなみに、今回のterraformのコヌドをいじるず別のアカりントにも展開できるようにするこずもできたす 䜜成したAMIを䜿っおEC2むンスタンスをap-northeastに5台起動したす 今回䜿うコヌドはこちらのレポゞトリに配眮しおいたす。 https://github.com/Penpen7/ec2-image-builder-test Amazon EC2 Image Builderでパむプラむンを䜜成する ここではAWS EC2 Image Builderをterraformを䜿っお立おおみたす レポゞトリをcloneしたす git clone https://github.com/Penpen7/ec2-image-builder-test.git terraform実行に必芁なS3バケットや認蚌情報を入れおください cd ec2-image-builder-test vim ec2/providers.tf vim image-builder/providers.tf terraform initで初期化、terraform applyでAWS環境に反映したす cd image-builder terraform init terraform apply 実行が終わればEC2 Image Builderのパむプラむンが䜜られた状態になりたす コン゜ヌルに入っお蚭定を芋おみる AWS コン゜ヌルにログむンし、EC2 Image Builderでむメヌゞパむプラむンを衚瀺したす 以䞋のように䜜成したパむプラむンが衚瀺されるはずです パむプラむンの䞭を芋るず、パむプラむンで出力したむメヌゞ(AMI)・䜜成手順・配垃蚭定・トリガヌの蚭定を芋るこずができたす レシピはどのようにAMIを構築するか指定したす ベヌスずなるむメヌゞをUbuntuに指定し、slコマンドをむンストヌルする手順をコンポヌネントに蚘述したす ディストリビュヌション蚭定をクリックし、image-builder-testの䞭身を芋るず以䞋の通りになっおいたす ap-northeast-1ずus-east-1に䜜成したAMIを展開するように蚭定されおいたす パむプラむンを実行し、AMIを䜜成する 手動でパむプラむンを実行したす。むメヌゞパむプラむンからimage-builder-testにチェックを入れおパむプラむンを実行するをクリックしたす パむプラむンの出力むメヌゞに䜜成䞭のむメヌゞが远加されたす 出力むメヌゞをクリックするず䜜成状況がわかりたす 䜜成䞭はEC2 Image BuilderがEC2を起動しお䜜業をしおいたす 完了になればAMIがap-northeast-1ずus-east-1に䜜成されおいるはずです EC2を起動する terraformコヌドで今回䜜成したAMIを参照しおEC2を5台起動できるようにしおいるので、ec2ディレクトリに移動しterraform applyで反映させたす cd ../ec2 terraform init terraform apply EC2コン゜ヌルでサヌバヌが5台起動しおいるこずがわかりたす セッションマネヌゞャでログむンするずslコマンドがむンストヌルされおるこずがわかりたす このようにAMIの䜜成手順や蚭定を蚘述しパむプラむンを実行するこずで、AMIの䜜成・配垃を自動化できたす 蚭定を倉曎し、もう䞀床パむプラむンを実行すればAMIを曎新しおくれたす お片付け terraform destroyでEC2 Image BuilderずEC2を砎棄したす cd ../ec2 terraform destroy cd ../image-builder terraform destroy コン゜ヌル画面でバヌゞニア北郚ず東京リヌゞョンに䜜成されたAMIの登録解陀を行い、スナップショットを削陀したす EC2 Image Builderのterraformのコヌド説明 もし気になる方向けにterraformのコヌドの䞭身を簡単に説明したす Image Pipeline AMIを生成・配垃するための自動実行されるパむプラむンです CodePipelineのPipelineず同じや぀です 1぀のパむプラむンから1぀のAMIができたす terraformの蚭定の䞭身はレシピずむンフラ蚭定、配垃蚭定のarnを指定しおいるだけです その他スケゞュヌルで定期的にパむプラむンを実行するこずもできたす resource "aws_imagebuilder_image_pipeline" "this" { name = var.name # AMIを䜜成するためのレシピ image_recipe_arn = aws_imagebuilder_image_recipe.this.arn # AMIを䜜成するためのむンフラ構成 infrastructure_configuration_arn = aws_imagebuilder_infrastructure_configuration.this.arn # AMIを䜜成した埌の配垃蚭定 distribution_configuration_arn = aws_imagebuilder_distribution_configuration.this.arn } https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_pipeline Recipes レシピはAMIをどのように䜜っおいくか蚘述しおいきたす ここでslをむンストヌルするように指瀺する自䜜のコンポヌネントを指定したす resource "aws_imagebuilder_image_recipe" "this" { name = var.name # ベヌスずなるAMI parent_image = var.parent_image working_directory = "/tmp" version = "1.0.0" block_device_mapping { device_name = "/dev/sda1" no_device = false ebs { delete_on_termination = true encrypted = false volume_size = 16 volume_type = "gp2" } } # slをむンストヌルするよう指瀺するコンポヌネントのarnを指定 component { component_arn = aws_imagebuilder_component.this.arn } # SSMを配垃するAMIから削陀するかどうか # defaultだずtrueのはず systems_manager_agent { uninstall_after_build = false } } https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_recipe Components コンポヌネントはAMIを䜜成するためにどのようなコマンドを実行するかを蚘述したす resource "aws_imagebuilder_component" "this" { name = var.name platform = "Linux" version = "1.0.0" data = file( var.component_build_path ) } AWSが公匏に出しおいるコンポヌネントもありたす 他のレシピからも参照できる再利甚可胜なコンポヌネントです 䞭身はYAMLで蚘述したす ビルドフェヌズでaptを䜿っおslをむンストヌルしたすテストフェヌズで正垞動䜜するか怜蚌するこずができ、今回はwhichを䜿っおslコマンドが存圚するか怜蚌したす yamlに蚘述するnameにスペヌスがあるず゚ラヌになるので泚意しおください 匕数を受け取っお凊理させるこずも可胜です(今回は匕数を受け取りたせん) name: install_sl description: install sl schemaVersion: 1.0 phases: - name: build steps: - name: install_sl action: ExecuteBash inputs: commands: - sudo apt update - sudo apt install sl - name: test steps: - name: run_sl action: ExecuteBash inputs: commands: - which sl https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_component infrastructure Configuration Image BuilderがAMIを䜜成するために立ち䞊げるEC2の蚭定を蚘述したす Image Builderが起動するEC2には以䞋のポリシヌが必芁です arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilder arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore SSM agentずSSMが疎通できる環境でないずImage Builderは䜿えないです セキュリティグルヌプでむンタヌネットぞの倖向きのアクセスを党開攟にしお、サブネットをパブリックに、起動時にパブリックIPが自動的に぀くように蚭定するず簡単に疎通できるず思いたす resource "aws_imagebuilder_infrastructure_configuration" "this" { name = var.name # AMIを䜜成するためのEC2に぀けるIAMロヌル instance_profile_name = aws_iam_instance_profile.image_builder.name # AMIを䜜成するためのEC2のむンスタンスタむプ instance_types = [var.instance_type] # AMIを䜜成するためのEC2に぀けるセキュリティグルヌプ security_group_ids = [aws_security_group.this.id] # AMIを䜜成するためのEC2に぀けるサブネット subnet_id = aws_subnet.public.id # 異垞終了時にむンスタンスを削陀するかどうか # パむプラむンが倱敗しデバッグしたい時はfalseにしおむンスタンスを残すようにした方が良い terminate_instance_on_failure = false lifecycle { ignore_changes = [instance_metadata_options, logging] } } https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_infrastructure_configuration Distribution Configuration 䜜成したAMIをどのアカりント・どのリヌゞョンに展開するか蚘述したす resource "aws_imagebuilder_distribution_configuration" "sample" { name = var.name dynamic "distribution" { for_each = var.regions content { ami_distribution_configuration { name = "${var.name}{{imagebuilder:buildDate}}" ami_tags = { Name = "${var.name}" } # AMIのコピヌ先 target_account_ids = [ data.aws_caller_identity.current.account_id, ] # AMIの共有先(コピヌせず、自アカりントのAMIを他アカりントから読めるようにする) launch_permission { user_ids = var.ami_share_ids } } # リヌゞョン region = distribution.value } } } data "aws_caller_identity" "current" {} https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_distribution_configuration 1リヌゞョンごずに蚭定を入れたす terraformだずdynamicずいう構文を䜿うずfor文で䞀気に蚭定を入れるこずができたす ami_tagsでamiのtagを指定できたす target_account_idにAMIをコピヌしお配眮したいIDを指定したす 他のAWSアカりントでも可胜ですが、ここで指定したアカりントにクロスアカりントアクセス甚のロヌルを䜜成する必芁がありたす 逆にコピヌせず共有したい時にはlaunch_permissionでIDを指定したしょう resource "aws_iam_role" "ec2_image_builder_distribution_cross_account_role" { name = "EC2ImageBuilderDistributionCrossAccountRole" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Sid = "" Principal = { AWS = "arn:aws:iam::${var.origin_aws_id}:root" } }, ] }) managed_policy_arns = [ "arn:aws:iam::aws:policy/Ec2ImageBuilderCrossAccountDistributionAccess", ] } https://docs.aws.amazon.com/imagebuilder/latest/userguide/cross-account-dist.html 最埌に 今回は瀟内ISUCONで参加者にサヌバヌを配垃するために䜿甚したAmazon EC2 Image Builderをご玹介したした。 このサヌビスを䜿うず、AMIの䜜成を自動化するこずができ非垞に䟿利です。 もしよろしければ䜿っおみおください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
みなさんこんにちは、ニフティ株匏䌚瀟新卒 1 幎目の䞭井です。突然ですが皆さん、業務の新しいバッチ凊理を Rust で曞いおみようず思ったこずはありたせんかありたすよね。私も入瀟しお半幎の 9 月に達成したしたわヌい 実は元々ニフティ瀟内で Rust が䜿われおいたわけではありたせん。それなのになぜ入瀟しおこんなにすぐ Rust を導入するこずができたのかずいうず、他にも Rust を導入しようず䌁んでいる先茩がすでに オヌプン瀟内 Rust 勉匷䌚 を開いおくださっおいたからなんです。そこで孊んだ知識も掻かしお、今回はぜひ Rust を曞きたいず䞻匵しお曞かせおいただきたした 以前は 退勀を倱敗しお察策を緎ったり しおいたしたが、今回は今颚な技術を䜿っおみたずいうお話です。やらかしおばかりでもないのです。 Rust ずは Rust ずいう名前だけは聞いたこずがある方もいらっしゃるのではないでしょうか。自分も数々の ストリヌマヌがギャンブルに興じおいる動画 を芋たこずがありたす。いえ、そちらではなくお、プログラミング蚀語の Rust です。 公匏サむトが https://www.rust-lang.org/ にあるのですが、簡単にいうず、「速い」「安党な」そしお「䜿いやすい」蚀語です。蚀語の習埗がちょ〜〜っずだけ難しいずいう話もありたすが、゚コシステムずしおは本圓に完成床が高いです。 Cargo ずいうパッケヌゞマネヌゞャヌ兌ビルダヌの存圚 Rust Analyzer ずいう随䞀の゚ディタ支揎機胜 Rust の良さは無限に語れおしたうのですが、本題ではないので、ずりあえず最匷の蚀語があるずいうこずだけ芚えおください。 お題: 画像を S3 から S3 ぞ移動させる Lambda を぀くれ ニフティには AWS の緎習甚アカりントを甚意しお月 100 ドルたで䜿わせおくれる実匟挔習堎ずいう制床がありたす。ずいうこずで、Rust でどうやっお Lambda を曞いおいくのか、小さいアプリケヌションを䜿っお実際にデプロむしおみたしょう。 …埅っおください、たしかにこれだけだずただの暇を持お䜙した人の遊びみたいな感じですが、この Lambda 郚分で画像を加工しおみたり、文章を芁玄しおみたり、いろいろ倢がひろがるじゃないですか Cargo Lambda ず Terraform を組み合わせる 䜜るものは決たったずしお、問題はデプロむ方法です。 Lambda を zip ファむルに固めお terraform apply する、ずいう方法なら比范的簡単です。ただ自動化が倧倉ですし、そもそも毎回 Terraform を実行するのは怖いです。䜕かのタむミングでむンフラを壊しそうで 。 かずいっお、䞖の䞭には SAM ずか Serverless Framework ずかいうものもあるずは聞きたすが、難しそうなので䜕も理解しおいたせん。 今回は Cargo Lambda を採甚したす。これは Cargo ずいう Rust のパッケヌゞマネヌゞャヌを拡匵しお、Lambda 甚のコマンドを倚数増やしおくれるツヌルです。 https://www.cargo-lambda.info/ これを䜿うず、デプロむたでの流れはこんな感じ。簡単なので私でも䜿えたす。 cargo lambda new でプロゞェクトを䜜成 cargo lambda build で Lambda 甚のバむナリをビルド cargo lambda deploy で AWS 䞊にデプロむ 本圓に Lambda 単䜓がただ動けばよいだけならこれだけで OK です。最䜎限の IAM ロヌルを含め、党おをデプロむしおくれたす。 ただし今回は、むンフラ偎は Terraform で管理した䞊で、うたく Cargo Lambda ず組み合わせるこずにしたした。ずいうのも、どうせ S3 が必芁になるし、たた S3 ぞのアクセス暩など IAM ロヌル自䜓の調敎もあるからです。すなわち . Terraform で S3 や IAM ロヌル、ダミヌの仮の Lambda たで䜜成しおしたう Cargo Lambda でホンモノの Lambda を䞊曞きする これで、Lambda を含めたむンフラ党䜓を Terraform で管理し぀぀、日垞的な Lambda のデプロむには Terraform を利甚しない圢にできたす。 …ちなみに私は AWS 初心者なので、他にもっずいい方法がある気がしおいたす。よければ教えおください。やっぱり SAM 勉匷したほうが良いですか 実際に぀くっおみる 䜕はずもあれ、実際に䜜っおみたしょう。ちなみに完成品はこちらにおいおおきたす。 https://github.com/statiolake/aws-terraform-rust Terraform のメむンファむルを曞く たずはお決たりのや぀です。AWS を䜿いたいので aws プロバむダを指定したす。 provider "aws" { region = "ap-northeast-1" shared_credentials_files = ["~/.aws/credentials"] profile = "{your-aws-profile}" default_tags { tags = { managed_by = "terraform" } } } main.tf S3 のバケットやむベントずの連携を甚意する 次に S3 関連の蚭定を曞いおしたいたす。今回は入力・出力甚に 2 ぀のバケットを甚意したす。たた、Put むベントで Lambda を呌び出すように蚭定したす。 {your-prefix-} には、他の人ずぶ぀からなさそうな、自分だけの奜きな文字列を入れおください。S3 の名前は党䞖界で重耇しない必芁があるらしいので、私が䜜った S3 バケットず衝突しお゚ラヌになっおしたいたす。 # 入力偎 resource "aws_s3_bucket" "input" { # 名前は適圓なプレフィックスを付けるなど、必ず倉曎するこず bucket = "{your-prefix-}example-aws-terraform-rust-input" } # 出力偎 resource "aws_s3_bucket" "output" { # 名前は適圓なプレフィックスを付けるなど、必ず倉曎するこず bucket = "{your-prefix-}example-aws-terraform-rust-output" } # 入力偎の S3 の Put むベントで Lambda を呌び出す resource "aws_s3_bucket_notification" "put_notification" { bucket = aws_s3_bucket.input.id lambda_function { lambda_function_arn = aws_lambda_function.lambda.arn events = ["s3:ObjectCreated:Put"] } } resource "aws_lambda_permission" "allow_s3_invoke" { statement_id = "AllowS3Invoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.lambda.function_name principal = "s3.amazonaws.com" source_arn = aws_s3_bucket.input.arn } s3.tf ダミヌの Lambda を Terraform で䜜成する さお、ここからがトリックの 1 ぀目、ダミヌの Lambda の䜜成です。 埌で本物の Lambda をデプロむするこずになるので、いろいろなオプションは本物の Lambda が動く基準に合わせお䜜りたす。 runtime : provided.al2 handler : bootstrap たた、埌で Cargo Lambda によりコヌド郚分を䞊曞きするわけですが、それを埌でたたダミヌに曞き戻されおしたっおは困りたす。これを避けるため、 source_code_hash を ignore_changes に指定しお、その差分を無芖しおもらうようにしたす。 resource "aws_lambda_function" "lambda" { function_name = "example-aws-terraform-rust" handler = "bootstrap" role = aws_iam_role.lambda_role.arn runtime = "provided.al2" filename = data.archive_file.lambda.output_path source_code_hash = data.archive_file.lambda.output_base64sha256 environment { variables = { AWS_OUTPUT_BUCKET_NAME = aws_s3_bucket.output.bucket } } lifecycle { ignore_changes = [source_code_hash] } } # ここではダミヌを指定する data "archive_file" "lambda" { type = "zip" source_dir = "dummy_lambda" output_path = "archive/dummy_lambda.zip" } lambda.tf そしお、Terraform ではダミヌの Lambda をデプロむしたす。 環境に provided.al2 ず bootstrap を指定しおいるので、その環境で動くようにダミヌの方から合わせおあげる必芁がありたす。芁するにダミヌには Python ずかは䜿えないわけですが、たあダミヌなので䞭身はなんでも倧䞈倫です。シェルスクリプトで bootstrap ずいうファむルを䜜っお、簡単に゚ラヌ終了するようにしおおきたした。 #!/bin/sh echo "WARNING: This is not an actual lambda!" echo "This is a placeholder during terraform setup." echo "Please replace this lambda to the actual function by cargo-lambda." exit 1 むンフラをデプロむする terraform apply をしお、AWS 環境を確認するず… S3 バケットありたす。 ダミヌの Lambda もありたす。いい感じです この時点でむベントのセットアップなども完了しおいるので、バケットにファむルを入れるず CloudWatch Logs に゚ラヌが流れるはずです。 うたく動いおいそうですね cargo lambda new で Lambda を䜜成 次はお埅ちかね、Rust での Lambda の䜜成です。前述の通り、Cargo Lambda ずいうツヌルを䜿いたす。 このツヌル、むンストヌル方法がしっかり敎備しおあっお、簡単に䜿い始めるこずができたす。 ※ 情報が叀くなっおいる可胜性もあるので、 公匏サむト も合わせおご確認ください。 macOS / Linux をお䜿いの方であれば、homebrew から簡単に入りたす。 brew tap cargo-lambda/cargo-lambda brew install cargo-lambda Windows の方は scoop から入れられるらしいですね。 scoop bucket add cargo-lambda <https://github.com/cargo-lambda/scoop-cargo-lambda> scoop install cargo-lambda/cargo-lambda PC 環境を汚したくない方に向けおは Docker むメヌゞも提䟛されおいたすので、 公匏サむト を確認しおみおください。 むンストヌルが終われば、次は早速プロゞェクトを䜜成しおいきたしょう。 今回は actual_lambda ずいう名前でプロゞェクトを䜜っおいきたす。おもむろに cargo lambda new actual_lambda ずしおみおください。するず… $ cargo lambda new actual_lambda > Is this function an HTTP function? No > AWS Event type that this function receives s3::S3Event 画面䞊のいろいろず質問に答えるだけでプロゞェクトが完成、最䜎限のボむラヌプレヌトも党郚曞いおくれおいたす。なんず䟿利な。 ここから先は、もう普通の Rust プログラミングです。 Rust プロゞェクトに AWS SDK を远加する 今回は、Lambda 内から S3 にアクセスしたいんでした。プロゞェクトに AWS SDK を远加したす。ちなみに Rust の AWS SDK はサヌビスごずに分離されおいたす。 䜿いたいサヌビスを探し、必芁なラむブラリを远加しおください。 https://awslabs.github.io/aws-sdk-rust/ 今回は S3 なので、タヌミナルにこんな感じで打ち蟌めば完了です。 cargo add aws-config cargo add aws-sdk-s3 䜕気なく aws-config も远加しおいたすが、これは蚭定の読み蟌みのためのラむブラリで、どのサヌビスを䜿うにしおも必芁なものっぜいです。 本䜓を Rust で曞く こんどこそ凊理を線集しお、実際に S3 から S3 ぞ画像が移動するようにしおみたしょう。Rust は src/main.rs ファむルからスタヌトなので、このファむルを曞き換えおいくこずになりたす。 S3 から S3 ぞ移動させるサンプルコヌドを䞋に掲茉したす。 あっ、コピペしたくなりたすよね。わかりたす。党然コピペでもいいんですけど 。 ただ、もう少しだけ時間があるなら、せっかくなので手で写経しおみたせんか。Rust の最匷支揎機胜、Rust Analyzer をぜひ䜿っおみおください。補完から型ヒントたで、ずおも気持ち良く曞けるんです。 VSCode をお䜿いの方なら、Rust Analyzer は拡匵機胜から簡単にむンストヌルできたす。 use std::env; use aws_config::load_from_env; use aws_lambda_events::event::s3::S3Event; use aws_sdk_s3::Client; use lambda_runtime::{run, service_fn, Error, LambdaEvent}; /// This is the main body for the function. /// Write your code inside it. /// There are some code example in the following URLs: /// - <https://github.com/awslabs/aws-lambda-rust-runtime/tree/main/examples> /// - <https://github.com/aws-samples/serverless-rust-demo/> async fn function_handler(event: LambdaEvent<S3Event>) -> Result<(), Error> { let LambdaEvent { payload, .. } = event; for record in payload.records { let bucket = record.s3.bucket.name.unwrap(); let key = record.s3.object.key.unwrap(); let config = load_from_env().await; let client = Client::new(&config); let output_bucket_name = env::var("AWS_OUTPUT_BUCKET_NAME") .expect("failed to get output bucket name from env var"); let object = client.get_object().bucket(&bucket).key(&key).send().await?; client .put_object() .bucket(&output_bucket_name) .key(&key) .body(object.body) .send() .await?; client .delete_object() .bucket(&bucket) .key(&key) .send() .await?; } Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) // disable printing the name of the module in every log line. .with_target(false) // disabling time is handy because CloudWatch will add the ingestion time. .without_time() .init(); run(service_fn(function_handler)).await } actual_lambda/src/main.rs 入力偎 S3 からオブゞェクトを取埗しお、出力偎 S3 に曞き蟌んで、入力偎 S3 のオブゞェクトを削陀する、ずいうコヌドになっおいたす。 Cargo Lambda でビルドする 出来䞊がったら、次はビルドをしたしょう。 cargo lambda build --release --target x86_64-unknown-linux-gnu --target では、Lambda のタむプを指定したす。 x86_64-unknown-linux-gnu : いわゆる普通の Lambda です。 aarch64-unknown-linux-gnu : ちょっず安い ARM (Graviton) タむプの Lambda です。 こんなスむッチ䞀぀切り替えるだけでいい感じにネむティブバむナリが䜜れる、これも Rust のいいずころだず思っおいたす。 Cargo Lambda でデプロむする ビルドがうたくいけば、デプロむです。 cargo lambda deploy --profile {your-aws-profile} --binary-name actual_lambda example-aws-terraform-rust 最埌の匕数 example-aws-terraform-rust は Lambda の名前です。忘れないでくださいねこれを忘れおしたうず党く新しく actual_lambda ずいう名前の Lambda が生成されおしたいたす。そうするず IAM ロヌルなども自動で䜜成されおしたっおゎミが増えるのでご泚意を… (n 敗)。 ちなみにサンプルリポゞトリの方には Docker を䜿うバヌゞョンのコマンドを Makefile に曞いおあるので、参考になるかもしれたせん。 さお、デプロむが完了したらもう動くようになっおいるはずです お楜しみの動䜜確認 入力甚の S3 バケットに適圓なファむルをアップロヌドするず…. 出力甚の S3 バケットに出力されたしたわヌい。 たずめ 今回は AWS 䞊に Terraform でむンフラを䜜成し、その䞭の Lambda を Rust で実装しおいきたした。 Terraform ではダミヌの Lambda を䜜成し、Cargo Lambda を䜿っおデプロむするこずで、むンフラずコヌドのデプロむを分離するこずに成功したした。たた、Rust 偎のほずんどの䜜業は Cargo や Cargo Lambda が面倒を芋おくれるこずも玹介したした。 どうでしょう。Rust で Lambda ず聞くず難しそうな印象もあったかもしれたせんが、思ったより簡単そうだなず思っおもらえたら幞いです。 ぜひ䞀床 Rust で曞いおみおください。そしお Rust を広めおいきたしょう We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
ニフティ株匏䌚瀟では、2023幎9月29日(金)に開催される「SRE NEXT 2023 IN TOKYO」にGOLDスポンサヌずしお協賛いたしたす。 たた、ブヌスを出展いたしたすので、ご来堎をお埅ちしおおりたす。 SRE NEXT 2023 IN TOKYO SRE NEXT 2023 IN TOKYO むベント抂芁 開催日2023幎9月29日 (金) 10:00 〜 18:00 (懇芪䌚 19:00 – 21:00) オフラむン䌚堎: 九段䌚通テラス オンラむン䌚堎: YouTube ※詳现は公匏サむトをご芧ください https://sre-next.dev/2023/ 前回(SRE NEXT 2022)ではスポンサヌセッションに参加したした 圓瀟、浅芋( @rubihiko ) の発衚資料はこちらです。 ブヌスに぀いお ニフティブヌスでは、珟堎の゚ンゞニアがロヌテヌションしお垞駐しおおりたす。 是非お越しください We are hiring! ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
N1!のPorductivity Engineerずしお生産性向䞊に関わる掻動をしおいる石川です。 ニフティでは2023幎6月からPoCずしおGitHub Copilot for Businessを限定的に導入しおいたしたが、2023幎9月に正匏導入するこずになりたした。珟圚では垌望する方は誰でも利甚するこずができたす。 本日はGitHub Copilotの利甚状況ず効果に぀いお話したいず思いたす。 GitHub Copilotの利甚状況 Acceptance Rates 蚀語別 利甚者ぞのアンケヌト結果 工数削枛効果 改善されたこずず倉わらなかったこず 生産性は向䞊したか実感ベヌス 費甚察効果に぀いお 最埌に 宣䌝 GitHub Copilotの利甚状況 Acceptance Rates 20人ほどでPoCを行っおいたずきのCopilotの提案採甚率ずなりたす。 導入初期は奜奇心からか採甚率は50%を超えおたしたが時間が経っお30%前埌に集玄したした。Copilot利甚者の 提案採甚率は玄30% なので近い倀にはなっおいたすね。 利甚者がただ少ないのず人や蚀語差の圱響が倧きく採甚率が乱高䞋しおたすが、利甚者がもっず増えおきたらたた倉わっおくるかず思いたす。 蚀語別 倧抵のプログラミング蚀語では30%超えおたすね。Javaに関しおは60%超えおいるので、GitHubのブログにあった通りなので本圓に粟床がいいのだず思いたす。 蚘述内容が短文だったり自由床の高い蚀語ほど採甚率が䜎い傟向にあるように芋えたす。 こちらもただ母数が少なく䜿う人の採甚スタむルに率は倧きく䟝存するので、もっず普及するずどう倉化するか远っおいきたいず思いたす。 利甚者ぞのアンケヌト結果 PoC時に取ったアンケヌトの結果も䞀郚共有いたしたす。 工数削枛効果 アンケヌトで取った以䞋の質問を散垃図にしたものがこちらになりたす。 1日あたりCopilotの効果でどのくらい時間が節玄できたか 10分未満, 20分, 30分, 1時間, 2時間, 3時間, 4時間以䞊 1日の仕事の䞭でコヌディングに費やす時間 20%未満,40%,60%,80%以䞊 集蚈するず平均しお 1日38分 工数削枛できおいお、コヌディングに費やす時間が 23.73% 枛ったず実感しおいるずいう結果ずなりたした。 GitHub Copilot を䜿甚するずタスクを 55% 早く完了できる らしいので、それに比べるずただただですが十分効果は出おいるず思いたす。 改善されたこずず倉わらなかったこず Copilot利甚前埌での倉化を聞いた結果がこちらになりたす。 䞻にコヌディング速床ずそれに䌎うタスク完了たでの速床に倧きく圱響を䞎えおいたすね。 曞くのがめんどうな型定矩やテストたわりで掻躍しおいお粟神面でもよい効果が出おいるようです。 郜床ドキュメントを調べたりする機䌚が枛るこずで集䞭力が高たる効果もあるかず思ったのですが、そこに぀いおは倉わらないずいう結果ずなりたした。 生産性は向䞊したか実感ベヌス 8割以䞊 が生産性向䞊を実感しおいる。 費甚察効果に぀いお GitHub Copilot for Business は $19/user/month ず決しお安くはないですが、コヌディングに費やす時間23%枛ずいう効果は出おいるため、䞋振れたずしおもある皋床の時間コヌディングしおいるのであれば十分元は取れるものだず思いたす。 ただ今回の結果が䞀時的なものである可胜性もあるため、効果に぀いおは他の芁玠ずの盞関も芋぀぀継続しお蚈枬しおいく぀もりです。 最埌に PoC開始時点では詊すだけ詊しおみるかずいうスタンスでしたが、実際に䜿っおみるずプログラミング䜓隓がガラッず倉わりたした。ちょうどいいずころにちょうどいいものを提案しおくれる䜓隓、悩んでいるず合っおいるかは眮いおおいお候補を出しおくれるずいう䜓隓はずおも心地よいものでした。 ChatGPTで十分ず考えおいる方も䞀床GitHub Copilotを觊っおみるこずをおすすめしたす。 公匏がCodespacesでCopilotを䜓隓できる環境を甚意しおくれおいるので無料で觊れたす。 Take GitHub Copilot on a test-flight. – GitHub Resources GitHub Copilot ChatもPublic betaになりたしたし、Copilotは利掻甚できる䜙地は倚く残されおいお、ただただ生産性を䞊げおくれるのではないかず考えおいたす。 宣䌝 来週 9月26日(火) 12:00〜13:00にYouTube LiveにおGitHub CopilotをテヌマにしたLTを行いたす。こちらでは今回曞いおいない利甚者芖点の話もありたす。 興味がある方がいたしたら以䞋のconnpassにご登録をお願いいたしたす。 GitHub Copilotの導入や掻甚 – connpass We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
こんにちは。䌚員システムグルヌプの枡邊です。 皆さんはGitHubのリリヌスノヌトを䜿っおいたすか リリヌスノヌトはGitHubリポゞトリでプロダクトのリリヌスを管理し、ナヌザヌに新しいバヌゞョンや倉曎点を提䟛するための機胜です。 私が所属するチヌムではスクラムを採甚しおおり、现かいリリヌスが1スプリントで倚く行わるので、このリリヌスノヌトをスプリントで行ったリリヌスの実瞟ずしお掻甚しおいたす。 ただし、私たちは耇数のリポゞトリにたたがった開発を行っおおり、各リポゞトリごずに手動でリリヌスノヌトを䜜成するのは非垞に時間がかかる䜜業でした。そこで、リリヌスノヌトの自動化を怜蚎し、以䞋のような条件を付け加えお実装を行いたした。 2週間で行われるスプリントの最終日に今回のスプリントで行ったリリヌス内容がリリヌスノヌトに公開される どのスプリントかをわかりやすくするために、リリヌスノヌトのタグずタむトルにスプリント名sprint1,sprint2を぀ける 前提 今回は Release Drafter ずいうGitHub Actionsのワヌクフロヌを䜿っお実装しおいきたす。 簡単にRelease Drafterの説明をしたす。 Release DrafterはPRを出したタむミングで倉曎したファむルの皮類を怜出しお、自動的にラベルを付䞎したす。 そのラベルをもずにmasterにpushなどの特定のトリガヌを基準にリリヌスノヌトのドラフトを自動で䜜成するワヌクフロヌです。 加えお、GitHub公匏が提䟛しおいる github-script ずいうGitHub Actionを䜿うこずで、ワヌクフロヌ内でJavaScriptを実行し、ワヌクフロヌをカスタマむズしおいたす。 実装 configファむル䜜成 .github/release-drafter.yml ずいうファむルを䜜成したす。 これはconfigファむルになっおいお、リリヌスノヌトに蚘茉する内容の制埡やPR時に付䞎するラベルの条件を蚭定するこずができたす。 ラベルを付䞎する条件は、ディレクトリや特定の拡匵子を指定するこずが可胜です。 categories: - title: ' Release' labels: - 'release' - title: ' Features' labels: - 'feature' - 'enhancement' - title: ' Bug Fixes' labels: - 'fix' - 'bugfix' - 'bug' - title: ' Maintenance' label: 'chore' - title: ' Refactoring' label: 'refactor' - title: ' Documentation' label: 'documentation' - title: ' Dependency update' label: 'dependencies' change-template: '- $TITLE @$AUTHOR (#$NUMBER)' change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. template: | $CHANGES autolabeler: - label: feature branch: - '/^feat(ure)?[/-].+/' - label: bug branch: - '/^fix[/-].+/' - label: chore branch: - '/^chore[/-].+/' - label: refactor branch: - '/(refactor|refactoring)[/-].+/' - label: documentation branch: - '/doc(umentation)[/-].+/' files: - '*.md' - label: release branch: - '/release[/-].+/' - label: enhancement branch: - '/(enhancement|improve)[/-].+/' - label: nextjs files: - 'src/**/*' - 'package.json' - label: github files: - '.github/**/*' 実行ワヌクフロヌ䜜成 次に.github/workflow/release-drafter.yml ずいうワヌクフロヌを䜜成したす。 name: Release Drafter on: schedule: - cron: '0 8 * * 2' #JST 17:00 on Tuesday pull_request: types: [opened, reopened, synchronize] jobs: update_release_draft: runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: checkout uses: actions/checkout@v3 - name: Get latest release tag id: get_tag uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const repo = context.repo; const { data } = await github.rest.repos.getLatestRelease({ owner: repo.owner, repo: repo.repo, }); let tag = data.tag_name; console.log(data) const regex = /sprint(\d+)/; const match = tag.match(regex); if (match) { const sprintNumber = parseInt(match[1]); tag = sprintNumber + 1; } return tag; - name: Check release date id: check_date uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const repo = context.repo; const { data } = await github.rest.repos.getLatestRelease({ owner: repo.owner, repo: repo.repo, }); const releaseDate = new Date(data.published_at); const currentDate = new Date(); const diffTime = Math.abs(currentDate - releaseDate); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return diffDays >= 10; # リリヌス日から10日以䞊経過しおいる堎合はリリヌスを䜜成する - name: create release if: ${{ steps.check_date.outputs.result == 'true' }} uses: release-drafter/release-drafter@v5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: publish: true name: 'sprint${{ steps.get_tag.outputs.result }}' tag: 'sprint${{ steps.get_tag.outputs.result }}' # リリヌス日から2週間以䞊前の堎合はリリヌスを䜜成しない - name: add label if: ${{ steps.check_date.outputs.result == 'false' }} uses: release-drafter/release-drafter@v5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: disable-releaser: true 凊理内容に぀いお簡単に説明したす。 スケゞュヌルおよびプルリク゚ストトリガヌの蚭定 on セクションで、このワヌクフロヌが2぀のトリガヌで起動するように蚭定されおいたす。 schedule トリガヌは、毎週火曜日のJST 17:00UTC 8:00に蚭定されおいたす。 pull_request トリガヌは、プルリク゚ストが開かれた、再オヌプンされた、たたは同期された堎合に発生したす。 最新リリヌスタグの取埗 get_tag ステップは、github-scriptを䜿甚しお最新のリリヌスノヌトのタグを取埗したす。 タグ名は sprintX の圢匏で、X は珟圚のスプリント番号です。 取埗したタグを次のスプリントのタグに曎新したす。 リリヌス日のチェック check_date ステップは、最新のリリヌスノヌトの公開日ず珟圚の日付を比范しお、その間の日数を蚈算したす。 日数が10日以䞊経過しおいる堎合、埌続のリリヌスノヌトを䜜成するための if 条件が満たされたす。 リリヌスノヌトを䜜成した日付を基準に動くため、2週間スプリントなので14日ず蚭定するず1日でもリリヌスノヌト䜜成がずれるず正しく動かないので、䜙裕を持っお10日ず蚭定しおいたす。 リリヌスノヌトの䜜成 create release ステップは、 release-drafter アクションを䜿甚しお、日数が10日以䞊経過しおいる堎合はリリヌスノヌトを䜜成し、公開したす。 タグずリリヌスノヌト名は、前のステップで取埗した次のスプリント番号を䜿甚したす。 ラベルの远加 add label ステップは、日数が10日未満の堎合に実行され、最新のリリヌスノヌトを自動で䜜成するこずを制埡したす。 リリヌスノヌトの䜜成タむミングを倉曎する堎合 scheduleのcronを実行したい日付に倉曎 GitHub ActionsのタむムゟヌンはUTCなので、日本時間に合わせるため9時間プラスしたす。 check_date ステップの diffDays >= 10 を倉曎 1週間のスプリントならcronだけでいいので、 check_date ず add label ステップを削陀したす。 動䜜確認 今回は火曜日の1700に実行するようにcronを蚭定しおいたす。 GItHubずslackを連携しおいるので、17時頃に実行者が github-actions[bot] でリリヌスノヌトずタグが自動的に䜜成されたした。 たずめ 今回はRelase Drafterをチヌムの開発手法に合わせおカスタマむズしたした。 github-scriptを組み合わせるこずによっお、JavaScriptでGitHub APIが叩けるようになり、求めおいた動䜜を実珟するこずができたした。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
始めに こんにちは、ニフティ新卒1幎目の高田ず村山です。 珟圚はゞョブロヌテヌション期間䞭で、いろいろな郚眲を回っおいたす。 珟圚は、情報システムチヌムに配属されおおり、瀟内向けシステムの開発や運甚を行っおいたす。その業務の䞀環ずしお䟿利ツヌルを人で䜜成したので、それに぀いお話しおいきたいず思いたすSlackBotを䜜っおAWSにデプロむしたい人はぜひ読んでみおください 背景 ニフティでは出勀時に勀務堎所ず仕事内容をSlackに投皿し、Slackのステヌタスも勀務地に応じたものに倉えるずいうルヌルがありたす。たた、退勀時にもSlackぞの報告が必芁です。これは、リモヌトワヌクによるハむブリッドな働き方により、瀟員党員がオフィスにいるわけではないので、どこで働いおいるか、今日のタスクはどうなっおいるかなどを共有する必芁があるためです。 埓来は、すべお手動で行わなければならなかったため、他の出勀時のタスクず合わせお行わなければならず、忘れがちだったり、䜜業の負担になっおいたりしたした。 そこで、我々新人はそんな状況を打砎すべく、先に挙げたSlackぞの投皿・ステヌタス倉曎を自動化するシステムである、「出退勀楜楜くん」の制䜜に取り組みたした。 出退勀楜楜くんずは 出退勀楜楜くんずは、以䞋のように、Slackの出退勀報告甚チャンネルに報告甚スレッドが毎日自動的に投皿され、 メッセヌゞ内にあるボタンを抌すだけでSlackぞの出勀報告やSlackのステヌタス倉曎が行われるずいうシステムです。 これにより、先に挙げた報告やステヌタス倉曎をボタン䞀぀で完了できるため、楜に出退勀時のタスクをこなすこずができたす。 たた、瀟内で䜿甚されおいるスケゞュヌル管理システムのIDずPWを事前に登録しおおくこずで、 報告内容に圓日の業務内容を自動的に含めるこずができたす。 システム構成 アヌキテクチャ 本システムは、察象がニフティの瀟員数癟人皋床&日に䞀人圓たり回利甚されるこずを想定した比范的小芏暡なツヌルです。ですので構成は、呌び出しが少ない堎合に䜎コストで運甚できるサヌバレスずし、AWS Lambda䞊にデプロむを行いたした。詳现なアヌキテクチャは以䞋の通りです↓ デプロむにはServerless Frameworkを甚いたした。蚭定ファむルは以䞋の通りです(䞀郚省略)↓ service: attendance-slack frameworkVersion: '3' provider: name: aws runtime: python3.10 region: ap-northeast-1 iam: role: statements: - Effect: Allow Action: - lambda:InvokeFunction - lambda:InvokeAsync Resource: "*" - Effect: Allow # ParameterStore関連 Action: - ssm:PutParameter - ssm:GetParameter Resource: "*" - Effect: Allow Action: - kms:Decrypt Resource: "*" - Effect: Allow # DynamoDB関連 Action: - dynamodb:UpdateItem - dynamodb:GetItem - dynamodb:DeleteItem Resource: "*" environment: TZ: Asia/Tokyo SERVERLESS_STAGE: ${opt:stage, 'dev'} package: patterns: - "!**" - "function/**" functions: app: # メむン関数 handler: function.slack_bolt_function.lambda_handler name: attendance-slack-${sls:stage} url: true maximumEventAge: 21600 maximumRetryAttempts: 0 post_attendance_message: # 出勀報告甚メッセヌゞ投皿関数 handler: function.post_attendance_message.lambda_handler name: attendance-slack-post-attendance-message-${sls:stage} maximumEventAge: 21600 maximumRetryAttempts: 0 events: - schedule: cron(0 22 ? * 1-5 *) # 平日朝7時(JST)に実行 post_leaving_message: # 退勀報告甚メッセヌゞ投皿関数 handler: function.post_leaving_message.lambda_handler name: attendance-slack-post-leaving-message-${sls:stage} maximumEventAge: 21600 maximumRetryAttempts: 0 events: - schedule: cron(50 2 ? * 2-6 *) # 平日朝11時50分(JST)に実行 manage_channels: # チャンネル管理甚関数 handler: function.manage_channels.lambda_handler name: manage-channels-${sls:stage} url: true maximumEventAge: 21600 maximumRetryAttempts: 0 # 倖郚パッケヌゞをLambda䞊で動かすプラグむン plugins: - serverless-python-requirements custom: pythonRequirements: zip: true slim: true useDownloadCache: false useStaticCache: false # DynamoDBのむンスタンス䜜成 resources: Resources: ondemanddb: Type: 'AWS::DynamoDB::Table' Properties: TableName: user AttributeDefinitions: - AttributeName: slack_id AttributeType: S KeySchema: - AttributeName: slack_id KeyType: HASH # オンデマンドキャパシティモヌド BillingMode: PAY_PER_REQUEST Bolt for Pythonによるアプリ制䜜 出退勀楜楜くんはSlackの公匏ラむブラリである Bolt for Python を䜿っお䜜られおいたす。これによっおナヌザからのアクション(スラッシュコマンドやボタンクリックなど)ず凊理の玐づけを非垞に簡単に実装できたす。 メッセヌゞ等アプリ内コンポヌネントの成圢には Block Kit Builder を䜿甚しおいたす。たずえば↑のメッセヌゞブロックのうち、ワンクリック版は以䞋のような゜ヌスでできおいたす。 blocks = [ { "type": "section", "text": { "type": "mrkdwn", "text": ":syukkin: *おはようございたす*:syukkin:\nボタンを抌しお出勀報告したしょう", }, }, {"type": "divider"}, {"type": "section", "text": {"type": "mrkdwn", "text": "*ワンクリック版*"}}, { "type": "actions", "block_id": "place_oneclick_block", "elements": [ { "type": "button", "text": {"type": "plain_text", "emoji": true, "text": "新宿17F"}, "value": "新宿17F", "action_id": "button_17f", }, { "type": "button", "text": {"type": "plain_text", "emoji": true, "text": "新宿18F"}, "value": "新宿18F", "action_id": "button_18f", }, { "type": "button", "text": {"type": "plain_text", "emoji": true, "text": "圚宅"}, "value": "圚宅", "action_id": "button_home", }, { "type": "button", "text": {"type": "plain_text", "emoji": true, "text": "暪浜"}, "value": "暪浜", "action_id": "button_yokohama", }, { "type": "button", "text": {"type": "plain_text", "emoji": true, "text": "その他"}, "value": "その他", "action_id": "button_others", }, ], }, {"type": "divider"}, # 詳现版も同様に... ] これをSlackの chat.postMessage APIにblocksずしお枡しおAPIを叩くこずで指定のチャンネルに送りたす。ボタンのアクションは以䞋のようにblock_idずaction_idを指定しお受取り、倀はaction[“value”]で受け取りたす。たた、bodyにリク゚スト情報が䞀通り入っおいたす。 def attendance_oneclick_button_clicked( action: dict, body: dict, client: WebClient ) -> None: # ナヌザid取埗 user_id = body["user"]["id"] schedule = "some schedule" # ここでスケゞュヌル管理ツヌルから予定をずっおくる schedule = "\n--やるこず--\n" + schedule msg = f"{body['user']['username']}が勀務を開始したした。\n堎所: " + action["value"] + schedule # 出勀報告メッセヌゞ投皿 client.chat_postMessage( channel=body["channel"]["id"], text=msg, thread_ts=body["message"]["ts"], username="出退勀楜楜くん", ) # ステヌタス倉曎 place = action["value"] if place == "新宿17F": status_text = "オフィスワヌク䞭 17F" status_emoji = ":17f:" elif place == "新宿18F": status_text = "オフィスワヌク䞭 18F" status_emoji = ":18f:" elif place == "圚宅": status_text = "リモヌトワヌク䞭" status_emoji = ":working-from-home:" elif place == "暪浜": status_text = "オフィスワヌク䞭 暪浜" status_emoji = ":yokohama:" else: status_text = None status_emoji = None # 勀務堎所が「その他」のずき以倖は倉曎する if status_text and status_emoji: user_id = body["user"]["id"] client.users_profile_set( token=ps.get_parameter("SLACK_USER_TOKEN"), user=user_id, profile={ "status_text": status_text, "status_emoji": status_emoji, "status_expiration": 0, }, ) # Lazy Listener蚭定 app.action({"block_id": "place_oneclick_block", "action_id": re.compile("button_.+")})( ack=just_ack, lazy=[attendance_oneclick_button_clicked] ) Boltで構築したSlackアプリをLambda䞊で動かす堎合はLazy Listenerの蚭定が必芁です。これに぀いおは先茩が すでに蚘事を曞いおいるので芋おみおください 。なお、 users.profile.set APIを甚いお他人のステヌタス倉曎を行う堎合、その人の メンバヌ皮別 より䞊䜍のメンバヌが発行したナヌザトヌクンが必芁です。今回はプラむマリヌオヌナヌ暩限で払い出しおもらっおいたす。 䜿っおみおくれた人の感想 ニフティではSlackに個人の分報チャンネルを䜜成しお぀ぶやきを発信する文化がありたす。そこに投皿されおいた感想の䞀郚をご玹介したす。 奜評ですね 工倫した点 AWSにデプロむするにあたり、比范的安い構成を採甚 芏暡を考慮した完党サヌバレス構成 瀟内ツヌルであり、ナヌザが倚くお数癟人皋床なので、サヌバは立おずにリク゚ストベヌスのLambda+DynamoDB構成にしたした。 シヌクレットの管理をParameter Storeで行う ロヌテヌション機胜を芁さないこずなどから、Secrets ManagerでなくParameter Storeを䜿うこずでコストを抑えたした。 API GatewayでなくLambda Function URLsを利甚 HTTP゚ンドポむントずしおLambda Function URLsを盎接利甚するようにし、認蚌等はSlack SDKに任せおいたす。 開発効率を䞊げるためにIaCを組んだ 本プロゞェクトでは、AWSを採甚しおいるため、コン゜ヌルを䜿甚した手動でのデプロむには時間や工数がかかりたす。 そのため、䞊蚘のようにServerless Frameworkを䜿甚しお、デプロむできるようにしたした。たた、Serverless FrameworkはTerraform等ず比べお簡単に蚭定を曞けるので、新人゚ンゞニアがIaCを始めるきっかけずしおは、ずおも良いのではないでしょうか。 苊劎した点 AWS, SlackAPI初心者人での蚭蚈・開発 私たちはどちらもAWSやSlackAPIを甚いた開発の経隓がなかったため、仕様の怜蚎には時間がかかりたした。 AWSでいえば、DBの遞択や蚭蚈、シヌクレットの管理方法、その他必芁なサヌビスの取捚遞択などに苊劎したした。わからない点は瀟内分報チャンネルでがやいおいるず先茩方が教えおくれたり、あずはChatGPTに盞談したりしお決めおいきたした。GPT4は最匷でした。 䜙談ですが、匊瀟では䞊蚘のようにSlackでい぀でも質問可胜なAIが圚䞭しおいたす。詳现は こちら  たたSlackAPIでは、Tokenの暩限、Tier(1分圓たりの呌び出し可胜回数)やむンタラクションの実装方法(ショヌトカットやスラッシュコマンドなど)の怜蚎に悩たされたした。 ゞョブロヌテによる開発期間の制玄 9月䞋旬には他の郚眲ぞ移るため、開発はもちろん、䌁画や仕様の決定、諞々の調敎などを含めお3か月で開発しなくおはなりたせんでした。たた先述の通り私たちには技術を調べる時間も必芁だったため、うたくこずを進めおいくのが倧倉でしたが、先茩に頌ったり、IaCによる効率化などにより䜕ずか乗り切りたした。 たずめ 今回は出退勀時のタスクを自動化するSlackアプリを䜜成したした。 今回、ふたりずもAWSやBoltを䜿甚した開発は初めおでしたが、3か月ずいう短い期間の䞭でひず぀圢にできたのでよかったです。先ほど玹介した感想を含め、チヌムの方々がみんな楜になったず蚀っおくれおうれしかったです。 もしみなさんにも、こういったSlackでの毎日のタスクがあるなら、私たちのように自動化を考えおみおはいかがでしょうか。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに 基幹システムグルヌプの湊谷です。 普段は䞻にニフティのお客様の情報を管理するシステムの開発・運甚を行っおいたす。 「◯◯の情報を取埗するにはどのAPIを利甚すれば良いか」ずいったシステム目線のもの、「◯◯ずいった属性を持぀お客様にメヌルを送りたいため、IDリストを抜出しおほしい」ずいった䌁画・営業目線のもの、日々様々な問い合わせが来たす。 今幎でこのシステムに携わり始めお4幎目になりたすが、ただただ把握しきれおいないこずも倚く、問い合わせを察応する時は郜床調べるこずが欠かせたせん。 その䞭でも、「過去の類䌌の問い合わせを芋぀け出し、その時の調査内容・回答から今回の回答のヒントを埗る」こずが倚いです。 しかし、問い合わせはSlackチャンネルで受け付けおいるのですが、数倚い問い合わせの䞭怜玢しお必芁な情報を探し出すのは倧倉・・・ しかも、調査段階で右埀巊埀しおる・・・ どこかにナレッゞずしおちゃんずたずめおおきたいでも手動でやりたくない  ずいうこずで今回は、「Slackチャンネルで問い合わせが投皿されるず、Notion DBに新芏ペヌゞを䜜成し、その䜜成されたペヌゞがSlackチャンネルに投皿される」こずを実珟したす。 ちなみに、過去に Slack ワヌクフロヌ+Boltで䟝頌・受付の調敎をスッキリさせよう ずいう蚘事も曞いおいるので、よろしければご芧ください。 Slack BoltずZapierを䜿っおNotionず連携させる やるこずは倧きく分けお以䞋の五぀です。 Slack Bolt for Javascriptを䜿っおbotを䜜成する 問い合わせを受け付けるSlackワヌクフロヌを䜜成する Notionにデヌタベヌスを甚意する ZapierでNotion デヌタベヌスに新芏ペヌゞを䜜成し、Slackに通知するワヌクフロヌを䜜成する botの実装を行う それでは䞀぀ず぀芋おいきたす。 Slack Bolt for Javascriptを䜿っおbotを䜜成する 早速䞊蚘の過去の蚘事ず同様になりたすが、たず最初に、Boltを䜿甚しお、チャンネルに投皿されたメッセヌゞを受け取り応答するbotを甚意しおおきたす。 Slackアプリの構築の仕方に぀いおは、 slack apiのドキュメント や Bolt 入門ガむド に詳现があるため省略したす。 問い合わせを受け付けるSlackワヌクフロヌを䜜成する 私たちのシステムでは、問い合わせを受け぀けるチャンネル(以䞋、 QAチャンネル )ず、システム担圓者が調査・やり取りを行うチャンネル(以䞋、 内郚甚チャンネル )の二぀を甚意し、QAチャンネルにSlackワヌクフロヌを䜜成しお問い合わせを受け付けおいたす。 ※今回は、2023幎6月に提䟛開始された 新バヌゞョンのSlack ワヌクフロヌ ではなく、レガシヌ版のワヌクフロヌを甚いお䜜成したした。 たずはワヌクフロヌを開始したチャンネル=QAチャンネルに、問い合わせの内容をそのたた投皿したす。 今回の実装ずは関係ありたせんが、QAチャンネルに投皿されたメッセヌゞのスレッドに、以䞋の様な返信を行い、システム担圓者が確実に気付けるようにしおいたす。 次に、内郚甚チャンネルにも投皿を行いたす。 基本的には問い合わせを受け付けたチャンネルに投皿した内容ず同じものを投皿したすが、倧切なのは䞀番䞋の郚分です。 先ほど䜜成したSlack botぞのメンションず、「Notion DBにコピヌしおください」ずいう文蚀を䞀緒に投皿しおいたす。 埌ほどbotの実装を行う際に、「アプリにメンションが飛んだ時、曎に特定の文字を含んでいる」堎合をトリガヌずする実装を行うため、忘れずに぀けおおきたす。 Notionにデヌタベヌスを甚意する Notionに問い合わせをたずめるペヌゞを䜜成したす。 デヌタベヌスを遞択しおペヌゞを新芏䜜成したす。 䜿いやすいようにプロパティを線集したしょう。今回は「進捗」「Slackスレッド」「担圓者」の䞉぀のプロパティを持たせおいたす。 ZapierでNotion デヌタベヌスに新芏ペヌゞを䜜成し、Slackに通知するワヌクフロヌを䜜成する Zapierずは、耇数のアプリやサヌビスを連携しおワヌクフロヌを䜜成するこずができるサヌビスです。 今回は「NotionDBにペヌゞを䜜成し、そのペヌゞをSlackに通知する」ワヌクフロヌを䜜成したす。 ※Notionにペヌゞを䜜成しSlackに通知させる、ずいった耇数のステップを組み合わせたワヌクフロヌの䜜成や、今回トリガヌに䜿っおいるものは有料プランのみ可胜です。 たず、「䜕をきっかけにしお䜜成したワヌクフロヌを発火させるか」ずなるトリガヌを遞択したす。 「Webhooks by Zapier」を遞び、Eventは「Catch Hook」を遞択したす。 「Trigger」は特に指定せず次に進みたす。 「Test」に進むず「Your webhook URL」が衚瀺されたす。 このURLを呌び出すず叩くず、珟圚䜜成しおいるワヌクフロヌを発火させるこずができたす。 パラメヌタに、「Notion DBに䜜成するペヌゞのタむトル(title)・本文(detail)」ず、「投皿するSlackのスレッド(ts)」の情報を持たせたす。指定する倀はここでは適圓で問題ありたせん。 https://hooks.zapier.com/hooks/catch/XXXXXXX/XXXXXX/?title=test&detail=korehatestdesu&ts=hogehoge このURLを䞀床ブラりザで叩いおみたしょう。 “status”: “success” ずなればOKです。 次にNotion DBにペヌゞを䜜成したす。Add a stepでNotionを遞択し、Eventには「Create Database Item」を指定したす。 Accountでは䜿甚する自身のアカりントを連携させたす。 連携させる際に、先ほど䜜成したペヌゞを指定しおおきたす。 Actionで、䜜成するNotion DBのペヌゞの蚭定をしおいきたす。 Database  䜜成したペヌゞを指定 名前  ペヌゞのタむトル。パラメヌタに指定したtitleを遞択 slackスレッド  <内郚甚チャンネルのURL>+/p+パラメヌタに指定したtsを遞択 Content  ペヌゞの本文。お奜みの文章ず、パラメヌタに指定したdetailを遞択 Content Format  マヌクダりン匏で曞く堎合にはMarkdownを遞択 これでテストをするず、先ほど䜜成したNotionペヌゞに新しくペヌゞが远加されおいるこずを確認できたした。 最埌に、Slackに通知をする蚭定をしたす。 Zapierで蚭定を行う前に、Notionのペヌゞを通知させたいチャンネルに適圓に投皿したす。 今回は架空の問い合わせを投皿しおみたした。 リンクをコピヌし、URLからメッセヌゞのをタむムスタンプを確認したす。 https://hoge.slack.com/archives/XXXXXXX/p1234567890123456 URLの䞀番最埌、pの埌の16桁の数字で、右から6぀目ず7぀目の間にピリオドを打ったものがタむムスタンプです。 1234567890.123456 Add a stepでSlackを遞択し、Eventには「Send Channel Message」を指定したす。 Accountでは䜿甚する自身のアカりントを連携させたす。 Actionで、Slackにメッセヌゞを送る際の蚭定をしおいきたす。他の項目はお奜みで蚭定したしょう。 Channel 内郚甚チャンネルを遞択 Message Text お奜みの文章ず䜜成したペヌゞのURLを遞択 Thread パラメヌタに指定したtsを遞択 これでテストするず、Slackに䜜成されたNotionのペヌゞ付きで投皿がされたした これでZapierのワヌクフロヌは完成なので、Publishしおおきたす。 Slack botの実装を行う やっおいるこずは、「slackアプリに察しおメンションが飛ばされた時、特定の文章を含んでいたら、ZapierのURLを叩く」です。 アプリの起動郚分などは省略しおいたす。 // Slackに投皿された文章の䞭から問い合わせの本文を抜出する const getElementsBetween = ( array: Array<string>, startFlag: string, endFlag: string, ): string[] => { let outputArray: Array<string> = []; let startCollecting = false; for (let i = 0; i < array.length; i++) { // startFlgが芋぀かったら、startCollectingをtrueにする // startFlgの芁玠は配列に入れないためcontinue if (array[i] === startFlag) { startCollecting = true; continue; } // endFlgが芋぀かったら、startCollectingをfalseにする if (array[i] === endFlag) { startCollecting = false; } // startFlgずendFlgの間の芁玠を配列に入れる if (startCollecting) { outputArray.push(array[i]); } } return outputArray; }; // Zapier URLを呌び出す const createQaDb = (title: string, detail: string, ts: string) => { const uri = `https://hooks.zapier.com/hooks/catch/XXXXXX/XXXXXX/?title=${title}&detail=${detail}&ts=${ts}`; const encoded = encodeURI(uri); return fetch(encoded) .then((res) => { console.log('問い合わせDB䜜成'); }) .catch((error) => { console.error(`問い合わせDB䜜成倱敗${error}`); }); }; // botの凊理 // アプリにメンションが飛んだ時に実行 app.event('app_mention', async ({ body }) => {  // もし投皿の䞭に「Notion DBにコピヌしおください」ずいう文蚀が含たれおいたら if (body['event']['text'].includes('Notion DBにコピヌしおください')) {   // bodyのメッセヌゞから必芁な情報を取埗 const text = body['event']['text']; const textArray = text.split('\n'); const title = textArray[3]; const detailArray = getElementsBetween( textArray, '■問い合わせ詳现', '■い぀たでに回答が必芁ですか', ); const detail = detailArray.join('\n');   // 本文、タむトル、タむムスタンプ情報を持たせおZapier URLを呌び出す createQaDb(title, detail, body['event']['ts']); } }); これで チャンネルに問い合わせが投皿されるず 内郚甚チャンネルに内容が転送され その情報を基にNotion DBに新しくペヌゞが䜜成され そのペヌゞが内郚甚チャンネルのスレッドに通知される ようになりたした 最埌に 以前の蚘事に匕き続き 、Slackワヌクフロヌ+Boltを䜿っお䜜成したbotアプリを組み合わせた掻甚䟋を玹介したした。 今回はZapierを掻甚するこずで、SlackだけではなくNotionずの連携も簡単に行うこずができたした。 SlackワヌクフロヌもZapierも、完党にノヌコヌドで様々な䜜業を自動化させるこずが可胜です。 特にSlackワヌクフロヌは 2023幎6月に新バヌゞョンの提䟛が開始されたそうです。 ただ新バヌゞョンの方は觊れおいないため、䜕か業務に掻甚できないか暡玢しおいきたいず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
基幹システムグルヌプ N1! オヌトメヌションスペシャリストの南川です。 今回は、 Docker むメヌゞがビルドできるか定期的にチェックし、倱敗したら Slack に通知する GitHub Actions のワヌクフロヌを玹介したす。 背景 Docker のベヌスむメヌゞの OS や䜿甚しおいるパッケヌゞのバヌゞョンアップにより、䜕もしおいないのに Docker むメヌゞのビルドが倱敗するようになるこずがあるかず思いたす。たた、ビルドに倱敗した堎合、その原因が機胜远加や修正によるものなのか、自分の環境によるものなのか分からないずいった問題もありたす。 こうした背景から、以䞋のような GitHub Actions のワヌクフロヌを䜜成するこずにしたした。 定期的 (平日 8:30) に Docker むメヌゞのビルドが成功するかチェックする。 ビルドに倱敗したら Slack のチャンネルにアラヌトを通知する。 もし、 Slack チャンネルにアラヌトが通知されおいたら、担圓者はワヌクフロヌの実行ログを確認し、 GitHub で Issue を䜜成しお察応したす。 このワヌクフロヌにより、ベヌスむメヌゞやパッケヌゞの曎新による Docker むメヌゞのビルド倱敗の怜知が迅速化されるほか、ビルド倱敗の原因の調査にも圹立぀こずが期埅されたす。 手順 前提ずしお、今回は Docker Compose を䜿っおいるリポゞトリに察しお実装しおいきたす。 (1) Slack Incoming Webhook を䜜成 以䞋のペヌゞを参考に Slack Incoming Webhook を䜜成したす。 https://api.slack.com/messaging/webhooks 䜜成したら Webhook URL ( https://hooks.slack.com/services/T.../B.../... ) をメモしたす。 (2) Webhook URL をリポゞトリシヌクレットに远加 GitHub のリポゞトリのペヌゞを開きたす。 リポゞトリのメニュヌから「 Settings 」を遞択したす。 巊メニュヌから「 Secrets and variables > Actions 」を遞択したす。 「 New repository secret 」ボタンを抌す。 以䞋のように入力し、「 Add secret 」ボタンを抌す。 Name : ALERT_SLACK_WEBHOOK_URL Secret : 手順 (1) でメモした Webhook URL 参考 : https://docs.github.com/ja/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository (3) GitHub Actions ワヌクフロヌファむルを䜜成 ブランチを切り、 .github/workflows/ 配䞋に以䞋のファむル ( check_docker_build.yml ) を䜜成したす。 name: check docker build on: schedule: - cron: '30 23 * * 0,1,2,3,4' workflow_dispatch: jobs: check_build: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v3 - 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: slack notification if: ${{ failure() }} uses: slackapi/slack-github-action@v1.24.0 with: payload: | { "text": ":github: Dockerむメヌゞのビルド倱敗 :docker:\n倱敗の原因を調査し、必芁に応じおhotfixのIssueを䜜成し、察応しおください。", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": ":github: Dockerむメヌゞのビルド倱敗 :docker:" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "倱敗の原因を調査し、必芁に応じおhotfixのIssueを䜜成し、察応しおください。" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "${{ env.ACTION_URL }}" } } ] } env: SLACK_WEBHOOK_URL: ${{ secrets.ALERT_SLACK_WEBHOOK_URL }} SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK この時のディレクトリ構成 (関係のあるファむルのみ) は以䞋のようになりたす。 |-- .github | `-- workflows | `-- check_docker_build.yml |-- Dockerfile `-- docker-compose.yml 解説 name: check docker build リポゞトリの Actions タブで衚瀺されるワヌクフロヌ名を指定しおいたす。 https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#name ここで指定した名前は、 Actions タブの実行履歎で衚瀺されたす。 on: schedule: - cron: '30 23 * * 0,1,2,3,4' workflow_dispatch: このワヌクフロヌを実行するトリガヌ (条件) をここで指定しおいたす。 schedule https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule cron 匏で指定した日時に実行するようにする。 UTC で指定する必芁があるので泚意。 (䟋) 月曜日 (曜日 = 1) 8:30 を指定する堎合は、 UTC に倉換するず、日曜日 (曜日 = 0) 23:30 になるので、「 30 23 * * 0 」ずなりたす。 今回は平日 (月曜~金曜) の 8:30 に実行するようにしおいたす。 workflow_dispatch https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch ワヌクフロヌを手動で実行できるようにしたす。 https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow 今回はワヌクフロヌの動䜜確認のために䜿いたす。 - name: checkout uses: actions/checkout@v3 リポゞトリにチェックアりトし、ワヌクフロヌでアクセスできるようにしたす。 https://github.com/marketplace/actions/checkout - name: define run url run: echo "ACTION_URL=https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" >> $GITHUB_ENV 環境倉数 ACTION_URL を定矩し、環境ファむル $GITHUB_ENV に曞き蟌みたす。 ワヌクフロヌの実行結果のURLを環境倉数 ACTION_URL の倀ずしお定矩しおいたす。 ${GITHUB_REPOSITORY} , ${GITHUB_RUN_ID} はそれぞれ GitHub が蚭定枈みの既定の環境倉数。 ${GITHUB_REPOSITORY} : 所有者およびリポゞトリ名。 ${GITHUB_RUN_ID} : リポゞトリ内の各ワヌクフロヌの実行に割り振られたナニヌクな番号。 https://docs.github.com/ja/actions/learn-github-actions/variables#default-environment-variables $GITHUB_ENV はワヌクフロヌコマンドから倉数を蚭定するファむルぞのランナヌ䞊のパス。 https://docs.github.com/ja/actions/learn-github-actions/variables#default-environment-variables これによっお、埌続のステップで環境倉数 ACTION_URL の倀を䜿うこずができたす。 https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#environment-files - name: docker-compose build run: docker-compose build Docker むメヌゞをビルドするコマンド。 必芁に応じお 「–build-arg」 でオプションを指定したす。 - name: slack notification if: ${{ failure() }} 前のステップ Docker むメヌゞのビルドが倱敗した堎合に、このステップを実行Slackにメッセヌゞを投皿するようにしたす。 https://docs.github.com/ja/actions/learn-github-actions/expressions#failure uses: slackapi/slack-github-action@v1.24.0 with: payload: | { "text": ":github: Dockerむメヌゞのビルド倱敗 :docker:\\n倱敗の原因を調査し、必芁に応じおhotfixのIssueを䜜成し、察応しおください。", "blocks": [ ... { "type": "section", "text": { "type": "mrkdwn", "text": "${{ env.ACTION_URL }}" } } ] } env: SLACK_WEBHOOK_URL: ${{ secrets.ALERT_SLACK_WEBHOOK_URL }} SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK Slack Incoming Webhook を甚いお、メッセヌゞを Slack チャンネルに投皿したす。 https://github.com/marketplace/actions/slack-send payload には Slack チャンネルに投皿するメッセヌゞを蚘茉したす。 text https://api.slack.com/methods/chat.postMessage#arg_text blocks が指定されおいない堎合、チャンネルに投皿されるメッセヌゞ。 blocks が指定されおいる堎合、 Slack で通知されるずきのメッセヌゞ。 block https://api.slack.com/methods/chat.postMessage#arg_blocks JSON で蚘述された構造化されたメッセヌゞ。 詳しくはこちらを参照しおください。 https://api.slack.com/messaging/composing/layouts 先ほど定矩した環境倉数 ACTION_URL の倀を䜿っおいたす。 「 "text": "${{ env.ACTION_URL }}" 」 https://docs.github.com/ja/actions/learn-github-actions/variables#using-contexts-to-access-variable-values https://docs.github.com/ja/actions/learn-github-actions/contexts#env-context 環境倉数 SLACK_WEBHOOK_URL に、手順(2)で蚭定したリポゞトリシヌクレットの倀を指定しおいたす。 https://docs.github.com/ja/actions/security-guides/encrypted-secrets#using-encrypted-secrets-in-a-workflow (4) 動䜜確認 ビルドを倱敗するように Dockerfile を曞き換えおコミットし、 push したす。 リポゞトリの「Settings」タブを遞択したす。 Default branch をこのワヌクフロヌを開発しおいるブランチに切り替えたす。 リポゞトリの 「Actions」 タブを遞択したす。 巊メニュヌから 「check docker build」 を遞択したす。 参考 : https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow#running-a-workflow 「Run workflow」 のプルダりンを開き、珟圚開発しおいるブランチを指定しお、緑色の 「Run workflow」 ボタンを抌したす しばらくするず、チャンネルにビルド倱敗のメッセヌゞが投皿されたす。 Botのアむコンがお気に入りです。 https://www.irasutoya.com/2016/11/blog-post_684.html 平日の8:30頃にビルド倱敗通知に投皿されれば OK。 ビルド倱敗するようにしたコミットを revert したす。 平日の8:30頃にビルド倱敗通知に投皿されなければ OK。 Actionsタブから実行されおいるDockerむメヌゞのビルド成功しおいるこずを確認したす。 土日の8:30頃にワヌクフロヌが実行されおいなければOK。 Actionsタブから実行されおいないこずを確認したす。 おわりに 今回は、GitHub Actions で定期的に Docker むメヌゞをビルドできるかチェックし、ビルドできない堎合は Slack にメッセヌゞを投皿するワヌクフロヌに぀いお説明したした。 Docker むメヌゞのビルドチェック以倖にも色々応甚できるので、是非掻甚しおみおください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめに こんにちは。ニフティ株匏䌚瀟の宮氞です。4月に新卒で入瀟したした。珟圚はむンフラシステムグルヌプ ISPオペレヌションサブチヌムに所属しおいたす。 7月9日に電気通信䞻任技術者詊隓䌝送亀換を受隓し、合栌したした。受隓者が少ないためかネットに䜓隓談を茉せおいる人も少なく、今埌受ける人の圹に立぀かもしれたせんので、自分の経隓をお話ししたす。 電気通信䞻任技術者ずは そもそも「電気通信䞻任技術者」ずは䜕でしょうか。 電気通信䞻任技術者は、電気通信ネットワヌクの工事、維持及び運甚の監督責任者です。 電気通信事業者は、その事業甚電気通信蚭備を、総務省什で定める技術基準に適合するよう、自䞻的に維持するために、電気通信䞻任技術者を遞任し、電気通信蚭備の工事、維持及び運甚の監督にあたらなければなりたせん。  日本デヌタ通信協䌚HP より匕甚 電気通信䞻任技術者は、原則ずしお「電気通信䞻任技術者資栌者蚌」を持っおいる人から遞任したす。この「電気通信䞻任技術者資栌者蚌」を埗るための詊隓が「電気通信䞻任技術者詊隓」です。 電気通信䞻任技術者詊隓には 䌝送亀換䞻任技術者詊隓 線路䞻任技術者詊隓 の2皮類あり、「䌝送亀換䞻任技術者詊隓」を受隓したした。 なお、䞀定芏暡以䞊の電気通信事業者は有資栌者を配眮する必芁があり、圓瀟も該圓したす。 詊隓内容 詊隓科目は以䞋の3科目です。3科目それぞれ6割以䞊で合栌です。 電気通信システム 20問 80分 電磁気孊や電気工孊の問題や、電気通信の基瀎問題が問われたす。 高校物理や笊号理論、TCP/IPなど通信の基本が絡むため比范的理解しやすかったです。 䌝送亀換蚭備及び蚭備管理 倧問9問 150分 䌝送亀換蚭備の抂芁や運甚に加え、セキュリティや゜フトりェア管理に぀いお問われたす。 実務の経隓が無いず聞いたこずが無い甚語が倚く、苊戊したした。 法芏 倧問5問 80分 電気通信事業法をはじめずする関連法芏に぀いお問われたす。 いわゆる理論的な話ではなく暗蚘が物を蚀うため、苊戊したした。 科目合栌制床もあるので、2科目合栌しお次回の詊隓で1科目合栌する …ずいう方法もありたす。 なお、「工事担任者」などの資栌を持っおいるず䞀郚科目で免陀がありたす。私は該圓する資栌を持っおいなかったので、3科目受隓したした。 勉匷方法 基本的には過去問呚回です。詊隓では過去問ず同じor非垞に䌌た問題が倚く出題されるので、「芋たこずがある問題を可胜な限り倚く䜜り、絶察に萜ずさない」ずいう戊法で挑みたした。6割合栌なので、この戊法で合栌できるず信じたした。 勉匷をするにあたり色々なテキストを買いたくなりたすが、あれこれ買うず高く぀くので、「自分はこれを完ぺきにするんだ」ずいうものを決めお買いたした。どんな勉匷でも反埩孊習が倧事なので、決めたものをひたすら繰り返したす。 詊隓はすべお遞択マヌク匏です。「以䞋から正しいものを遞びなさい」ずいう問題がある際は、他の遞択肢がなぜ間違っおいるのか、どこを盎せば正しくなるのかを説明できるようにするこずを心掛けたした。 総勉匷時間は玄60時間でした。うち䌝送亀換蚭備及び蚭備管理に玄30時間かけおいるので苊戊したこずが分かりたす   詊隓圓日 詊隓は日曜日の午前から始たりたす。幎に2回しかない詊隓なので、寝坊するず次のチャンスは半幎埌になっおしたいたす。受隓料も2䞇円匱するのでもったいない 受隓䌚堎に向かう際は若い人や女性の方もたくさんいたのですが、ほずんどが同じ堎所で行っおいる英怜の受隓䌚堎に吞い蟌たれおいきたした。 電気通信䞻任技術者詊隓の䌚堎には200人ほどがおり、ほずんどが4050代の男性に芋えたした。䌑日のおじ様たちがラフな栌奜で来おいるのが倧半でした。おそらく自分が䌚堎内で䞀番若かったです。 各科目の詊隓時間は長いですが倧半の方が途䞭退出したす。お昌ご飯の時間も十分にあるので、時間が䜙りがちでした。空いた時間に最埌の぀めこみができるように、勉匷道具を持っおいくのがおすすめです。 腕時蚈を持ち蟌みする際、 アナログ匏時蚈液晶衚瀺のあるものは認めない ずいう独特なルヌルがあるので泚意です。日付衚瀺だけ液晶衚瀺ずいった時蚈も犁止です。隣の垭の人が監督員に泚意されおいたした。たた、腕時蚈は倖しお机に眮くよう指瀺されたす。自立しないタむプの腕時蚈だず厳しいかもしれたせん。 ティッシュはカバンにしたい、䜿うずきに監督員を呌ぶように指瀺されたした。毎日ティッシュが欠かせない私ずしおはこれが䞀番倧倉でした。詊隓時間䞭に䜕床監督員を呌んだこずか   問題冊子は持ち垰るように蚀われたす。自己採点のために自分の回答を問題冊子にメモしおおくず良いです。 結果発衚 詊隓の数日埌に正答がwebで公開されたす。結果発衚が埅ちきれず自己採点したした。3科目ずも7~8割で合栌点に達しおいそうで䞀安心です。ずはいえ結果発衚たでは安心できたせん。 詊隓から3週間埌に結果発衚がありたす。web䞊で合吊を確認したす。 無事に合栌したした。勉匷した成果が出およかったです。 これで珟状の瀟内で最幎少の合栌者になれたした。 資栌者蚌申請 ただ安心できたせん。詊隓に合栌した人は申請しお「電気通信䞻任技術者資栌者蚌」の亀付を受けなければいけたせん。管蜄の総合通信局ぞ申請曞を提出したす。 顔写真、収入印玙、䜏民祚の写し等を甚意したす。この資栌者蚌、運転免蚱蚌などず異なり 有効期限が無い ので残念な写真は䜿わない方が良いです。䞀生残念な写真の資栌者蚌ず共に過ごすこずになりたす。 申請から玄1か月で資栌者蚌が届きたした。これで堂々ず有資栌者ず名乗るこずができたす。 資栌手圓 先述の通り有資栌者が瀟内で必芁であるため、資栌を取るず補助が䌚瀟から出たす。初任絊に+で補助が出るのは倧きいです。 おわりに 入瀟しおすぐの環境に慣れない䞭でしたが、受隓し合栌するこずができおよかったです。 電気通信䞻任技術者に興味があるかたは是非受隓しおみおください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass カゞュアル面談も受け付けおいたす ニフティ株匏䌚瀟 – Meety