信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    素敵だら! Linux コマンド ~diff~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。緊急事態宣言中に紹介するのは「diff」!■diffdiff はファイル同士の差分を教えてくれるコマンドです。まずは通常の使い方から。例えば、a.txt1 2 3 b.txt1 4 3 のようなファイルがあったとして、diff a.txt b.txt ※変更前、変更後、の順番で指定のように実行すると、2c2 < 2 --- > 4 ※一行目に表示されている英字はそれぞれ a(added)、d(deleted)、c(changed)を示しています※「2c2」は a.txt の二行目から b.txt の二行目に変更があることを示しています ※ `-c` や `-u` オプションを付けると、差分がより見やすい形式で表示されますのように差分箇所を確認することができます。プログラマーで、コード管理を Git や Subversion で行っていれば、ほぼ使う機会もない機能ですが、オプションの組み合わせによって、利用するシーンの幅が広がります。おすすめのオプション組み合わせは `-r` と `-q` と `--exclude` です。diff -rq --exclude=.git src src.back `-r` で複数のファイルを、再帰的に走査し、`-q` で差分のあるファイル名のみを取得し、 `--exclude` で走査不要なディレクトリ・ファイルを指定します。例えば、あまりないとは思いますが、デプロイツールを使わず、cli から直接反映させるようなときに、複数ファイルに渡って反映前後での差分確認に使うことができます。以上、知っておくと、いざという時に便利な diff でした!
  • テクログ

    素敵だら! Linux コマンド ~wget~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。年明け第一回目は「wget」!※つらいので今回から1コマンドずつ紹介することにしました。■wgetwget は何かをダウンロードしたいときに使うコマンド。ページを画像やCSSなども丸ごとダウンロードしたり、簡易的なクローリングもできちゃうパワフルなダウンローダーです。まずは通常の使い方から。wget http://example.com/ とすると、対象のページHTMLが `index.html` としてダウンロードされます。保存名を指定したいときにはwget http://example.com/ -O test.html `-O` オプションを使います。Linux で wget を使用するシーンとしては、.zip や .tar などの圧縮されたソースデータをダウンロードすることが多いのではないでしょうか。データが置いてあるホスティングサーバー上ではアクセスによる負荷を分散させるために、ダウンロードURLをミラーサイトにリダイレクトさせていることがあります。wget --trust-server-names https://sourceforge.net/projects/notepadplusplus.mirror/files/latest/download そんな時は、`--trust-server-names` を使えば正常にダウンロードできます。他にもWEB魚拓のように、あるサイトのページをまるっとダウンロードしたいときは、wget -k -p -w 3 http://abehiroshi.la.coocan.jp/ とすると、他のページや画像なども一緒にまとめてダウンロードしてくれます。`-k`  `--convert-links`ダウンロードしたHTMLやCSSのリンクを、ローカル内の相対パスに変換します。`-p` `--page-requisites`ページの表示に必要なファイルをすべてダウンロードします。`-w` `--wait`再帰的にダウンロードするとき、指定した秒数分間隔をあけて実行します。クローラー、スパイダー、すべてそうですが、再帰的なアクセス・ダウンロードするときには、必ず数秒の間隔をあけるなど、サーバーへの負荷を考慮してください!!!以上、2020年一発目は wget でした!
  • テクログ

    cURLのメモリリーク

    こんにちは、kaiです。最近新作ゲームをプレイ中に自宅PCのメモリ使用率が95%まで上がったことがあって(windows defenderの問題でした)、メモリリークって怖いな…と思う今日この頃ですが、それに関連して今回は担当していた案件で遭遇した問題について紹介します。取得したURLにPHPのcURL関数を用いてアクセスするプログラムを作成したところ、実行中、時間を追うごとにサーバーのメモリ消費量が増大していく現象が発生しました。プログラム側ではスタックし続けるような処理を実装していないので、調査したところ、curlの古いバージョンにはキャッシュを蓄積し続けるバグが存在しておりプログラム実行中にはメモリが解放されずに消費されていくことが分かりました。そこで暫定の対応ではありますが、curl利用部分を個別のプログラムとして切り出し、そこにURLを分割して渡すことでメモリ消費を抑える形に改修しました。追々バージョンアップや別の方法に変えたいところですね…まだ記事作成時点でテスト中ですが、結果や追加対応などはまた報告できればと。外部要因の不具合はなかなか出くわさなかったので個人的には良い経験になったと思います。ではまた。・参考URLhttps://qiita.com/digitalpeak/items/4b39fdcb8fae7d09f406https://blog.eviry.com/entry/2019/07/23/160715_1
  • テクログ

    AWS-CLIコマンドでEC2のメトリクスをいろいろ取りたい

    # aws-cliコマンドさくっと、EC2のインスタンスの情報をcliで取りたいときのコマンドです。##EC2のタグについてるサーバの名前を知りたい時aws ec2 describe-instances | jq -r '.Reservations[] .Instances[] .Tags[]|select(.Key=="Name")|.Value' #ステータスがrunning状態のTagsがKey=Nameのをインスタンスを取得aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq -r '.Reservations[] .Instances[] .Tags[]|select(.Key=="Name")|.Value' #running状態かつ、 TagsがKey=NameのインスタンスIDとインスタンス名を取得aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq -r '.Reservations[].Instances[] | {InstanceId, InstanceName: (.Tags[] | select(.Key=="Name").Value)}' #インスタンス名だけを抽出して、整形して出力aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq -r '.Reservations[].Instances[] | {InstanceId, InstanceName: (.Tags[] | select(.Key=="Name").Value)}' | grep "InstanceName" | awk '{print $2}' | sed -e 's/"//g' -e 's/,//g' > hogeファイル #インスタンスIDだけを抽出して、整形して出力aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq -r '.Reservations[].Instances[] | {InstanceId, InstanceName: (.Tags[] | select(.Key=="Name").Value)}' | grep "InstanceId" | awk '{print $2}' | sed -e 's/"//g' -e 's/,//g' #EC2についてるEIPを取得aws ec2 describe-addresses --query '*[].PublicIp' --output text | tr '\t' '\n' #ローカルPCからAWSへ取得したEIPリストを使ってSSHして、コマンド叩く用のシェル#!/bin/bash aws ec2 describe-addresses --query '*[].PublicIp' --output text | tr '\t' '\n' > elastic_ip.lst export AWS_HOME=${HOME}/.aws export AWS_CONFIG_FILE=${AWS_HOME}/config export ELASTIC_IP=${HOME}/elastic_ip.lst cat ${ELASTIC_IP} | while read line do ssh -n user@$line -p 22 -i /xxxxxx/xxxxxx 'example-command' > result.txt done
  • テクログ

    素敵だら! Linux コマンド ~基本編 その3~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。今回も前回に引き続き「~基本編 その3~」です。■find私の一番好きなコマンド find。その名前からもわかる通り、ファイルやディレクトリなどを探すコマンドです。まずは基本的な使い方から。今いるディレクトリの中から admin ユーザーが作成した、test_{日付}.txt ファイルってどこにあったっけ?を調べるときはfind ./ -user admin -type f -name test*.txt のようにします。`-name` は探す対象の名前を指定するオプションで、ワイルドカードが使用できます。※ `-regex` を使えば正規表現も可能です`-type` は探す対象の種類を指定します。種類は以下の通りです。ファイル `f`ディレクトリ `d`シンボリックリンク `l`これだけでも結構便利なんですが、 `find` コマンドの肝はなんといっても `-exec` オプション。これを使えば検索した結果に対して、コマンドを実行できます。例えば先ほどの test.txt をすべて削除したいときは、find ./ -user admin -type f -name test*.txt -exec rm {} \; といった具合です。この例でいうと、 `{}` に検索結果のファイルが一つずつ置き換わり、 `rm` によって削除されます。末尾についている `\;` は何かというと、セミコロンが `-exec` オプションの終了を意味し、バックスラッシュはエスケープだそうです。   参考: https://stackoverflow.com/questions/20913198/why-are-the-backslash-and-semicolon-required-with-the-find-commands-exec-optio`\;` の代わりに `+` を使用することで、コマンドに渡していた検索結果を、一つずつではなく、まとめた形で渡すことができます。上記の例でいえば、 `\;` はrm test1.txt rm test2.txt rm test3.txt となり、`+` はrm test1.txt test2.txt test3.txt となります。他にも検索するディレクトリの階層の深さを指定する `-mindepth` `-maxdepth`特定のディレクトリ検索対象から除外する `-prune`更新日からファイルを探す `-mtime`など、機能がとても充実しています。以上、細かい要望にも応えてくれる素敵な `find` コマンドでした。
  • テクログ

    AWS CLIを使ってIAMユーザーの登録から二段階認証をオンにするまでのスクリプト

    नमस्ते! आप कैसे(कैसी) हैं?ナマステー!こんにちは。インフラ担当のまつやです。弊社ではWebサービスの基盤としてAWS(Amazon Web Service)を主に使っています。エンジニアはAWSコンソールからログインして作業することが多いため、メンバーが増えるたびにアカウントを発行する必要があります。このアカウント作成はAWSコンソールにログインし、IAM(Identity and Access Management)から作成できますが、発行頻度が増えてくるとGUIからのアカウントの発行・通知がやや大変になってきました。そこで、AWS CLI(コマンドラインインターフェイス)を利用して、ユーザー発行に必要なコマンド操作を一括で行えるシェルスクリプトを作成することにしました。また弊社ではAWSコンソールからのログインにパスワード設定の上、MFAデバイスによる二段階認証を必須としています。この二段階認証も同時に設定してしまい、パスワード情報と二段階認証用のQRコードをユーザーに通知するだけで済むようにしたいと思います。Amazon Linuxのbash環境で作成しています。python(2.7)aws-cli(最新版)oathtoolが必要になります。以下が本体のシェルスクリプトです。#!/bin/bash set -e # 環境変数設定 export BASE_DIR=${HOME}/iam # # usage # usage_exit() {  echo "usage:"  echo "${0} -u USERNAME [-g GROUP] [-a] [-h]" 1>&2  echo "-a: create API key for each user." 1>&2  echo "-h: this help." 1>&2  exit 1 } #パスワード生成コマンド password_command="cat /dev/urandom | tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ+\-!' | fold -w 16 | grep -E '[123456789]' | grep -E '[+\-\!]' | grep -E '^[123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ]' |head -n 1" #引数の設定 while getopts "u:g:h" OPT do    case $OPT in        "u") CREATE_USER="true"; username=${OPTARG}            ;;        "g") ADD_TO_GROUP="true"; group=${OPTARG}            ;;        "h") usage_exit            ;;        \?) usage_exit            ;;    esac done # 引数でユーザーを指定しない場合終了する。 [ "${CREATE_USER}" != "true" ] && usage_exit #IAMユーザーのクレデンシャル情報格納用のディレクトリを作成。  if [ "${CREATE_USER}" = "true" ]; then      if [ ! -e "${BASE_DIR}/account/${username}" ]; then        mkdir -p ${BASE_DIR}/account/${username}      else       echo "Directory ${username} already exists."      fi #IAMユーザー作成   aws iam create-user --user-name ${username} --profile default   aws iam wait user-exists --user-name ${username} #二段階認証の仮想MFAデバイスを作成   aws iam create-virtual-mfa-device --virtual-mfa-device-name ${username} \   --bootstrap-method Base32StringSeed \   --outfile ${BASE_DIR}/account/${username}/${username}_secret.txt #クレデンシャル情報ファイルに出力する内容  secret_key=`cat ${BASE_DIR}/account/${username}/${username}_secret.txt`  signin_url="https://AWSアカウント名.signin.aws.amazon.com/console"  password=$(eval ${password_command}) #ログインパスワードの設定&初回ログイン時のパスワード強制変更をオンにする   aws iam create-login-profile --user-name $username \   --password ${password} --password-reset-required --profile default #クレデンシャル情報をファイルに出力 echo "User name,Password,Secret access key,Console login link ${username},${password},${secret_key},${signin_url}" > ${BASE_DIR}/account/${username}/${username}_password.csv #二段階認証用のQRコードを生成  python /home/ec2-user/iam/qrcodegen.py "otpauth://totp/Amazon%20Web%20Services:${username}@AWSアカウント名?secret=${secret_key}&issuer=Amazon%20Web%20Services" ${BASE_DIR}/account/${username}/${username}_qr.png # Login Profile が完全にできているか確認してから次へ進む  aws iam wait user-exists --user-name ${username} #ワンタイムパスワードを発行する code="oathtool --totp -d 6 --time-step-size=30s --base32 ${secret_key}"        code1=$(eval ${code})        while :         do           code2=$(eval ${code})            if [ $code2 != $code1 ]; then                 break;            fi         done #二段階認証をオンにする  aws iam enable-mfa-device --user-name ${username} \  --serial-number arn:aws:iam::XXXXXXXXXXXX:mfa/${username} \  --authentication-code1 ${code1} --authentication-code2 ${code2} #(注: arn:aws:iam::XXXXXXXXXXXX:mfa の12桁のXXXXXXXXXXXXにはAWSアカウントIDが入ります)  else  usage_exit  fi # 引数で-gを指定した場合 ユーザー ${username} にグループ ${group} を割り当てる  if [ "${ADD_TO_GROUP}" = "true" ]; then     aws iam wait user-exists --user-name ${username}     aws iam add-user-to-group --group-name ${group} \     --user-name ${username} \     --profile default  fi -u username の形式でユーザー名の指定を必須にしています。ここで指定したユーザー名を使って処理が進みます。まず、基本のIAMユーザー作成を行います。aws iam wait user-existsでユーザーが作成されたことを確認して先に進みます。次に二段階認証用の仮想MFAデバイスを作成します。AWSコンソールから作成する場合はIAMユーザーと同じ名前で作成されますが、CLIで作成する場合はデバイス名が重複しない限りはIAMユーザー名と異なっていても別の名前のデバイスを作成し、関連付けをすることができます。ここでは管理が面倒になるので、IAMユーザ名と一致させます。MFAデバイス作成と同時にシークレットキーを発行します。ここではQRコードの形でも発行できますが、シークレットキーと同時に発行することができないため、シークレットキーを発行し、そのシークレットキーを元に別途QRコードを作成します。次にログインパスワードを設定します。初回ログイン時に強制的にパスワード変更させるオプションを有効にします。この時発行するパスワードですが、cat /dev/urandomして tr -dcとかで切り出して、16文字のものを生成しています。小文字のエル、数字の0と大文字小文字のオーは除外しています。パスワードコマンドはこれに限らずpwgenとかが使えるならそれでいいかと思います。次にQRコードの生成です。pythonのqrcodeライブラリを使います。pipでインストールします。pip install qrcode インストールしたら、中間プログラムを作成します。ここではqrcodegen.pyとしています。qrcodegen.pyimport qrcode import sys import os args = sys.argv qr = qrcode.QRCode(  version=4,  error_correction=qrcode.constants.ERROR_CORRECT_M,  box_size=6,  border=4, ) qr.data = args[1] qr.save_path = args[2] qr.add_data(qr.data, 20) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img.save(qr.save_path) これを使ってQRコードを生成します。MFAデバイスを作成したときの ${username}_secret.txt を${secret_key}に指定します。${username}@AWSアカウントの箇所はご自身の環境に合わせて読み替えて下さい。これでIAMユーザー毎のクレデンシャル情報格納ディレクトリにQRコードが生成されます。二段階認証を有効にします。oathtoolを使用してワンタイムパスワードを発行します。これを都合2回入力することで二段階認証が有効になります。Amazon Linuxでは基本のリポジトリには存在しないので、epelリポジトリからインストールします。epelリポジトリを有効にする方法はここでは割愛します。発行したシークレットキーを元に6桁のワンタイムパスワードを発行します。whileでこのパスワード発行コマンドを実行し、初めにに発行した値と異なる値になるまで回します。ここでcode1とcode2を取得します。code1とcode2を使って二段階認証をオンにします。最後に-gでグループを引数に指定した場合の処理です。指定したグループをユーザーに割当てます。指定しなければスルーします。以上のようにして、事前に二段階認証をオンにした状態でIAMユーザー情報を各エンジニアに展開しています。エンジニアは発行されたパスワードとQRコード、あるいはシークレットキーを元にAWSコンソールにログインできます。この他に、二段階認証がオフになっているユーザーがいないかを監視するLambdaのスクリプトも作成していますが、それについてはまたの機会に。・参考にした記事 https://dev.classmethod.jp/etc/aws-cli-iamuser-bulk-create/ https://dev.classmethod.jp/cloud/aws/virtual-mfa-by-aws-cli/それではまた!फिर मिलेंगे!