20200811のAWSに関する記事は20件です。

[AWS] SAM + Lambda(Python)で、PythonライブラリをLayerに追加して利用してみる

SAMのインストール

[AWS] Serverless Application Model (SAM) でAPI Gateway + Lambda + DynamoDBなサンプルを作成してみる」を参照ください。

なお、今回のサンプルに限っていうと、DynamoDBをローカルに持つ必要はないので、Dockerのインストールは不要です。

プロジェクトの作成

では、例によって、HelloWorldベースのプロジェクトを作成していきましょう。

$ sam init --runtime=python3.8
Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
Choice: 1

Project name [sam-app]:

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
    1 - Hello World Example
    2 - EventBridge Hello World
    3 - EventBridge App from scratch (100+ Event Schemas)
    4 - Step Functions Sample App (Stock Trader)
    5 - Elastic File System Sample App
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sam-app/README.md

Layerを定義する

まず、Layer用のディレクトリを作成します。
ディレクトリは、プロジェクト直下で、ディレクトリ名は後ほど定義に記述するので、自由につけて大丈夫です。
とりあえず「hello_world_layer」とでもしておきます。

$ mkdir hello_world_layer

続いて、template.yamlのResources配下に、Layerの定義を追記します。
今回は「HelloWorldLayer」という名称で作成しておきます。

template.yml変更前
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
template.yml変更後
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
      Layers:
        - !Ref HelloWorldLayer
  HelloWorldLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      Description: Layer description
      ContentUri: hello_world_layer/
      CompatibleRuntimes:
        - python3.8
    Metadata:
      BuildMethod: python3.8

NumPyを追加してみる

次に、ライブラリを追加します。
利用したいライブラリを記述してください。
今回のサンプルでは、機械学習でよく使用する数値計算モジュールのNumPyを追加してみたいと思います。

hello_world_layerに、requirements.txtを作成し、以下のように記述して、ライブラリを追加します。

$ touch hello_world_layer/requirements.txt
hello_world_layer/requirements.txt
numpy

Layerクラスを作成する

hello_world_layer配下に、numpyの処理をするユーザクラスを作成してみましょう。
名前は適当にuser_numpyとでもしておきましょうか。

$ touch hello_world_layer/user_numpy.py
hello_world_layer/user_numpy.py
import numpy as np

class UserNumpy():
    def __init__(self):
        super().__init__()

    def array(self):
        return np.array([0,1,2])

Layerクラスのメソッドを呼び出す

最後に、Functionの方で、追加したLayerメソッドを呼び出してみましょう。
既存のhello_world/app.pyを以下のように変更してみましょう。

helloi_world/app.py
import json
from user_numpy import UserNumpy

def lambda_handler(event, context):
    un = UserNumpy()

    un_str = [str(n) for n in un.array()]
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": ','.join(un_str)
        }),
    }

UserNumpyのarrayメソッドは、Numpyのarray([0,1,2])の結果を返します。
これは数値の配列なので、一度文字列の配列に変換したあとで、文字列かしてJsonデータとして返すようにしています。

ビルド

では、ビルドしてみましょう。

$ sam build
Building function 'HelloWorldFunction'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Building layer 'HelloWorldLayer'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

デプロイ

次にデプロイです。
事前に、AWSのクレデンシャルを設定しておいてください。

$ sam deploy --guided

Configuring SAM deploy
======================

    Looking for samconfig.toml :  Found
    Reading default arguments  :  Success

    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [sam-app]:
    AWS Region [us-east-1]: ap-northeast-1
    #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    Confirm changes before deploy [Y/n]: y
    #SAM needs permission to be able to create roles to connect to the resources in your template
    Allow SAM CLI IAM role creation [Y/n]: y
    HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
    Save arguments to samconfig.toml [Y/n]: y

    Looking for resources needed for deployment: Not found.
    Creating the required resources...
    Successfully created!

        Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-fqjmg5s30i1w
        A different default S3 bucket can be set in samconfig.toml

    Deploying with following values
    ===============================
    Stack name                 : sam-app
    Region                     : ap-northeast-1
    Confirm changeset          : True
    Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-fqjmg5s30i1w
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

Initiating deployment
=====================

    Saved arguments to config file
    Running 'sam deploy' for future deployments will use the parameters saved above.
    The above parameters can be changed by modifying samconfig.toml
    Learn more about samconfig.toml syntax at
    https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
Uploading to sam-app/ec3e7cb3e8873a2b56d81ae66ba15ec5  262144 / 538577.0  (48.67Uploading to sam-app/ec3e7cb3e8873a2b56d81ae66ba15ec5  524288 / 538577.0  (97.35Uploading to sam-app/ec3e7cb3e8873a2b56d81ae66ba15ec5  538577 / 538577.0  (100.00%)
Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  262144 / 14534393.0  (1.8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  524288 / 14534393.0  (3.6Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  786432 / 14534393.0  (5.4Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  1048576 / 14534393.0  (7.Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  1310720 / 14534393.0  (9.Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  1572864 / 14534393.0  (10Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  1835008 / 14534393.0  (12Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  2097152 / 14534393.0  (14Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  2359296 / 14534393.0  (16Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  2621440 / 14534393.0  (18Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  2883584 / 14534393.0  (19Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  3145728 / 14534393.0  (21Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  3407872 / 14534393.0  (23Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  3670016 / 14534393.0  (25Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  3932160 / 14534393.0  (27Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  4194304 / 14534393.0  (28Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  4456448 / 14534393.0  (30Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  4718592 / 14534393.0  (32Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  4980736 / 14534393.0  (34Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  5242880 / 14534393.0  (36Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  5505024 / 14534393.0  (37Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  5767168 / 14534393.0  (39Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  6029312 / 14534393.0  (41Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  6145785 / 14534393.0  (42Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  6407929 / 14534393.0  (44Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  6670073 / 14534393.0  (45Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  6932217 / 14534393.0  (47Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  7194361 / 14534393.0  (49Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  7456505 / 14534393.0  (51Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  7718649 / 14534393.0  (53Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  7980793 / 14534393.0  (54Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  8242937 / 14534393.0  (56Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  8505081 / 14534393.0  (58Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  8767225 / 14534393.0  (60Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  9029369 / 14534393.0  (62Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  9291513 / 14534393.0  (63Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  9553657 / 14534393.0  (65Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  9815801 / 14534393.0  (67Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  10077945 / 14534393.0  (6Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  10340089 / 14534393.0  (7Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  10602233 / 14534393.0  (7Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  10864377 / 14534393.0  (7Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  11126521 / 14534393.0  (7Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  11388665 / 14534393.0  (7Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  11650809 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  11912953 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  12175097 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  12437241 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  12699385 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  12961529 / 14534393.0  (8Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  13223673 / 14534393.0  (9Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  13485817 / 14534393.0  (9Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  13747961 / 14534393.0  (9Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  14010105 / 14534393.0  (9Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  14272249 / 14534393.0  (9Uploading to sam-app/04efcd43f42b7344dff7e02a5e9d321c  14534393 / 14534393.0  (100.00%)

    Deploying with following values
    ===============================
    Stack name                 : sam-app
    Region                     : ap-northeast-1
    Confirm changeset          : True
    Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-fqjmg5s30i1w
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.
Uploading to sam-app/5c2143d527c3bab330c5c2145019dcb1.template  1455 / 1455.0  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
------------------------------------------------------------------------------------------------
Operation                        LogicalResourceId                ResourceType
------------------------------------------------------------------------------------------------
+ Add                            HelloWorldFunctionHelloWorldPe   AWS::Lambda::Permission
                                 rmissionProd
+ Add                            HelloWorldFunctionRole           AWS::IAM::Role
+ Add                            HelloWorldFunction               AWS::Lambda::Function
+ Add                            HelloWorldLayer8a10103d68        AWS::Lambda::LayerVersion
+ Add                            ServerlessRestApiDeployment47f   AWS::ApiGateway::Deployment
                                 c2d5f9d
+ Add                            ServerlessRestApiProdStage       AWS::ApiGateway::Stage
+ Add                            ServerlessRestApi                AWS::ApiGateway::RestApi
------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:767054379442:changeSet/samcli-deploy1597147509/8e325896-aa90-4379-afa2-44147e907291


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2020-08-11 21:05:21 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------
ResourceStatus           ResourceType             LogicalResourceId        ResourceStatusReason
-------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS       AWS::Lambda::LayerVers   HelloWorldLayer8a10103   -
                         ion                      d68
CREATE_IN_PROGRESS       AWS::IAM::Role           HelloWorldFunctionRole   Resource creation
                                                                           Initiated
CREATE_IN_PROGRESS       AWS::IAM::Role           HelloWorldFunctionRole   -
CREATE_IN_PROGRESS       AWS::Lambda::LayerVers   HelloWorldLayer8a10103   Resource creation
                         ion                      d68                      Initiated
CREATE_COMPLETE          AWS::Lambda::LayerVers   HelloWorldLayer8a10103   -
                         ion                      d68
CREATE_COMPLETE          AWS::IAM::Role           HelloWorldFunctionRole   -
CREATE_IN_PROGRESS       AWS::Lambda::Function    HelloWorldFunction       -
CREATE_IN_PROGRESS       AWS::Lambda::Function    HelloWorldFunction       Resource creation
                                                                           Initiated
CREATE_COMPLETE          AWS::Lambda::Function    HelloWorldFunction       -
CREATE_IN_PROGRESS       AWS::ApiGateway::RestA   ServerlessRestApi        -
                         pi
CREATE_IN_PROGRESS       AWS::ApiGateway::RestA   ServerlessRestApi        Resource creation
                         pi                                                Initiated
CREATE_COMPLETE          AWS::ApiGateway::RestA   ServerlessRestApi        -
                         pi
CREATE_IN_PROGRESS       AWS::ApiGateway::Deplo   ServerlessRestApiDeplo   -
                         yment                    yment47fc2d5f9d
CREATE_IN_PROGRESS       AWS::Lambda::Permissio   HelloWorldFunctionHell   Resource creation
                         n                        oWorldPermissionProd     Initiated
CREATE_IN_PROGRESS       AWS::Lambda::Permissio   HelloWorldFunctionHell   -
                         n                        oWorldPermissionProd
CREATE_COMPLETE          AWS::ApiGateway::Deplo   ServerlessRestApiDeplo   -
                         yment                    yment47fc2d5f9d
CREATE_IN_PROGRESS       AWS::ApiGateway::Deplo   ServerlessRestApiDeplo   Resource creation
                         yment                    yment47fc2d5f9d          Initiated
CREATE_IN_PROGRESS       AWS::ApiGateway::Stage   ServerlessRestApiProdS   -
                                                  tage
CREATE_IN_PROGRESS       AWS::ApiGateway::Stage   ServerlessRestApiProdS   Resource creation
                                                  tage                     Initiated
CREATE_COMPLETE          AWS::ApiGateway::Stage   ServerlessRestApiProdS   -
                                                  tage
CREATE_COMPLETE          AWS::Lambda::Permissio   HelloWorldFunctionHell   -
                         n                        oWorldPermissionProd
CREATE_COMPLETE          AWS::CloudFormation::S   sam-app                  -
                         tack
-------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
-------------------------------------------------------------------------------------------------
Outputs
-------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole
Description         Implicit IAM Role created for Hello World function
Value               arn:aws:iam::767054379442:role/sam-app-HelloWorldFunctionRole-9AHTS9BZMUQL

Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://co2snvo0lk.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

Key                 HelloWorldFunction
Description         Hello World Lambda Function ARN
Value               arn:aws:lambda:ap-northeast-1:767054379442:function:sam-app-
HelloWorldFunction-1GVL3Y25TQYGZ
-------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in ap-northeast-1

実行

最後に、Deploy時に出力されるAPI Gatewayのエンドポイントにアクセスしてみます。

$ curl https://co2snvo0lk.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
{"message": "0,1,2"}

レスポンスに、array([0,1,2])の結果が文字列として返されていることが確認できましたね!!

まとめ

Layerにライブラリを追加し、それを呼び出す共通モジュールを作ることは、簡単であることがわかったと思います。
サーバーレスの場合、なるべく疎結合に設計するのが望ましいですが、同一ドメイン内での共通ロジックをLayerに配置すること自体は間違いではないと思います。

ただし、Lambdaの制約として

  • デプロイパッケージサイズ
    • 圧縮済みで50MB
    • 解凍後さで250MB

という制約がありますので、これを考慮しながら、必要なライブラリのみを取り込むようにしましょう。

サンプルコードリポジトリ

https://github.com/hito-psv/sam-demo-002

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

独学未経験エンジニアがweb系自社開発企業でアルバイトを2ヶ月してみて感じたこと

簡単な自己紹介

  • 大学では機械工学を専攻 
  • プログラマに魅力を感じ2019年新卒でメーカー子会社のIT会社に入社
  • 入社してから10ヶ月で会社を退職
  • そこから4ヶ月間独学で勉強し、現在web系の自社開発企業でアルバイト中

ニートになって独学していた時代

新卒で入社したときに感じたことや退職理由はまた今度別の記事で書いてみたいと思います。

勉強したこと一覧

  • progate(HTML,CSS,Javascript,Ruby,RubyonRails)

  • railsチュートリアル解説動画
    2周はした。1周目は動画を見るだけで、2周目は手を動かしながらでした。
    かなりお世話になり、railsチュートリアルとは友達になった気がする

  • Ruby on Rails5 超入門
    amazonリンク
    読んだのは3割ぐらいだけ

  • Ruby on Rails5 速習実践ガイド
    amazonリンク
    辞書的な感じで使ったりした。暇なときに読んでみてもためになることが多い。

  • Gitが、おもしろいほどわかる基本の使い方33
    amazonリンク
    gitの操作の基礎を学んだ。すぐに読み終わる内容なので、読みやすい

  • キタミ式イラストIT塾 基本情報技術者
    amazonリンク
    コンピュターの基礎を理解するのにはちょーど良かった。時間をかけてちょっとずつ読んだ

  • webを支える技術
    amazonリンク
    何を書いているのか全然分からなかった。kindle版で技術書は読みにくい。

  • 図解即戦力 AWSのしくみと技術がしっかりわかる教科書
    amazonリンク
    AWSのサービスの概要は大体理解したけど、実装まではできず

  • プログラミングスクール受講(ポテパンキャンプ)
    ポテパンのリンク
    gitの操作、N+1問題、Rspecの書き方はここで自主的に学んだ

  • Everyday Rails - RSpecによるRailsテスト入門 購入リンク
    ちょくちょく参考にできた。これも詰まったときに検索する用。

ポートフォリオ作成

当時はAWS,Docker, CI/CD, Kubernetes等についてはほぼほぼ理解できずに、断念していました。
開発環境なんかはrailsチュートリアルで使っていたcloud9を使っていました。
まずはHerokuに自分が一生懸命作成したアプリケーションをデプロイし、公開できるようにしました。
一応独自ドメイン,SSL化程度は行っておき、Herokuは有料プランを使用し、少しでも応答速度が早くなるようにしておきました。
一応当時のポートフォリオのソースコードのリンクを貼っておきます。
https://github.com/ak2-lucky/clothes-app
ファッションが好きだった僕は洋服のレビューサイトを作りました。

この記事を見ている駆け出しエンジニアの日々勉強されている方々はこう思っているかもしれません。
AWSにデプロイすらできないのに、webエンジニアになれるの?
Dockerで開発環境も構築できないの?
自動テストぐらいはやっといたら?

現役のwebエンジニアも同じことを思うでしょう。
ポートフォリオも作りきれないような奴はエンジニアになる資格なんかないよって。
なぜならポートフォリオだけは運にも左右されない自分の努力だけで100パーセント作りきれる成果物だからです。

確かにそうです。
僕の努力不足です。何の異論もありません。
認めます。

そして就職活動をはじめます。

就職活動時代

結果からゆうとほぼ全落ち。
面接までいったのは1.2回でした。
面談してくれた会社で研究開発で人材を募集しているからそこに来ないか?と言ってくれた企業もありました。(結局いかず)
コロナの影響とかいう言い訳はしません。
全て自分の実力不足。
アルバイトも採用している企業に応募し,1社だけ何とかアルバイトとして採用していただきました。

今回で自分の市場価値を知りました。
大学は何も考えずに過ごし、新卒で入社した会社を何の成果も残さず10ヶ月で退職。
世間はそんな奴のことを評価はしてくれません。
もちろん当然の評価です。

アルバイトとしてweb系自社開発企業で働く(今)

技術スタック:AWS,Docker,Laravel+vue.js

働いてみるまでLaravelはおろかPHPも触ったことありませんでした。vue.jsもですが。
詳細は省きますが、実際に働いてみて感じるのは、プログラムを書く以外のことです。
技術のキャッチアップ云々の話ではなくて、組織作り、開発の体制やフローなどの重要さについてです。
自分はプログラミングが苦ではありません。
しかし、プログラミング業務以外の部分でストップすることが多い場合があります。(例えば、なぜこの変更を加えられたのかというコメントがないandコードを見ても分からない)
連携がうまく取れなくて、個々の意思で変更が加えられたりするので、デザインがバラバラ。
issue作成者等に確認もしないで変更を進められていたり。
CI/CDもそのうちの一つですが、issueを作成するのは誰なのか、誰の判断を最終的に仰ぐのか、UIのデザインは好きに決めていいのか、プルリクではどこを見ればいいのか、など他にもいろいろありますが。。。

会社によって開発の進め方などは違うと思うので、一概にあれが悪い、これが悪いというわけではありませんが、開発体制や組織作りはサービス開発にかなり大きく影響するように感じました。

開発言語や技術以前にこういった根本的な開発の導線を確保する重要性を学びました。

最後に

ここまで読んでいただいた方には、いろいろ思うことがあると思います。
2ヶ月しか働いていない、しかもアルバイト如きが何を偉そうなこと言ってるんだ!
とか思ってる方いるかもしれません。

ですが、これは個人の一意見であります。
ただ同じように駆け出しエンジニアの方の参考になればいいなと思って書きました。

webエンジニアへの道は高く険しいように感じます。
しかし、自分にとって登りたい山がどれだけ高かろうが、険しかろうが、関係ありません。
ただ登るだけ
毎日頑張って積み上げて、疲れたら一緒にサボりましょう。

長くなりましたが、初投稿は以上になります。

ここまで読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsをAWS ECS(Fargate)でホストする環境構築のすべて【1. 前談、N/W+α】

本記事シリーズの構成(予定)

  1. 前談、N/W+α(これ)
  2. Docker定義、ECRの設定
  3. ECSの設定、デプロイ
  4. SSMの設定

構築環境全体像

こんな感じを目指します。
スクリーンショット 2020-08-11 17.39.58.png

実現したいポイント
* Docker環境で開発を行っているRailsプロジェクトを、Fargate起動のECSでホストします。
* ECSタスクは複数設け、負荷分散します。
* AWS System Manager セッションマネージャを使用してECSに「接続し、CUIで操作可能にします。

ネットワーク+ALB+RDSの環境構築

VPC

サンプルなのでシンプルに作ります。
スクリーンショット 2020-08-11 18.03.43.png

作成した後、VPC一覧右上のアクション>DNSホスト名の編集から有効化をしておきます。
スクリーンショット 2020-08-11 18.18.48.png

サブネット

下記の通り、わかりやすくサブネットを切っておきます。

subnet CIDR
public-subnet-a 10.0.10.0/24
public-subnet-c 10.0.20.0/24
public-subnet-d 10.0.30.0/24

スクリーンショット 2020-08-11 18.04.13.png

インターネットゲートウェイ

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3433303630332f62343233356531372d633765372d353266352d616636622d3963356164396331336638622e706e67.png

作成したら、右上のアクション>VPCにアタッチから、
sample-vpcにアタッチするのを忘れずに。

スクリーンショット 2020-08-11 18.07.34.png

エンドポイント

この後設定していくサービスを利用するために、4つのエンドポイントを設けます。

  • com.amazonaws.ap-northeast-1.ecr.api
  • com.amazonaws.ap-northeast-1.ecr.dkr
  • com.amazonaws.ap-northeast-1.s3
  • com.amazonaws.ap-northeast-1.ssm

エンドポイントを選択して、
アタッチしたいサブネットはpublic-subnet-a,public-subnet-cの2つのみ指定。
スクリーンショット 2020-08-11 18.08.57.png

Interfaceタイプのエンドポイントには、セキュリティグループを適用する。
スクリーンショット 2020-08-11 18.18.06.png

エンドポイント用のセキュリティグループとして、443ポートを開けたセキュリティグループを作っておきましょう。
スクリーンショット 2020-08-11 18.17.09.png

S3はGatewayタイプなのでセキュリティグループではなく、ルートテーブルに従います。
スクリーンショット 2020-08-11 18.20.17.png

ルートテーブル

VPC作成時に自動作成されているものを編集します。

ルート一覧に、先ほど追加したエンドポイントの設定が加わっています。
ルートの編集ボタンを押下します。
スクリーンショット 2020-08-11 19.37.07.png

ここにインターネットゲートウェイへのルーティングを加えます。
スクリーンショット 2020-08-11 19.37.37.png

編集したルートテーブルにサブネットを関連づけます。
インターネットゲートウェイのルーティングを設定したルートテーブルに、サブネットを関連づけることで、
いわゆるpublic subnetになります。
スクリーンショット 2020-08-11 18.06.37.png

public-subnet-a,cはSSMを利用した接続時にパブリックでないとうまくできなかったため、セキュリティグループでIP、ポート制限をかけつつパブリック化する判断にしました。

public-subnet-dはデータベース用に取っていますが、データベースに外部からクライアント接続したいのでパブリックにしています。ここをパブリックにするかどうかは任意です。


ALB

アプリケーションロードバランサーを選択して作成していきます。
スクリーンショット 2020-08-11 18.12.59.png

実用するときには、SSL証明書を適用して443ポート開けることになると思いますが、
今回は検証なので、80ポート開けておきます。
スクリーンショット 2020-08-11 18.13.22.png

ルーティング先はECSをおくサブネットに絞って設定しています。
スクリーンショット 2020-08-11 18.13.27.png

セキュリティグループはここでついでに新規作成しています。
80ポートのインバウンドを設定しています。検証なのでマイIPのみにしたほうがよかったかも。
スクリーンショット 2020-08-11 18.14.02.png

ターゲットグループをここで一緒に新規作成します。
ターゲットの種類はIPにします。
ヘルスチェックはアプリケーションに用意したヘルスチェック用のパスを指定してください。
スクリーンショット 2020-08-11 18.14.34.png

ここはそのままでOK。
スクリーンショット 2020-08-11 18.14.54.png


RDS

作成内容は完全に任意です。
MySQL 8.0.19でインスタンスをパブリックアクセスありで作成しました。
スクリーンショット 2020-08-11 19.58.23.png

このときに適用したセキュリティグループは以下の通りです。
3306ポートをマイIPからのみアクセス可能にしています。
スクリーンショット 2020-08-11 20.01.22.png

まとめ

ここまででこんな感じの大枠まで作りました。
次の記事で、Dockerの定義と、コンテナイメージをECRにプッシュするまでを記載したいと思います。
スクリーンショット 2020-08-11 20.10.14.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker buildするとextconf failedout of memoryエラーが発生した話

使用技術

  • amazon linux2
  • Docker 19.03.6

エラーが発生した状況

イメージをbuildしようとしてdocker buildコマンドを実行すると下記エラー

docker extconf failedout of memory

その下に赤字でnokogiriがインストール出来ないと書いてあり指定されたコマンドを走らせ再度buildしてもエラーが直らず...。
(目立つ方ばかり気にしていて上記エラーに気づくのが遅れてしまった)

上記エラー文で検索するとAWSの無料枠内のEC2インスタンスタイプ、t2.microでは容量が足りないため課金しなくてはいけないとの記事を見つけ驚き。しかも月2000円ですと...。
課金しなくて済む方法が知りたい!

調べて判明した原因

dockerのvolumeが膨れ上がっていました。

以前もEC2のメモリが足りなくなり増設したのにまた!?と思いつつディスクの空き容量を調査

$ df -h
devtmpfs         474M     0  474M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  436K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1        32G   13G   20G   40% /
tmpfs             99M     0   99M    0% /run/user/1001

大丈夫そう。

お次はディスクの使用量を調査

$ du -hs /*
.
.
.
4.4G    /usr
6.9G    /var  

6.9Gも使っていました。
ここがdockerコンテナの居場所なので原因はdockerですね。
ここまで分かると使えるキーワードも増えて検索がしやすいです(嬉しい)

ついにvolumeを減量していきましょう

$ docker system prune -a --volumes

docker systemは後ろにオプションをつけて、未使用のコンテナ、イメージ、ネットワーク、ボリュームを削除するコマンドです。

--volumes オプションはdocker17.06.1から追加されたようですのでそれ以前のバージョンでは使用できません。

これで再度使用量を調べると

$ du -hs /*
.
.
.
4.4G    /usr
2.9G    /var

減りました。よし。

参考

https://qiita.com/shione/items/dfa956a47b6632d8b3b3

https://qiita.com/381704/items/5d526e34da95fd307480

https://docs.docker.com/engine/reference/commandline/system_prune/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Zabbixでコロナ禍おける在宅勤務環境のネットワークの遅延を計測し続ける

はじめに

瀧澤です。2020年前半からのコロナ禍において、自宅で仕事をするにあたり、リモート会議やVDI(Virtual Desktop Infrastructure)などで会社のネットワークに接続したり、その他のサービスに接続したりすることも多いかと思います。昨今、ブロードバンド回線においては、帯域幅が問題になることはあまりないですが、ネットワークの遅延やその遅延の揺らぎは、リアルタイムな双方向通信を行うリモート会議システムやVDIにおいては影響するかもしれません。

この記事では、その遅延を日常的に計測する仕組みをZabbixで作ってみたいと思います。Pingを使って計測します。なので、正確には、往復のレスポンスタイム(Round Trip Time;RTT)になります。アウトプットは、下記のようなイメージです。
zabbix2020-08-11 183407_LI.jpg
余談ですが、Pingを開発したのは、故MIKE MUUSS氏です。彼のpingに関するブログはこちらにあるそうです。
https://ftp.arl.army.mil/~mike/ping.html

方法

Zabbixがインストール済みであるとしています。Zabbixの導入等は、公式のドキュメント等を参照ください。
https://www.zabbix.com/jp/download

ここでは、pingによる遅延(Round Trip Time;RTT)の計測方法とグラフ化について記載します。

環境の説明

私の自宅環境には常時起動しているサーバ関連はほとんどありません。VPN接続したAWSのVPCにAmazon EC2上に構築されたZabbix Server(Zabbix 5.0)があります。Zabbix Serverでは、Zabbix Agentも動いています。そして、VPCのPrivate SubnetはデフォルトルートがHomeのネットワークになっており、インターネットへもHomeのRouterでNATされてアクセスします。
下記の構成なのですが、このまま、Zabbix Serverからpingを打つと、VPNで接続したインターネット回線の遅延やVPNルータの暗号化等の処理時間までも含んでしまうことになります。そこで、VPNを経由した先のルータまでのRTT(= Destination A)と、実際に計測したい接続先までのRTT(= Destination B)を計測し、その差分(B-A)を家の環境からのRTTとして、その値を記録、可視化してみたいと思います。
image.png

これは、企業のネットワークなどで、監視サーバ等がAWS上にあり、Direct Connectでオンプレミスのネットワークに接続されている場合等に、オンプレミス側の各拠点の遅延を測りたいときにも応用できると思います。

なお、以下に示す設定は、Zabbix Serverが自宅にあるなど、VPNがない環境にも対応可能です。

環境構築方法

1. zabbix_agentd.confを変更

まず、zabbix_agentd.confに下記を追加します。この環境構築のポイントは、基本的にこの1行だけです。

/etc/zabbix/zabbix_agentd.conf
UserParameter=ping.remotelatency[*],echo `ping -c "$3" "$1" |grep rtt |awk -F'/' '{print $$5}'` - `ping -c "$3" "$2" |grep rtt |awk -F'/' '{print $$5}'` | grep -v '^-' | grep -v ' -$' | bc | grep -v '^-'
Timeout=30

第1引数がDestination Bの宛先、第2引数がDestination Aの宛先、第3引数がpingの回数になります。

エラー処理も含めて1行に収めたので長いですが、全体的には、大きく4つのブロックの処理になっています。少し解説してみたいと思います。

(1) echoでpingのRTTの結果をもとに、(Destination BのRTT) - (Destination AのRTT)の形式で出力

処理:(Ping宛先のRTT抽出)
`ping -c "$3" "$1" |grep rtt |awk -F'/' '{print $$5}'`

pingの出力結果から、rttの文字がある行をみつけます。そして、awkで必要なデータを抽出していきます。すなわち、下記のようになります。

  • 最初の「grep rtt」で右記を抽出: rtt min/avg/max/mdev = 11.142/15.854/18.345/3.335 ms
  • 次の「awk -F'/' '{print $$5}'」で「/」で区切られた5項目目を抽出: 15.854
    • (スペース区切りでパースしてから、「/」区切りでパースしたほうが美しいかもしれません。)

(Ping宛先2のRTT)も同様の処理です。

(2) エラー処理(先頭または末尾にマイナスがないかの確認)

(エラー処理)
grep -v '^-' | grep -v ' -$' 

pingの宛先A, Bからレスポンスがなかった時などは、結果が返ってきません。そうすると、先頭や末尾が「-」になるので、そうなっていないことを確認します。

(3) bcで引き算

(4) 結果のエラー処理(マイナスでないかの確認)

(エラー処理)
grep -v '^-'

計算結果は正であることを期待しています。Destination BのほうがDestination Aよりも遠いので。マイナスになると、Zabbixのグラフが汚くなるので、マイナスの値の場合は無視します。

2. Zabbix Agentをrestartします。

$ sudo systemctl restart zabbix-agent

3. 動作確認します。

私の家と同じ構成で、自宅のインターネット接続用ルータのIPアドレスが「192.168.1.1」で、計測先が「8.8.8.8」の場合は下記のようにします。

$ zabbix_get -s 127.0.0.1 -k ping.remotelatency[8.8.8.8,192.168.1.1,3]
4.875 (計測結果)

Zabbix ServerからVPNを経由していない場合は、下記のように、第2引数を「127.0.0.1」にします。

$ zabbix_get -s 127.0.0.1 -k ping.remotelatency[8.8.8.8,127.0.0.1,3]
10.445 (計測結果)

4. Zabbixのアイテムの設定をします。

「設定」-「ホスト」を選択し、「Zabbix Server」をクリックします。そして、「アイテム」を選択し、右上の「アイテムの作成」をクリックします。そして、下記のように、Detination A, Bの情報を入力します。(VPNを使っていない場合はDestination Aに127.0.0.1を入力してください。)
Destination A, Bなどの設定については見ず知らずの宛先にせず、自分が管理できる宛先にしてください。宛先にicmpパケットを送り続けることになるので。 私の場合は、適当なregionにt3a.nanoのインスタンスを立ててみたりしています( t3a.nanoの利用料金 )。
Zabbix 2020-08-11 183621.png

5. グラフを作成する。そして完成。

「設定」-「ホスト」を選択し、「Zabbix Server」をクリックします。そして、「グラフ」を選択し、右上の「グラフの作成」をクリックします。グラフで、このアイテムを選択します。
また、ダッシュボード上のウィジェットでグラフを作るのもよいでしょう。参考までにウィジェットでの設定例を示します。
以上で完成です。
そのほか、値を監視して、通知をしてもよいかもしれません。
image.png

おわりに

これで、ネットワークの遅延を継続的に監視できる環境が構築できました。幸い、自宅のネットワーク環境の遅延は問題なさそうです。
ちなみに、音声品質における人間が許容できる遅延はEnd to Endで概ね150msまでと言われています。これを超えると、人間は遅延を意識したうえで会話をしようとします。しかし、遅延がゆらぐと、多くの人間は我慢ができなくなるようです。
日本国内においては、このような遅延になることは少ないと思いますが、海外に電話会議等のカンファレンスサーバがある場合はこの限りではないかもしれません。

免責

こちらの内容にもとづく環境の構築は、自己の責任でお願いします。Destination A, Bなどの設定については見ず知らずの宛先にせず、自分が管理できる宛先にしてください。また、ここに記載の全ての内容については、個人の意見で、所属する企業や団体は関係ありません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

世間のリバースプロキシサービスが怖いのでワンライナーでAWS上に立てられるようにした

きっかけ

Slack botの開発を始めたところ非常にやりにくかった。
手元のPCにSlackアプリがあり、自作のSlack botも起動している状態で、それがお互いに通信するにはSlackのサーバーを経由する必要があるからだ。
そうすると、Slackサーバーから手元のSlack botにアクセスできるようにしなければならない。

ということで、色々調べてみるとリバースプロキシサービスを使って開発している人が多いようだった。
例えば、ngrok, servo, localhost.runなどを使っている人がいた。
ただ、外部のサービスに社内のチャット内容とかトークンとか流したくない・・・と思ったので自分の管理化のAWS VPC内にリバースプロキシを立てることにした。

最終的にこんな感じで起動できるようになった。

$ yarn -s generate 2> /dev/null | aws ec2 run-instances --launch-template LaunchTemplateName=reverse-proxy --user-data file:///dev/stdin

出来ること

リバースプロキシで出来るようにしたこと。
実際はCaddyがやってくれてるので、自分では大したことしてない。

  • HTTPSのリバースプロキシになる
    HTTPSでアクセスでき上流にプロキシする。
    ここで上流とはSlack bot = お手元のPCのこと。

  • 自動でDNSにドメインを登録する
    起動時にDNSにドメインを自動登録する。
    AWS VPC上に起動する前提なのでDNSはRoute53を使う。

  • 自動でTLS証明書を取得する
    登録したドメインでLet's Encryptから証明書を取得する。
    ここがCaddyの機能。

  • 自動で停止する
    SSHのセッションが切れたら指定時間後に自動でターミネートする。
    開発を終えてリモートポートフォワーディングを切断したら放っておけば停止する。
    停止前に再接続するとカウンターがリセットされる。

遣り残したこと

  • NPM
    手元で作って使ってただけなのでNPMモジュールとして動かそうとしてなかった。

  • Let's Encryptからのお叱り
    何度も起動していると都度TLS証明書を取得してしまうので行儀が悪い。
    EIPを割り当てればよさそうだが、その前にDNS登録してしまいそう・・・

  • Slackサーバーからのリクエストの検証
    これはSlack限定の話だが、SlackサーバーからSlack botへのリクエストは SigningSecret で検証ができる。
    Caddyのプラグインとしてリクエストの検証機能があれば、botを作らずともリバースプロキシだけ立てておいてエンドポイントのVerifyを通すことが出来るようになると思う。
    あと、お手元のPCでリクエストの検証を行う危険も回避できる。

実際はただのuser-data

ここの bin/generate.js を見てもらうと分かる通り、実際はサーバーを実装したのではなくほぼCaddyにお任せのEC2インスタンス用user-dataを動的に生成するスクリプトである。

cloud-init の per-instance でCaddyのインストールや起動設定を行い per-boot でRoute53にドメインを登録している。

使用方法

起動

NPMモジュールになっていないので clone しないといけない。

$ git clone https://github.com/ryo0301/instant-reverse-proxy
$ cd instant-reverse-proxy

.env に設定を書く。
HOSTED_ZONE_DOMAIN に設定するドメインはあらかじめRoute53に用意しておく。
Hosted Zone IDはこのドメイン名から逆引きしている。
残りは適宜設定。

ちなみに、Slack botのエンドポイントとしてSlack側に設定するURLはこんな感じ。

https:// HOST_NAME . HOSTED_ZONE_DOMAIN /slack/events/

$ cat <<EOF > .env
HOST_NAME=$USER
HOSTED_ZONE_DOMAIN=proxy.example.com
CADDY_DL_URL=https://github.com/caddyserver/caddy/releases/download/v2.0.0/caddy_2.0.0_linux_amd64.tar.gz
SHUTDOWN_TIMER_HOUR=1
UPSTREAM_PORT=3000
LOCALE=ja_JP.UTF-8
TIMEZONE=Asia/Tokyo
EOF

これでuser-dataが出力されるはず。
これを手動で貼り付けてもいい。

$ yarn -s generate

また、起動するEC2インスタンスに付けるIAMロールも必要。
必要なアクションはこの2つ。

  • route53:ChangeResourceRecordSets
  • route53:ListHostedZonesByName

EC2のローンチテンプレートを使うと起動が楽になる。
テンプレートにはさきほどのIAMロールの設定など諸々設定しておく。
これで1行で起動できるようになった。

$ yarn -s generate 2> /dev/null | aws ec2 run-instances --launch-template LaunchTemplateName=reverse-proxy --user-data file:///dev/stdin

接続

リモートポートフォワーディング

リバースプロキシが起動したらリモート→お手元のPCにポートフォワードする。
接続できなかったらEC2インスタンスの状態を見たりSSHでログインしてみて欲しい。

$ ssh -i ~/.ssh/id_rsa -l ec2-user i-XXXXXX -N -R 3000:localhost:3000

SessionManagerを使う場合

普段はEC2 Instance ConnectとSessionManagerを使って接続している。
事前にSessionManagerクライアントのインストールや ~/.ssh/config に設定を追加する必要がある。

$ cat <<EOF >> ~/.ssh/config
Host i-* mi-*
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
EOF

こちらはEC2 Instance Connectを使う場合。
公開鍵をEC2メタデータサービスに送ったあと、対象のEC2インスタンスに60秒間だけログイン可能になる。
送信に成功したら対応する秘密鍵でポートフォワードする。

$ ssh-keygen -t rsa -b 4096
$ aws ec2-instance-connect send-ssh-public-key --instance-id i-XXXXXX --instance-os-user ec2-user --availability-zone ap-northeast-1a --ssh-public-key file:///$HOME/.ssh/id_rsa.pub
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】S3ストレージクラスについて

awsソリューションアーキテクトアソシエイトの勉強中です。

試験によく出てくる
S3のストレージクラスについてシンプルにまとめてみました。

ストレージクラス

1.Amazon S3 standerd
一般的なS3ストレージ。
→普通のやつ。

2.Amazon S3 Intelligent-Tiering
データのアクセスパターンをモニタリングして、最も効率の良い階層へデータを保管をしてくれる。
(例:30日間利用されていないオブジェクトを低頻度アクセス階層へ移動する。など)
→データの保管コストが安くなるように、うまいこと自動でやってくれる。

3.Amazon S3 standerd IA(Infrequent Access)
アクセス頻度は低いデータ向け。
価格はGlacier以上、S3標準以下。
データをすぐに取り出せる点がGlacierとの違い。
取り出すときにも料金が発生する点も注意。
→普通のよりちょっと安い。ただ、頻繁にデータの取り出しが発生するとS3 standerdよりも高価に..?

4.Amazon S3 One-Zone IA(Infrequent Access)
Amazon S3 standerd IA(Infrequent Access)では最低3つのAZにデータを保管していたのに対して、
名の通りOne Zone(1つのAZ)にデータを保管する。
冗長性が低くなった分、Amazon S3 standerd IAより安価。
→あまり重要じゃないけど、念のため保存しておきたいデータ向け。(ログデータとか..)

5.Amazon S3 Glacier
低頻度アクセスデータ用で安価。
取り出しに数分から数時間かかるのがネック。
→安い。データの取り出しに少々時間がかかる。また、最低保存期間が90日ということも覚えておく。

6.Amazon S3 Glacier Deep Archive
Amazon S3の中で最も低コスト。
データの取り出し時間は12時間以内。
→最安。データの取り出しに半日。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Lightsail DNSゾーンとRoute53 ホストゾーンの違いは?

はじめに

Route53でドメイン取得して、Lightsailにドメインを設定する際にLightsailのDNSゾーンとRoute53のホストゾーンの違いがよくわからずDNS設定に悩んだ為、まとめたいと思います。

環境

  • Lightsail
  • Route53

Lightsail DNSゾーン

Lightsailは、AWSが提供するVPSサービスです。
Lightsailには、標準でDNS機能が含まれており、DNS管理を行うことが可能です。

Lightsailでは、DNS管理を行う際にDNSゾーンを作成します。
このDNSゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

DNSゾーンの作成方法などについては、AWS公式サイトを参照ください。
Amazon Lightsail でドメインの DNS レコードを管理する DNS ゾーンを作成する

Route53 ホストゾーン

Route53は、ドメイン取得やドメインのDNSレコード管理などが行えるサービスです。
Route53では、DNS管理を行う際にホストゾーンを作成します。
このホストゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

違いは?

Lightsail DNSゾーンとRoute53 ホストゾーンは、サービスの違いによる機能差はありますが、
本質的にはドメインのDNSレコードを管理する同じ役割となるため違いはありません。
なので、どちらのサービスを利用してもLightsailへドメインの設定を行うことができます。

結論

Route53の機能を特に利用する必要がなく、ランニングコストを出来る限り抑えたい場合は、
Lightsail DNSゾーンを利用するで問題ないかと思います。
Lightsailの月額料金にDNS機能が含まれていますので、追加料金は発生しません。

【補足】
Route53でドメイン取得時にホストゾーンを作成すると月額料金が発生します。
Route53のホストゾーンを作成しなくてもLightsailへドメインの設定を行うことは可能なので、
必要ない場合はホストゾーンを削除しましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Lightsail DNSゾーンとRoute53 ホストゾーンの違いは?

はじめに

Route53でドメイン取得して、Lightsailにドメインを設定する際にLightsailのDNSゾーンとRoute53のホストゾーンの違いがよくわからずDNS設定に悩んだ為、まとめたいと思います。

環境

  • Lightsail
  • Route53

Lightsail DNSゾーン

Lightsailは、AWSが提供するVPSサービスです。
Lightsailには、標準でDNS機能が含まれており、DNS管理を行うことが可能です。

Lightsailでは、DNS管理を行う際にDNSゾーンを作成します。
このDNSゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

DNSゾーンの作成方法などについては、AWS公式サイトを参照ください。
Amazon Lightsail でドメインの DNS レコードを管理する DNS ゾーンを作成する

Route53 ホストゾーン

Route53は、ドメイン取得やドメインのDNSレコード管理などが行えるサービスです。
Route53では、DNS管理を行う際にホストゾーンを作成します。
このホストゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

違いは?

Lightsail DNSゾーンとRoute53 ホストゾーンは、サービスの違いによる機能差はありますが、
本質的にはドメインのDNSレコードを管理する同じ役割となるため違いはありません。
なので、どちらのサービスを利用してもLightsailへドメインの設定を行うことができます。

結論

Route53の機能を特に利用する必要がなく、ランニングコストを出来る限り抑えたい場合は、
Lightsail DNSゾーンを利用するで問題ないかと思います。
Lightsailの月額料金にDNS機能が含まれていますので、追加料金は発生しません。

【補足】
Route53でドメイン取得時にホストゾーンを作成すると月額料金が発生します。
Route53のホストゾーンを作成しなくてもLightsailへドメインの設定を行うことは可能なので、
必要ない場合はホストゾーンを削除しましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tarコマンドのエラー(未解決)

はじめに

前回のチュートリアルに引き続き、SageMakerを触ってみたいという思いから資料を探してみたところ、機械学習を利用した画像判定Webアプリケーションの作成を行うハンズオン資料を発見した為、実施してみる事にしました。
しかし、SageMakerの実行途中でエラーが発生し、解消する事が出来なかった為断念しました。本記事では発生したエラー事象について記載します。

以下、構築予定だったアーキテクチャの概要です。

ai-ml01-02.png

(http://www.intellilink.co.jp/article/column/ai-ml01.html より引用)

また、以下が開発するWebアプリケーションの完成形イメージになります。
画面左側で判定したい画像を選択し、画像に何が写っているかの判定結果を画面右側に表示する仕組みです。

ai-ml01-01.png

(http://www.intellilink.co.jp/article/column/ai-ml01.html より引用)

本編

ハンズオン資料を参照し、
- S3作成
- SageMakerによる機械学習部分の実施

と進めていったが、SageMakerを実行した所、エラーが発生している事を確認。

ログを確認すると、以下の実行部分でエラーが表示されている。

%%bash

mkdir -p caltech_256_train_60
for i in 256_ObjectCategories/*; do
    c=`basename $i`
    mkdir -p caltech_256_train_60/$c
    for j in `ls $i/*.jpg | shuf | head -n 60`; do
        mv $j caltech_256_train_60/$c/
    done
done

python im2rec.py --list --recursive caltech-256-60-train caltech_256_train_60/
python im2rec.py --list --recursive caltech-256-60-val 256_ObjectCategories/

エラー文言は以下。

ls: cannot access 256_ObjectCategories/*/*.jpg: No such file or directory

更に確認を続けていると、1つ前の実行部分が、中断はされていないものの以下のメッセージを出力していた。以下は実行部分。

import os
import urllib.request

def download(url):
    filename = url.split("/")[-1]
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)


# Caltech-256 image files
download('http://www.vision.caltech.edu/Image_Datasets/Caltech256/256_ObjectCategories.tar')
!tar -xf 256_ObjectCategories.tar

# Tool for creating lst file
download('https://raw.githubusercontent.com/apache/incubator-mxnet/master/tools/im2rec.py')

メッセージは以下。

tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors

tarの解凍コマンドを実行しているが、対象ファイルがtar形式ではないので処理をスキップしている、とのこと。

  • tarファイルではない?
    →対象を確認したが、tarファイルだった
  • 権限等の原因でダウンロード出来ていない?
    →tarコマンドなしで実行したが、問題なくダウンロードできた
  • tarコマンドのオプションが間違っている?
    今回のtarコマンドのオプションは以下。
    x:アーカイブされたファイルを解凍し展開・復元を行う
    f:アーカイブファイル名を指定する
    →コマンドfを外して実行してみた所、上記メッセージは出力されなくなったものの終わらず。

調べてみると、tar.gzになっていると上手く解凍できない事があるようだが今回gzip圧縮もされておらず。。。
断念し一旦中断。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsアプリをAWSにあげるために必要な知識

はじめに

プログラミング未経験の筆者がRailsアプリをAWSにあげるのに、必要となった最低限の知識をざっくりとまとめました。

まとめた内容は以下の通りです。
・AWS
・VPC
・EC2
・RDS

AWSのネットワークサービス

image.png
参照:アベイラビリティゾーンとは

まずはじめにAWSのネットワークについてです。
AWSを使うときにはじめに触れるのがリージョンアベイラビリティーゾーン(AZ)です。

リージョン

リージョンはAWSがサービスを提供している拠点(国と地域)のことを指しています。
遠いリージョンをを使うとネットワーク遅延が発生してしまう可能性があるので、基本的には東京リージョンを使いましょう。

アベイラビリティーゾーン(AZ)

アベイラビリティーゾーン(AZ)データセンター(サーバー機などのIT機器を設置・収容する場所を提供し、安定的に運用できるようさまざまなサービスを提供する施設)とほぼ一緒です。
AZはリージョンごとに用意されていて、東京リージョンでは4つのAZが用意されています。

AWSでは複数のAZを利用すること(マルチAZ構成)が推奨されています。
マルチAZ構成であれば、もし一つのAZに障害が起きても、別のAZを利用することでネットワーク障害を回避できるからです。

続いてAWSのサービスについて説明していきます。

VPC(Virtual Private Cloud)

image.png

参照:VPC とサブネット

VPCはネットワークを作成するサービスです。
上図の通りAWSのネットワークの中にVPCのネットワークを作成します。
そしてVPCはサブネットを作成することで分割できます。

ざっくり言うと
大きな箱(AWS)の中にそこそこ大きい箱(VPC)があって、その中に小さな箱(サブネット)があるイメージですね。

そして、この小さな箱(サブネット)の中にこれから説明するEC2やRDSが入っていきます。

EC2(Elastic Compute Cloud)

image.png

参照:インスタンスの開始方法

EC2は仮想サーバ(インスタンス)ファイアウォール(セキュリティグループ)などを利用できるサービスです。

知らない単語が出てきましたね...

ざっくり説明していきます。

インスタンス

インスタンスは従来のオンプレミス環境上のサーバに相当します。

インスタンスはOS、CPU、メモリ等の情報を持っています。

つまり「インスタンスを作成する」というのは
「OS、CPU、メモリ等の条件を選択し、自分が求めるサーバーを作成する」ことです。

セキュリティグループ

セキュリティグループはAWS標準のファイアウォール機能です。
EC2インスタンスへのアクセスを許可したり、トラフィックを制御することができます。

デフォルトでは全ての通信が遮断してあります。(重要)
そのため特定の通信を許可する必要があります。

アクセスの許可は通信の方向で分けられ、インバウンドアウトバウンドに分けられています。
インバウンド: 外部からインスタンスへの通信を許可(外側→インスタンス)
アウトバウンド: インスタンスから外部への通信許可(インスタンス→外側)

初心者がAWSを扱う上で一番エラーが発生しやすい部分がこのセキュリティグループだと思います。

複数のサービスを紐づけるためにセキュリティグループは必須なのでよく理解しておきましょう。

RDS(Relational Datebase Service)

image.png

参照:VPC の DB インスタンスにアクセスするシナリオ(公式)

RDSはクラウド上でリレーショナルデータベース(RDBMS)を利用できるサービスです。

AWS上でRDBMSを利用する方法は2種類あります。(重要

1. EC2インスタンスにRDBMSをインストールする方法
2. RDSを利用する方法

RDSではデータベース用のインスタンス(仮想サーバー)が作成され、その上にOSやデータベースエンジンが構築されます。そのため、利用者はサーバやミドルウェアのメンテナンスが不要となります。

基本的にはRDSを利用した方が構築・運用のコスト削減できるため、RDBMSを運用する場合はRDSを選択されることが多いです。

まとめ

かなりざっくりですがAWSに関する知識をまとめました。

以下の記事を参考にしながら実際にAWSを触れば、詳細についての理解も深まると思います。

参照

世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで

【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法【その1〜ネットワーク,RDS環境設定編〜】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2上に構築したWebアプリからユーザにメールを送信したいので調査した

参考にした記事:

AWS再入門ブログリレー Amazon SES編 | Developers.IO
[AWS]EC2のメール送信ベストプラクティスをまとめてみた
AWSからのメール送信
【Amazon SES】SESでメール送信する時に知っておきたい事
AmazonSESから携帯キャリアメールに届く確率を上げる

AWSからのEメール送信の選択肢

  1. Amazon SESを使う
  2. EC2上にMTA(Mail Transfer Agent)を構築する
    AWSからのメール送信

システム要件

・ユーザ登録時にユーザにメールを送り、認証させる。
・パスワード変更時に、パスワード変更用のURLを送る。
・(ポリシーの変更や、新機能追加などのお知らせもできれば送りたい。)
・送ったメールがちゃんと届く
・迷惑フォルダに分類されない
・構築・運用をできるだけ楽にしたい!

選択肢1:Amazon SES

特徴

EC2からのメール送信は62,000件/月まで無料
BouncesとComplaintsの率によってはSESが停止されてしまう
携帯キャリアドレスへの送信が多いシステムには向かない。

料金

EC2からのメール送信は62,000件/月まで無料。
それ以上は1,000件/月ごとに0.10$

Bouncesとは

配信を試みて何らかの問題が発生し、送信者に差し戻されたメールのこと
Amazon SESでは「基本的にバウンス率は5%以下に維持してください。」と記載されている。
“苦情については、デフォルトで取得できません。Amazon SNSで通知できるようにモニタリングする事が求められます”
【Amazon SES】SESでメール送信する時に知っておきたい事

Complaintsとは

Eメールの受信者がメールに対してスパム報告をしたときに記録される
Amazon SESでは「基本的に苦情率は0.1%未満に維持してください。」と記載されている。

SESを使ったメール送信の手段

AWSマネジメントコンソールでぽちぽちする
Amazon SES APIをSDKで叩く
SMTPインターフェイスを使う

SESから携帯キャリアアドレスへの送信

“携帯キャリアアドレスへの送信が多いシステムの場合、Amazon SESはあまり向いていません。これはドメイン拒否等でバウンスした場合は宛先メールアドレスがSuppression Listに登録され、登録されてからは14日間は自動でバウンスメール扱いとなるからです。このSuppression Listはアカウントを超えて共有され、削除は手動で行う必要があります。”
[AWS]EC2のメール送信ベストプラクティスをまとめてみた

“現状日本国内の携帯キャリアの制限を十分考慮した配信アルゴリズムにはなっていない。”
AWSからのメール送信 25ページ

SPFの設定をしたらメール到達率がほぼ100%になったという事例もあり。
“実際、これを設定する前は、auとdocomoのおよそ60%のメールが到達していなかったようなのですが、設定したところほぼ100%到達するようになったようです”
AmazonSESから携帯キャリアメールに届く確率を上げる

選択肢2: EC2上にMTA(Mail Transfer Agent)を構築する

メリット

・携帯キャリア向けの送信ルールなど、柔軟な制御が可能
・MTAの既存のノウハウを活かした構築・運用が可能

デメリット

・構築/運用/障害対策/スケーリングは自分で行わなければならない
・email送信のための制限解除やDNS逆引きなど各種申請が必要になる。

注意点

・デフォルトではEC2からアウトバウンドのTCP25番ポートは制限されている
→申請して解除してもらう必要がある。Route53に制限解除と逆引きDNSの登録を申請する。

まとめ

Amazon SESを使った場合、ちゃんと携帯キャリアのメールアドレスにも届くかや、Complaints率が不確実。一方、EC2上にMTA構築は、構築コストと運用コスト高そう。どのくらいのコストなのかに関しては、私の知識レベルにもよるので、やってみないとわからない。みなさんはどうしてるんだろう?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# で DynamoDB から時系列データを GSI を使って範囲指定して検索する

C# で Amazon DynamoDB に保存されている時系列データを GSI(グローバルセカンダリインデックス)を使って範囲指定して検索する方法です。

[事前準備1] データ

下記の構造のデータを保存できるよう、

[DynamoDBTable("SampleTable")]
public class Sample
{
    /// <summary>「SampleTable」テーブルのハッシュキー</summary>
    [DynamoDBHashKey]
    public string Id { get; set; }

    /// <summary>「SampleTable」テーブルのレンジキー</summary>
    [DynamoDBRangeKey]
    public string DateAndTime { get; set; }

    /// <summary>「Date-Time-index」GSI のハッシュキー</summary>
    [DynamoDBGlobalSecondaryIndexHashKey]
    public string Date { get; set; }

    /// <summary>「Date-Time-index」GSI のレンジキー</summary>
    [DynamoDBGlobalSecondaryIndexRangeKey]
    public string Time { get; set; }

    [DynamoDBProperty]
    public string Message { get; set; }

    public override string ToString()
    {
        return $"{Id} / {DateAndTime} / {Message}";
    }
}

AWS Console から IdDateAndTime をキーにした SampleTable テーブルを用意します。
table.png

次に、下記のように SaveAsync メソッドを使って 10件のデータを作成します。

// DynamoDB にアクセスするためのオブジェクトを用意
using var client = new AmazonDynamoDBClient(RegionEndpoint.APNortheast1);
using var context = new DynamoDBContext(client);

// 10件のデータを作成
for (var i = 0; i < 10; i++)
{
    var now = DateTime.Now;

    await context.SaveAsync(new Sample
    {
        Id = $"{i % 3 + 1:D3}",
        DateAndTime = $"{now:yyyy-MM-dd HH:mm:ss.fff}",
        Date = $"{now:yyyy-MM-dd}",
        Time = $"{now:HH:mm:ss}",
        Message = $"メッセージ - {i + 1}"
    });

    // 保存される時間をずらしたいので 500 msec 待機
    await Task.Delay(500);
}

下記のように ScanAsync メソッドを使って全データを取得します。

// 全データを取得
var listAll = await context.ScanAsync<Sample>(null).GetRemainingAsync();

Console.WriteLine("--- listAll");
listAll.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);

そうすると、下記のようにデータを取得できます。

--- listAll
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
002 / 2020-08-11 11:40:41.224 / メッセージ - 2
003 / 2020-08-11 11:40:41.756 / メッセージ - 3
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
002 / 2020-08-11 11:40:44.412 / メッセージ - 8
003 / 2020-08-11 11:40:44.936 / メッセージ - 9
001 / 2020-08-11 11:40:45.458 / メッセージ - 10

[事前準備2] GSI

AWS Console からは下記のようにデータが保存されていることを確認できます。
aws.png

事前準備の最後に、日時を範囲指定して検索できるよう、AWS Console から DateTime をキーにした Date-Time-index インデックス(GSI)を用意します。
gsi.png

これで準備は完了です。

[シナリオ1] Id = 001 のデータを取得したい

下記のようにハッシュキーに 001 を指定して QueryAsync() メソッドを使ってデータを取得します。

var list01 = await context.QueryAsync<Sample>("001").GetRemainingAsync();

Console.WriteLine("--- list01");
list01.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);

そうすると、下記のようにデータを取得できます。

--- list01
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
001 / 2020-08-11 11:40:45.458 / メッセージ - 10

Id が 001 のデータのみを取得できています。

[シナリオ2] 2020-08-11 の 11:40:42~11:40:43 のデータを取得したい

下記のように GSI の名称 Date-Time-index を指定し、ハッシュキーに 2020-08-11 を指定して、レンジキーには QueryOperator.Between11:40:42 - 11:40:43 を指定して QueryAsync() メソッドを使ってデータを取得します。

var list02 = await context.QueryAsync<Sample>(
    "2020-08-11",
    QueryOperator.Between,
    new List<object>
    {
        "11:40:42",
        "11:40:43"
    },
    new DynamoDBOperationConfig
    {
        IndexName = "Date-Time-index" // 利用する GSI を指定
    }).GetRemainingAsync();

Console.WriteLine("--- list02");
list02.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);

そうすると、下記のようにデータを取得できます。

--- list02
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7

SampleTable テーブルのハッシュキーである Id をまたいで 11:40:42 - 11:40:43 のデータのみを取得できています。

さいごに

GSI を使って日時を範囲指定して検索することはできました。
ただ、コスト面の考慮や NoSQL らしい設計についてはできているかというと、、

より良い方法があったら教えてください m(_ _)m

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポートフォリオ投稿型プラットフォーム Techfollioをリリースしました。

開発に至った経緯

プログラミングスクールが流行り駆け出しエンジニアは増えてきているはずなのにポートフォリオが少ないのが不思議に思いました。転職でもポートフォリオは求められることが多いですしね。それをまとめたプラットフォームを作れば見た人がモチベーションも高まるし面白そうだと思い開発に至ります。

Techfollio

PCサイズ

スクリーンショット 2020-08-09 19.25.10.png

スマートフォンサイズ

IMG_3246.jpg

開発環境

ruby 2.6.3
rails 5.0.7.2
capistrano 3.11.1
nginx 1.16.1

機能紹介

Techfollioはまだ開発最中ですが現時点での機能を紹介します。(随時更新します)

ログイン機能

ログイン説明.gif

gem deviseを使用
ログインしていなくてもみんなのポートフォリオを見ることができます。
当たり前ですが、ログインしているユーザーのみポートフォリオ作成,編集、削除可能。

メール認証にはSendgridを利用しており、登録したメールアドレスに確認メールが届きます。
スクリーンショット 2020-08-10 20.10.22.png

Twitter連携機能

Twitter連携.gif

コメント機能

ポートフォリオにコメントを書くことができます。(ログインしないとコメントできません)
スクリーンショット 2020-08-11 0.20.37.png

ポートフォリオ検索

プログラミング言語ごとポートフォリオを見やすくするために検索機能を実装しました。
スクリーンショット 2020-08-11 0.34.08.png
スクリーンショット 2020-08-11 0.35.21.png

SNSシェア

ポートフォリオをFacebook,Line,Twitterにシェアできます。
sns ss1.png
sns ss2.png
sns ss3.png

最後に

より多くの人に利用してもらうために今後も改善続けていきます。
ポートフォリオを投稿して繋がろう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Power BIとS3の連携方法について

はじめに

Amazon S3 + Power BIで検討する場合の方式について備忘録
※2020/8に検討した結果です。

方式

S3からPower BI に直接つなぐ方法は基本的には以下の三つです。
直接つながないADFなどのデータ移動サービスでAzureに移動するパターンもあります。

推奨は3 or Azureに移動する、です。

1. S3 APIによる取得 (Importのみ)
参考:https://community.powerbi.com/t5/Power-Query/Can-I-connect-to-a-Amazon-S3-bucket-using-Power-Query/td-p/111919
2. CData など3rd Party ツールによる取得(製品によりDQ 可能)
参考:https://www.cdata.com/jp/kb/tech/amazons3-cloudhub-powerbi-service.rst
3. Redshift経由、Athena経由による取得(DQ 可能)
SpectrumやAthenaはETL不要とできる点は良いと思います

注意事項

認証・認可

当然ながら、接続方式により、選べる認可機能が異なります。

特に1の場合にはデータレイク側で直接権限制御となるため、行レベルのセキュリティなどの詳細なセキュリティの実装は難しいです。

また、AWS上にある場合にはPower BI Service上でのSSOは利用できないので、Power BI Serviceでレポートを公開するときの認可制御はPower BI dataset側での実装が必要です

参考:

https://docs.microsoft.com/ja-jp/power-bi/connect-data/power-bi-data-sources#single-sign-on-sso-for-directquery-sources

https://docs.microsoft.com/ja-jp/power-bi/connect-data/power-bi-data-sources

※PBI Desktopからなら、RedshiftもAD認証でとりに行けるようです
https://aws.amazon.com/jp/blogs/news/federate-amazon-redshift-access-with-microsoft-azure-ad-single-sign-on/

パフォーマンス

3と一部の3rd Partyについては、Direct Queryベースのものであれば、クエリを実行するエンジン(Athena,Redshiftなど)の性能次第ですが、Importの場合はPower Queryを利用してRedshiftから取得したデータ加工を行う場合、処理環境が共有環境(Pro,Free)なのか、占有環境(Premium)の違いにより、安定しない場合があります。

共有容量の場合、スペック不足による、タイムアウトの可能性が上がります。

また、1,2の方式でS3に直接データ取得をする場合、関係ないデータはスキャンしないなどのパフォーマンス向上技術の恩恵を受けることができません。

このあたりは、コスト最適と格納を目指すストレージ層と、読み取り性能の最適化を目指すDWH層の違いとして割り切るのかどうかとなるかと思います

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSアカウントへのログインをセキュアに省略する

AWSアカウントへのログインをセキュアに省略する

前記事(別に見なくても良い)

自宅の開発環境もWindowsになったのでWindows環境向けの第3段

やること

「AWSで開発してるけど毎回ログイン面倒だなぁ」ってときにログインをショートカットする。

前提

  • AWS Credentialを設定している人
  • Async/Awaitの使えるNodejsが走る
  • jqコマンドがインストールされている

動作確認環境

  • Windows 10 WSL2 CentOS 7
  • Nodejs 10.20(12.18.3を使うとnpm install時にエラー有り)

使い方

基本的にはここ参照。

image.png

  1. AWSアカウントで必要な権限を持ったLinux環境(WSLも可)に上記Gitの環境をClone
  2. npm install実行
  3. npm run setupを実行し、自身のAWSアカウントID(12桁の数値)を入力
  4. npm startを実行
  5. ブラウザでhttp://localhost:5201にアクセス
  6. 以上!

追加でできること

  • 中のファイルを書き換えたら、権限絞れるし期限もイジれる。
  • この環境を社内サーバに立ててBasic認証必要にするなどして社員ならこのリンク押すだけでログイン、とかもできるんじゃないかな。
  • 修正とか機能追加とかプルリクいただければ喜んで取り込みますよー
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Vaultをつかってみた

AWS Vaultとは?

AWS Vaultを使うと、ローカル環境でアクセスキー、シークレットアクセスキーを安全に管理することができます。AWS CLIを使う時に、アクセスキーとシークレットアクセスキーを作成しますが、いつもこれの管理が不安でした。いくらPCがpassword設定をされていて簡単には入れないとしても安全性は十分とは言えません。そこでAWS Vaultはそのキーを暗号化して安全に保管してくれます。CLIを使う場合は必須の技術だと思います。

AWS Vaultを使えば

・アクセスキー、シークレットアクセスキーを暗号化して安全に管理。
・アクセスキーのローテーションが簡単。

実際に使う際のメモ

IAMユーザーに強力な権限は付与しないこと。

IMAユーザーには最小限の権限且つ、間接的に付与することを念頭に、その権限(ポリシー)はグループに付与し、IAMユーザーはそのグループに属すること。そうすることで、IAMユーザーに直接的に権限を付与することは回避。

グループの権限(ポリシー)にはAssumeRoleする権限とアクセスキーのローテーションの権限を付与。つまり、IAMユーザーは属しているグループによるこの2つの権限(AssumeRoleする権限とアクセスキーのローテーションの権限)しか実行できない。

AWSコンソールやAWS CLIの操作はAssumeRoleで取得した権限にて操作をすること。

とにかく安全に

AssumeRole対象のIAMロールにはMFAを強制させること。

IAMユーザーがAssumeRoleしてきた時に、MFAを強制させることで、仮にシークレットキーが盗まれた時にでも侵入を防げる。

アクセスキーのローテーションは90日ごとが推奨を忘れない。

$ aws-vault rotate -n ~~~~~~~

-nのオプションをつけないとエラーになる。

Keychain のパスワード確認頻度

AWS VaultはバックエンドでこのmacのKeychainと連携しているため、高頻度でKeychainのパスワード入力を求められるが、慣れるまでは都度入力でも良いと思う。無駄に確認頻度を低くして不安になるよりかはよい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

スケール○○の違いについて

本記事について

スケール〇〇っていろんな種類があってあまり理解していなかったのでまとめます。

まず以下の四つがあります。

  • スケールイン
  • スケールアウト
  • スケールアップ
  • スケールダウン

違いについて

スケールイン

スケールをインする、つまり小さくすることを指しています。
サーバの台数を減らすことがこれに当たります。

スケールアウト

インの逆でアウトですね。意味も逆で、サーバの台数を増やすことです。
最初は「インだからサーバがインして増えてるんだな!アウトだからサーバが出て行ってるから減ってるんだな!」って勘違いしてました。

スケールアップ

スケールをアップします。これはサーバの台数ではなく、サーバのスペックを上げることを意味しています。

スケールダウン

アップの逆です。スペックダウンのことです。
サーバ増減以外にもスケールする方法があることを理解しておかないと、「スケールアップとスケールアウトの違いは?」って聞かれた際に混乱するので注意してください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS の Windows 2019 Server のインスタンスで日本語に変更できない

はじめに

AWS の Windows Server 2019 で「Add a language」 で日本語を入れても「Windows display language」のプルダウンメニューから日本語が出てこないが、何とかして日本語化したいので調べてみた

image.png

通常では、以下の URL を参考に日本語を追加すると言語変更できるのだが、なぜか AWS の Windows Server 2019 のインスタンスではできない(選択できない)
https://blog.trainocate.co.jp/blog/azure_setting_024

日本語化手順

AWS の Windows Server 2019 で日本語化する手順の概要はこちら。

  1. ISOイメージのダウンロード
  2. ISをマウント
  3. ISOイメージに入っている言語をインストール
  4. 言語変更
  5. 再起動

先に「4.」の手順を行ってからでも日本語化できます。
※)「4.」 の手順をしているのにも関わらず「日本語」がでなかったので調べてみたのでした。

マルチランゲージのパッケージをダウンロード

以下のページのまんなかあたりにある ISO のダウンロードの「here」をクリック。

https://support.microsoft.com/en-za/help/4466511/cannot-configure-language-pack-for-windows-server-2019

ダウンロード先

直接ダウンロードしたいときは以下のURLでダウンロードできる。
https://software-download.microsoft.com/download/pr/17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso

ダウンロードした ISO をマウント

ダウンロードしたファイルを右クリックし「Mount」をクリック
ISOファイルをマウント

マウントすると、以下のように出てくる。(赤枠で囲ったランゲージをインストール)
ISOファイルをマウント

インストール

管理者モードでコマンドラインを起動し「lpksetup.exe」を実行
ISOファイルをマウント

以下の画面が起動するので「Install display languages」を選択

ISOファイルをマウント

「Browse」で「Microsoft-Windows-Server-Language-Pack_x64_ja-jp」を選択して「Next」をクリックしてインストールする。

日本語の言語パッケージをインストール

インストール完了

インストール完了

言語の設定

「日本語」が出てきた!

ISOファイルをマウント

変更して、再起動すると日本語化された
ISOファイルをマウント

おわりに

日本語化するとなんかOSの処理速度落ちたような気がするのは気のせいなのか??

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

BitnamiのRedmineでSSL化する方法

はじめに

AWSのEC2上にBitnamiのRedmineを起動したのですが、常時SSL化したかったので設定してみました。

設定方法

公式のホームページに「Let's Encrypt証明書を自動構成する」というページがあったので、そちらを参考に設定しました。
公式ページ

設定用のツールを起動する

下記のコマンドを入力して、Let's Encryptの設定を行うツールを起動します。

ツールの起動コマンド
sudo /opt/bitnami/bncert-tool

起動が完了したら、下記の内容が表示されます。

起動完了時の画面
Welcome to the Bitnami HTTPS Configuration tool.

ドメインの設定

「Webサーバーを構成するドメインの有効なスペース区切りのリストを入力してください。」と表示されるので、Domain list []:の後ろにスペース区切りで記述します。

設定画面
Domains

Please provide a valid space-separated list of domains for which you wish to 
configure your web server.

Domain list []: 設定したいドメインをスペース区切りで記述する

WWWの設定

WWWを含んだドメインも登録しますか?と聞かれるのですが、今回は必要ないので、nと入力します。

WWWの設定
The following domains were not included: www.ドメイン名. Do you want to add them? [Y/n]: n

wwwを設定に含めなかった場合、
「警告:wwwドメイン(www.example.comなど)またはwww以外のドメイン(www.example.comなど)が指定されていないため、非wwwからwww、wwwから非wwwへのリダイレクトは無効になります。」
と注意点が表示されます。
今回は、問題無いので、Enterキーを押して次に進んでください。

wwwの注意
Warning: No www domains (e.g. www.example.com) or non-www domains (e.g. 
www.example.com) have been provided, so the following redirections will be 
disabled: non-www to www, www to non-www.
Press [Enter] to continue:

リダイレクトの設定

「Bitnamiインストールで有効または無効にするリダイレクトを選択してください。」と聞かれて、
「HTTPからHTTPSへのリダイレクトを有効にする」かどうかについて聞かれるので、yと入力してEnterキーを押す。

リダイレクトの設定
Enable/disable redirections

Please select the redirections you wish to enable or disable on your Bitnami 
installation.

Enable HTTP to HTTPS redirection [Y/n]: y

変更点の有効化

変更するためのステップが表示されるので、確認し、同意できる場合はyを入力して、Enterキーを押します。

変更ステップ和訳
実行する変更

次の変更がBitnamiインストールに対して実行されます。

1. Webサーバーを停止します
2.ドメインに無料のLet's Encrypt証明書を使用するようにWebサーバーを構成する
3.毎月証明書を自動的に更新するようにcronジョブを構成します
4. Webサーバー名を次のように設定します:redmine.msgaws.link
5. HTTPからHTTPSへのリダイレクトを有効にします(例:http://redmine.msgaws.linkをhttps://redmine.msgaws.linkにリダイレクトします)
6.すべての変更が実行されたら、Webサーバーを起動します

これらの変更に同意しますか? [はい/いいえ]:
変更ステップ
Changes to perform

The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: 
redmine.msgaws.link
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: redmine.msgaws.link
5. Enable HTTP to HTTPS redirection (example: redirect 
http://redmine.msgaws.link to https://redmine.msgaws.link)
6. Start web server once all changes have been performed

Do you agree to these changes? [Y/n]: 

Let's Encryptの設定

処理が進むと、下記の内容が表示されます。
「Let's Encrypt証明書を関連付ける有効な電子メールアドレスを入力してください。」と表示されているので、自分のメールアドレスを入力してEnterキーを押します。

Emailの設定
Create a free HTTPS certificate with Let's Encrypt

Please provide a valid e-mail address for which to associate your Let's Encrypt 
certificate.

Domain list: ドメイン名

Server name: ドメイン名

E-mail address []: 自分のメールアドレスをここに記載する

Emailの入力が完了したら、
「Let's Encryptサブスクライバー契約に同意しますか?」
と聞かれるので、yと入力し、Enterキーを押します。

サブスクライバーの確認
The Let's Encrypt Subscriber Agreement can be found at:

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf

Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: y

変更結果

下記のように「Success」と表示されれば、変更は完了しています。

変更結果
Performing changes to your installation

The Bitnami HTTPS Configuration Tool will perform any necessary actions to your 
Bitnami installation. This may take some time, please be patient.

----------------------------------------------------------------------------
Success

The Bitnami HTTPS Configuration Tool succeeded in modifying your installation.

The configuration report is shown below.

Backup files:
* /opt/bitnami/apache2/conf/httpd.conf.back.202008102248
* /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf.back.202008102248
* /opt/bitnami/apache2/conf/bitnami/bitnami.conf.back.202008102248

Find more details in the log file:

/tmp/bncert-202008102248.log

If you find any issues, please check Bitnami Support forums at:

https://community.bitnami.com

Press [Enter] to continue:
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む