- 投稿日:2020-08-11T21:26:58+09:00
[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.mdLayerを定義する
まず、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: gettemplate.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.8NumPyを追加してみる
次に、ライブラリを追加します。
利用したいライブラリを記述してください。
今回のサンプルでは、機械学習でよく使用する数値計算モジュールのNumPyを追加してみたいと思います。
hello_world_layer
に、requirements.txt
を作成し、以下のように記述して、ライブラリを追加します。$ touch hello_world_layer/requirements.txthello_world_layer/requirements.txtnumpyLayerクラスを作成する
hello_world_layer
配下に、numpyの処理をするユーザクラスを作成してみましょう。
名前は適当にuser_numpy
とでもしておきましょうか。$ touch hello_world_layer/user_numpy.pyhello_world_layer/user_numpy.pyimport 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.pyimport 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
という制約がありますので、これを考慮しながら、必要なライブラリのみを取り込むようにしましょう。
サンプルコードリポジトリ
- 投稿日:2020-08-11T21:16:16+09:00
独学未経験エンジニアが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エンジニアへの道は高く険しいように感じます。
しかし、自分にとって登りたい山がどれだけ高かろうが、険しかろうが、関係ありません。
ただ登るだけ
毎日頑張って積み上げて、疲れたら一緒にサボりましょう。長くなりましたが、初投稿は以上になります。
ここまで読んでいただきありがとうございました。
- 投稿日:2020-08-11T20:12:25+09:00
RailsをAWS ECS(Fargate)でホストする環境構築のすべて【1. 前談、N/W+α】
本記事シリーズの構成(予定)
- 前談、N/W+α(これ)
- Docker定義、ECRの設定
- ECSの設定、デプロイ
- SSMの設定
構築環境全体像
実現したいポイント
* Docker環境で開発を行っているRailsプロジェクトを、Fargate起動のECSでホストします。
* ECSタスクは複数設け、負荷分散します。
* AWS System Manager セッションマネージャを使用してECSに「接続し、CUIで操作可能にします。ネットワーク+ALB+RDSの環境構築
VPC
作成した後、VPC一覧右上のアクション>DNSホスト名の編集から有効化をしておきます。
サブネット
下記の通り、わかりやすくサブネットを切っておきます。
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 インターネットゲートウェイ
作成したら、右上のアクション>VPCにアタッチから、
sample-vpcにアタッチするのを忘れずに。エンドポイント
この後設定していくサービスを利用するために、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つのみ指定。
Interfaceタイプのエンドポイントには、セキュリティグループを適用する。
エンドポイント用のセキュリティグループとして、443ポートを開けたセキュリティグループを作っておきましょう。
S3はGatewayタイプなのでセキュリティグループではなく、ルートテーブルに従います。
ルートテーブル
VPC作成時に自動作成されているものを編集します。
ルート一覧に、先ほど追加したエンドポイントの設定が加わっています。
ルートの編集ボタンを押下します。
ここにインターネットゲートウェイへのルーティングを加えます。
編集したルートテーブルにサブネットを関連づけます。
インターネットゲートウェイのルーティングを設定したルートテーブルに、サブネットを関連づけることで、
いわゆるpublic subnetになります。
public-subnet-a,cはSSMを利用した接続時にパブリックでないとうまくできなかったため、セキュリティグループでIP、ポート制限をかけつつパブリック化する判断にしました。
public-subnet-dはデータベース用に取っていますが、データベースに外部からクライアント接続したいのでパブリックにしています。ここをパブリックにするかどうかは任意です。
ALB
アプリケーションロードバランサーを選択して作成していきます。
実用するときには、SSL証明書を適用して443ポート開けることになると思いますが、
今回は検証なので、80ポート開けておきます。
ルーティング先はECSをおくサブネットに絞って設定しています。
セキュリティグループはここでついでに新規作成しています。
80ポートのインバウンドを設定しています。検証なのでマイIPのみにしたほうがよかったかも。
ターゲットグループをここで一緒に新規作成します。
ターゲットの種類はIPにします。
ヘルスチェックはアプリケーションに用意したヘルスチェック用のパスを指定してください。
RDS
作成内容は完全に任意です。
MySQL 8.0.19でインスタンスをパブリックアクセスありで作成しました。
このときに適用したセキュリティグループは以下の通りです。
3306ポートをマイIPからのみアクセス可能にしています。
まとめ
ここまででこんな感じの大枠まで作りました。
次の記事で、Dockerの定義と、コンテナイメージをECRにプッシュするまでを記載したいと思います。
- 投稿日:2020-08-11T20:02:09+09:00
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 /var6.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/
- 投稿日:2020-08-11T19:56:29+09:00
Zabbixでコロナ禍おける在宅勤務環境のネットワークの遅延を計測し続ける
はじめに
瀧澤です。2020年前半からのコロナ禍において、自宅で仕事をするにあたり、リモート会議やVDI(Virtual Desktop Infrastructure)などで会社のネットワークに接続したり、その他のサービスに接続したりすることも多いかと思います。昨今、ブロードバンド回線においては、帯域幅が問題になることはあまりないですが、ネットワークの遅延やその遅延の揺らぎは、リアルタイムな双方向通信を行うリモート会議システムやVDIにおいては影響するかもしれません。
この記事では、その遅延を日常的に計測する仕組みをZabbixで作ってみたいと思います。Pingを使って計測します。なので、正確には、往復のレスポンスタイム(Round Trip Time;RTT)になります。アウトプットは、下記のようなイメージです。
余談ですが、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として、その値を記録、可視化してみたいと思います。
これは、企業のネットワークなどで、監視サーバ等がAWS上にあり、Direct Connectでオンプレミスのネットワークに接続されている場合等に、オンプレミス側の各拠点の遅延を測りたいときにも応用できると思います。
なお、以下に示す設定は、Zabbix Serverが自宅にあるなど、VPNがない環境にも対応可能です。
環境構築方法
1. zabbix_agentd.confを変更
まず、zabbix_agentd.confに下記を追加します。この環境構築のポイントは、基本的にこの1行だけです。
/etc/zabbix/zabbix_agentd.confUserParameter=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-agent3. 動作確認します。
私の家と同じ構成で、自宅のインターネット接続用ルータの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の利用料金 )。
5. グラフを作成する。そして完成。
「設定」-「ホスト」を選択し、「Zabbix Server」をクリックします。そして、「グラフ」を選択し、右上の「グラフの作成」をクリックします。グラフで、このアイテムを選択します。
また、ダッシュボード上のウィジェットでグラフを作るのもよいでしょう。参考までにウィジェットでの設定例を示します。
以上で完成です。
そのほか、値を監視して、通知をしてもよいかもしれません。
おわりに
これで、ネットワークの遅延を継続的に監視できる環境が構築できました。幸い、自宅のネットワーク環境の遅延は問題なさそうです。
ちなみに、音声品質における人間が許容できる遅延はEnd to Endで概ね150msまでと言われています。これを超えると、人間は遅延を意識したうえで会話をしようとします。しかし、遅延がゆらぐと、多くの人間は我慢ができなくなるようです。
日本国内においては、このような遅延になることは少ないと思いますが、海外に電話会議等のカンファレンスサーバがある場合はこの限りではないかもしれません。免責
こちらの内容にもとづく環境の構築は、自己の責任でお願いします。Destination A, Bなどの設定については見ず知らずの宛先にせず、自分が管理できる宛先にしてください。また、ここに記載の全ての内容については、個人の意見で、所属する企業や団体は関係ありません。
- 投稿日:2020-08-11T17:32:48+09:00
世間のリバースプロキシサービスが怖いのでワンライナーで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:3000SessionManagerを使う場合
普段は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
- 投稿日:2020-08-11T16:20:52+09:00
【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時間以内。
→最安。データの取り出しに半日。
- 投稿日:2020-08-11T15:52:24+09:00
【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へドメインの設定を行うことは可能なので、
必要ない場合はホストゾーンを削除しましょう。
- 投稿日:2020-08-11T15:52:24+09:00
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へドメインの設定を行うことは可能なので、
必要ない場合はホストゾーンを削除しましょう。
- 投稿日:2020-08-11T15:35:35+09:00
tarコマンドのエラー(未解決)
はじめに
前回のチュートリアルに引き続き、SageMakerを触ってみたいという思いから資料を探してみたところ、機械学習を利用した画像判定Webアプリケーションの作成を行うハンズオン資料を発見した為、実施してみる事にしました。
しかし、SageMakerの実行途中でエラーが発生し、解消する事が出来なかった為断念しました。本記事では発生したエラー事象について記載します。以下、構築予定だったアーキテクチャの概要です。
(http://www.intellilink.co.jp/article/column/ai-ml01.html より引用)
また、以下が開発するWebアプリケーションの完成形イメージになります。
画面左側で判定したい画像を選択し、画像に何が写っているかの判定結果を画面右側に表示する仕組みです。(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 errorstarの解凍コマンドを実行しているが、対象ファイルがtar形式ではないので処理をスキップしている、とのこと。
- tarファイルではない?
→対象を確認したが、tarファイルだった
- 権限等の原因でダウンロード出来ていない?
→tarコマンドなしで実行したが、問題なくダウンロードできた
- tarコマンドのオプションが間違っている?
今回のtarコマンドのオプションは以下。
x:アーカイブされたファイルを解凍し展開・復元を行う
f:アーカイブファイル名を指定する
→コマンドfを外して実行してみた所、上記メッセージは出力されなくなったものの終わらず。調べてみると、tar.gzになっていると上手く解凍できない事があるようだが今回gzip圧縮もされておらず。。。
断念し一旦中断。
- 投稿日:2020-08-11T14:36:00+09:00
RailsアプリをAWSにあげるために必要な知識
はじめに
プログラミング未経験の筆者がRailsアプリをAWSにあげるのに、必要となった最低限の知識をざっくりとまとめました。
まとめた内容は以下の通りです。
・AWS
・VPC
・EC2
・RDSAWSのネットワークサービス
まずはじめにAWSのネットワークについてです。
AWSを使うときにはじめに触れるのがリージョンとアベイラビリティーゾーン(AZ)です。リージョン
リージョンはAWSがサービスを提供している拠点(国と地域)のことを指しています。
遠いリージョンをを使うとネットワーク遅延が発生してしまう可能性があるので、基本的には東京リージョンを使いましょう。アベイラビリティーゾーン(AZ)
アベイラビリティーゾーン(AZ)はデータセンター(サーバー機などのIT機器を設置・収容する場所を提供し、安定的に運用できるようさまざまなサービスを提供する施設)とほぼ一緒です。
AZはリージョンごとに用意されていて、東京リージョンでは4つのAZが用意されています。AWSでは複数のAZを利用すること(マルチAZ構成)が推奨されています。
マルチAZ構成であれば、もし一つのAZに障害が起きても、別のAZを利用することでネットワーク障害を回避できるからです。続いてAWSのサービスについて説明していきます。
VPC(Virtual Private Cloud)
参照:VPC とサブネット
VPCはネットワークを作成するサービスです。
上図の通りAWSのネットワークの中にVPCのネットワークを作成します。
そしてVPCはサブネットを作成することで分割できます。ざっくり言うと
大きな箱(AWS)の中にそこそこ大きい箱(VPC)があって、その中に小さな箱(サブネット)があるイメージですね。そして、この小さな箱(サブネット)の中にこれから説明するEC2やRDSが入っていきます。
EC2(Elastic Compute Cloud)
参照:インスタンスの開始方法
EC2は仮想サーバ(インスタンス)、ファイアウォール(セキュリティグループ)などを利用できるサービスです。
知らない単語が出てきましたね...
ざっくり説明していきます。
インスタンス
インスタンスは従来のオンプレミス環境上のサーバに相当します。
インスタンスはOS、CPU、メモリ等の情報を持っています。
つまり「インスタンスを作成する」というのは
「OS、CPU、メモリ等の条件を選択し、自分が求めるサーバーを作成する」ことです。セキュリティグループ
セキュリティグループはAWS標準のファイアウォール機能です。
EC2インスタンスへのアクセスを許可したり、トラフィックを制御することができます。デフォルトでは全ての通信が遮断してあります。(重要)
そのため特定の通信を許可する必要があります。アクセスの許可は通信の方向で分けられ、インバウンドとアウトバウンドに分けられています。
インバウンド: 外部からインスタンスへの通信を許可(外側→インスタンス)
アウトバウンド: インスタンスから外部への通信許可(インスタンス→外側)初心者がAWSを扱う上で一番エラーが発生しやすい部分がこのセキュリティグループだと思います。
複数のサービスを紐づけるためにセキュリティグループは必須なのでよく理解しておきましょう。
RDS(Relational Datebase Service)
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環境設定編〜】
- 投稿日:2020-08-11T14:15:33+09:00
EC2上に構築したWebアプリからユーザにメールを送信したいので調査した
参考にした記事:
AWS再入門ブログリレー Amazon SES編 | Developers.IO
[AWS]EC2のメール送信ベストプラクティスをまとめてみた
AWSからのメール送信
【Amazon SES】SESでメール送信する時に知っておきたい事
AmazonSESから携帯キャリアメールに届く確率を上げるAWSからのEメール送信の選択肢
- Amazon SESを使う
- 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構築は、構築コストと運用コスト高そう。どのくらいのコストなのかに関しては、私の知識レベルにもよるので、やってみないとわからない。みなさんはどうしてるんだろう?
- 投稿日:2020-08-11T13:53:31+09:00
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 から
Id
、DateAndTime
をキーにしたSampleTable
テーブルを用意します。
次に、下記のように
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 Console から
Date
、Time
をキーにしたDate-Time-index
インデックス(GSI)を用意します。
これで準備は完了です。
[シナリオ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.Between
と11: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
- 投稿日:2020-08-11T13:48:49+09:00
ポートフォリオ投稿型プラットフォーム Techfollioをリリースしました。
開発に至った経緯
プログラミングスクールが流行り駆け出しエンジニアは増えてきているはずなのにポートフォリオが少ないのが不思議に思いました。転職でもポートフォリオは求められることが多いですしね。それをまとめたプラットフォームを作れば見た人がモチベーションも高まるし面白そうだと思い開発に至ります。
PCサイズ
スマートフォンサイズ
開発環境
ruby 2.6.3
rails 5.0.7.2
capistrano 3.11.1
nginx 1.16.1機能紹介
Techfollioはまだ開発最中ですが現時点での機能を紹介します。(随時更新します)
ログイン機能
gem deviseを使用
ログインしていなくてもみんなのポートフォリオを見ることができます。
当たり前ですが、ログインしているユーザーのみポートフォリオ作成,編集、削除可能。メール認証にはSendgridを利用しており、登録したメールアドレスに確認メールが届きます。
Twitter連携機能
コメント機能
ポートフォリオにコメントを書くことができます。(ログインしないとコメントできません)
ポートフォリオ検索
プログラミング言語ごとポートフォリオを見やすくするために検索機能を実装しました。
SNSシェア
ポートフォリオをFacebook,Line,Twitterにシェアできます。
最後に
より多くの人に利用してもらうために今後も改善続けていきます。
ポートフォリオを投稿して繋がろう!
- 投稿日:2020-08-11T13:41:22+09:00
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
※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層の違いとして割り切るのかどうかとなるかと思います
- 投稿日:2020-08-11T12:34:02+09:00
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時にエラー有り)
使い方
基本的にはここ参照。
- AWSアカウントで必要な権限を持ったLinux環境(WSLも可)に上記Gitの環境をClone
- npm install実行
- npm run setupを実行し、自身のAWSアカウントID(12桁の数値)を入力
- npm startを実行
- ブラウザで
http://localhost:5201
にアクセス- 以上!
追加でできること
- 中のファイルを書き換えたら、権限絞れるし期限もイジれる。
- この環境を社内サーバに立ててBasic認証必要にするなどして社員ならこのリンク押すだけでログイン、とかもできるんじゃないかな。
- 修正とか機能追加とかプルリクいただければ喜んで取り込みますよー
- 投稿日:2020-08-11T11:47:13+09:00
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のパスワード入力を求められるが、慣れるまでは都度入力でも良いと思う。無駄に確認頻度を低くして不安になるよりかはよい。
- 投稿日:2020-08-11T11:33:23+09:00
スケール○○の違いについて
本記事について
スケール〇〇っていろんな種類があってあまり理解していなかったのでまとめます。
まず以下の四つがあります。
- スケールイン
- スケールアウト
- スケールアップ
- スケールダウン
違いについて
スケールイン
スケールをインする、つまり小さくすることを指しています。
サーバの台数を減らすことがこれに当たります。スケールアウト
インの逆でアウトですね。意味も逆で、サーバの台数を増やすことです。
最初は「インだからサーバがインして増えてるんだな!アウトだからサーバが出て行ってるから減ってるんだな!」って勘違いしてました。スケールアップ
スケールをアップします。これはサーバの台数ではなく、サーバのスペックを上げることを意味しています。
スケールダウン
アップの逆です。スペックダウンのことです。
サーバ増減以外にもスケールする方法があることを理解しておかないと、「スケールアップとスケールアウトの違いは?」って聞かれた際に混乱するので注意してください。
- 投稿日:2020-08-11T10:28:38+09:00
AWS の Windows 2019 Server のインスタンスで日本語に変更できない
はじめに
AWS の Windows Server 2019 で「Add a language」 で日本語を入れても「Windows display language」のプルダウンメニューから日本語が出てこないが、何とかして日本語化したいので調べてみた
通常では、以下の URL を参考に日本語を追加すると言語変更できるのだが、なぜか AWS の Windows Server 2019 のインスタンスではできない(選択できない)
https://blog.trainocate.co.jp/blog/azure_setting_024日本語化手順
AWS の Windows Server 2019 で日本語化する手順の概要はこちら。
- ISOイメージのダウンロード
- ISをマウント
- ISOイメージに入っている言語をインストール
- 言語変更
- 再起動
先に「4.」の手順を行ってからでも日本語化できます。
※)「4.」 の手順をしているのにも関わらず「日本語」がでなかったので調べてみたのでした。マルチランゲージのパッケージをダウンロード
以下のページのまんなかあたりにある ISO のダウンロードの「here」をクリック。
直接ダウンロードしたいときは以下のURLでダウンロードできる。
https://software-download.microsoft.com/download/pr/17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.isoダウンロードした ISO をマウント
ダウンロードしたファイルを右クリックし「Mount」をクリック
マウントすると、以下のように出てくる。(赤枠で囲ったランゲージをインストール)
インストール
管理者モードでコマンドラインを起動し「lpksetup.exe」を実行
以下の画面が起動するので「Install display languages」を選択
「Browse」で「Microsoft-Windows-Server-Language-Pack_x64_ja-jp」を選択して「Next」をクリックしてインストールする。
インストール完了
言語の設定
「日本語」が出てきた!
おわりに
日本語化するとなんかOSの処理速度落ちたような気がするのは気のせいなのか??
- 投稿日:2020-08-11T08:20:36+09:00
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: