- 投稿日:2019-05-26T23:22:11+09:00
ALB+LambdaでHello WorldなWebアプリ
Lambda関数作成
- コンソールを開く → https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1
- 「サービスを検索する」で「lambda」を検索して移動 → https://ap-northeast-3.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/begin
- 「関数の作成」を押下
- 以下を入力して「関数の作成」を押下
- 一から作成:デフォルト(チェック)
- 関数名:helloworld
- ランタイム:デフォルト(Node.js 10.x) ★実案件ではJavaとしたい
- 実行ロール:デフォルト(基本的なLambdaアクセス権限で新しいロールを作成)
- 表示されているコードを以下の内容に変更して画面上部の「保存」を押下
exports.handler = async(event) => { return { statusCode: 200, headers: { 'Content-Type': 'text/html' }, body: 'Hello World' }; };Application Load Balancer(ALB)作成
- コンソールを開く → https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1
- 「サービスを検索する」で「EC2」を検索して移動 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Home:
- 左メニューから「ロードバランサー」を探して移動 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers:sort=loadBalancerName
- 「ロードバランサーの作成」を押下 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SelectCreateELBWizard:
- 「Application Load Balancer」の「作成」を押下
- 以下を入力して「次の手順:セキュリティ設定の構成」を押下
- 名前:helloworld-alb
- スキーム:デフォルト(インターネット向け)
- IPアドレスタイプ:デフォルト(ipv4)
- ロードバランサーのプロトコル:デフォルト(HTTP、80)
- VPN:デフォルト
- アベイラビリティーゾーン:2つチェック
- タグ:デフォルト(なし)
- 「次の手順:セキュリティグループの設定」を押下
- 以下を入力して「次の手順:ルーティングの設定」を押下
- セキュリティグループの割り当て:新しいセキュリティグループを作成する
- その他:すべてデフォルト
- 以下を入力して「次の手順:ターゲットの登録」を押下
- ターゲットグループ:デフォルト(新しいターゲットグループ)
- 名前:helloworld-targetgroup
- ターゲットの種類:Lambda 関数
- ヘルスチェック パス:デフォルト(/)
- ヘルスチェックの詳細設定:すべてデフォルト
- 以下を入力して「次の手順:確認」を押下
- Lambda 関数 - リストから Lambda 関数を選択するか、関数を作成します:チェック
- 関数リスト:helloworld
- バージョン:チェック
- バージョンリスト:デフォルト($LATEST)
- 「作成」を押下
- 「閉じる」を押下
- 状態が「provisioning」の間、何度か右上の更新アイコンを押して「active」に変わるのを待つ (2~3分)
- 説明タブの「DNS名」をコピー (右端のアイコンでコピー可能)
動作確認
ブラウザで http://<コピーしたDNS名>/ にアクセス
- 投稿日:2019-05-26T22:22:16+09:00
AWS Sysops 試験に失敗した話(2019年5月)
あまりにも悲しかったのでみなさまへの共有も含め、初投稿します。
著者の知識レベル
Linucレベル3持ってます。
AWSソリューションアーキテクト持ってます。今回AWS Sysopsの受験を通して感じたこと
AWSソリューションアーキテクトを9割以上取れる知識があってもそれようの対策を講じなければ落ちるということ
その反省点を是非色々な方に生かしてほしいのでこの記事を書きます。
その1 AWSソリューションアーキテクトの知識があれば余裕というのは運が良く受かっただけの意見(本当に頑張った方はすみません)
試験を受けての感想は、これは全くの別試験だと思われます。
そもそも前提がソリューションアーキテクトの知識がしっかりあれば大丈夫という噂を耳にし、試験に軽い気持ちで挑戦しました。
旧試験のころとは出題範囲全然違うので気をつけてください。
その2 調べれば調べるほどジャンルの違うテスト
ソリューションアーキテクトはそれぞれのサービスの役目を全体的に俯瞰して覚えて、組み合わせてベストプラクティスに沿った構成にできているかを問う試験です。
Sysopsは運用者の視点に立った資格なので、セキュリティレポートの作成や診断の仕方、CloudFormationを用いた自動化の方法、S3をとことん掘り下げる問題。Trusted Advisorを用いた運用、などなど分野が完全に違います。
上記を踏まえこれから学習する方へのアドバイス
実際に運用経験が長期間ある方は別ですが短期間で努力し独学で臨む方も多いと思います。
その方達にまず伝えたいのは、しっかりSysopsの分野に特化した準備をすることです!ソリューションアーキテクトの知識がいくらあってもこの試験は受かりません!!というわけでこの資格をこれから取る方に向けアドバイスとして学習した方が良い分野を送れたらと思います。
<学習が特に必要な分野>
・AWS Trusted Advisorの深い知識
・CloudFormationの深い知識
・セキュリティレポートの作成方法
・AWS Artifactとはなにか
・タグによるリソースの管理
・S3の深い理解(バージョニング時の削除方法など)
・CostExplorerなど請求周りの理解
・脆弱性チェックの深い理解
・CloudWatchの理解
・IAMの組織アカウントに関する深い理解
・CLIのコマンド実行時のエラーへの対処方法(InsufficientErrorなど)この辺が特にマストになると思います。
Sysopsの情報は非常に少ないので、これから学習される方の少しでも助けになれたらと思います。
私も来月再受験頑張ります。
- 投稿日:2019-05-26T22:06:44+09:00
heroku+railsでs3にsitemapを置く
目的
herokuだとsitemapを置けないためs3に置き、そこから読み込みをgoogleにさせる。
仕様概要
- sitemapgeneratorでsitemapを作成
- aws-sdkでs3に保存
- sitemap専用のルーティングを作ってそれをsearchconsoleに送信
- robots.txtにもsitemapの場所を記載
aws-sdkでs3に保存
sitemap.rbにsitemapの置き場所を記載
sitemap.rbSitemapGenerator::Sitemap.default_host = "" SitemapGenerator::Sitemap.sitemaps_host = "https://s3-ap-northeast-1.amazonaws.com/#{ENV['S3_BUCKET_NAME']}" SitemapGenerator::Sitemap.adapter = SitemapGenerator::AwsSdkAdapter.new( ENV['S3_BUCKET_NAME'], aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], aws_region: 'ap-northeast-1' ) SitemapGenerator::Sitemap.create do # '/articles/:id' を追加する Post.find_each do |post| add post_path(post), :lastmod => post.updated_at end enddefault_hostでwebsiteのURLを登録。sitemaps_hostでsitemapのURLを登録する。
herokuに環境変数登録
$ heroku config:add S3_BUCKET_NAME=bucket_name $ heroku config:add AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx $ heroku config:add AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxlocalはdotenvで環境変数登録
gemのdotenvを入れて環境変数の登録
sitemap専用のルーティングを作る
get '/sitemap' => redirect('https://s3-ap-northeast-1.amazonaws.com/sitename/sitemap.xml.gz')robots.txtにsitemapの場所を記述
robots.txtSitemap: https://sitename/sitemap
- 投稿日:2019-05-26T21:37:07+09:00
AWS CloudFormationでEC2を構築
はじめに
最近AWSを始めたので、勉強がてらCloudFormationを用いてEC2の構築を行いました。
CloudFormationについて
CloudFormationはAWS内のインフラリソースを自動でプロビジョニングできるサービスです。
プロビジョニングしたいAWSリソースをコード(テンプレート)として記述し、目的のインフラ(スタック)を構築するというのがCloudFormationの流れになります。
(プロビジョニング : ネットワークやコンピューターリソースを準備すること)
参考:https://aws.amazon.com/jp/cloudformation/features/インフラ構成図
インフラ構成は非常に単純で下図にようになります。
VPCは東京リージョンに作成し、パブリックサブネットはap-northeast-1aに作成しています。
EC2へのアクセスは指定した固定IPからのSSH, HTTPアクセスのみ許可しています。
EC2から外部へのアクセスは全て許可しています。テンプレート記述の基本構文
テンプレートはJSONまたはYAML形式で記述することができ、今回はYAML形式で記述しています。
テンプレートの基本構文は以下のようになります。# テンプレート形式のバージョン AWSTemplateFormatVersion: # テンプレートに関する記述 Description: # 入力パラメータ Parameters: # 構築するリソースの記述 Resources: # 出力パラメータ Outputs:AWSTemplateFormatVersion
CloudFormationのテンプレート形式のバージョンで、2010-09-09が現時点での最新バージョンです。
2010-09-09が最新Description
テンプレートの内容に関する記述です。
Parameters
記述したリソースに対し、パラメータを入力値として与えたい場合に記述します。
ここに記述したパラメータはテンプレートからスタックを作成する際に入力値として与えることになります。Resources
構築したいAWSのリソースを記述します。
Outputs
ここに記述したパラメータはスタックの作成が終わったときに出力値として得られます。
リソース記述の基本構文
# リソースの論理名 (ResourceName): # リソースタイプ Type: # リソースのプロパティ Properties:リソースの論理名
テンプレート内でのリソース名を記述します。
Type
リソースのタイプを指定します。
リソースタイプの参考:
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.htmlProperties
リソースのプロパティを指定します。
テンプレート解説
AWSTemplateFormatVersion: "2010-09-09" Description: Provision EC2テンプレートファイルの始めに形式のバージョンとテンプレート内容を記述しています。
Parameters: KeyName: Description: The EC2 Key Pair to allow SSH access to the instance Type: "AWS::EC2::KeyPair::KeyName" MyIP: Description: IP address allowed to access EC2 Type: String次に、EC2へのアクセスのキーペア名とアクセス可能なIPアドレスを入力パラメータとして設定しています。このように記述することで、テンプレートファイル内にキーペア名、IPアドレスを直接書く必要がなくなります。
Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: vpc-cf IGW: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: igw-cf # IGWをVPCにアタッチ AttachGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref IGWここからResourcesの記述になります。
まず記述内容は順にVPCの作成、インターネットゲートウェイ(IGW)の作成、IGWをVPCにアタッチとなります。
リソースのTags属性でNameタグを作成しています。
またAttachGatewayのプロパティVpcId, InternetGatewayIdにはそれぞれVPC, IGWのIDを指定する必要があるのですが、テンプレートの組み込み関数Refを用いることでリソースの論理名からIDを取得しています。
!Refは組み込み関数Refの短縮表記です。
組み込み関数Refについて:
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.htmlPubSub: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1a VpcId: !Ref VPC CidrBlock: 10.0.1.0/24 Tags: - Key: Name Value: pub-sub-a-cf PubSubRT: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: pub-sub-a-rt-cf # PubSub-インターネット間のルーティング PubSubToInternet: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PubSubRT DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref IGW # ルートテーブルをサブネットに関連付け AssoPubSubRT: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PubSub RouteTableId: !Ref PubSubRT次はパブリックサブネットの作成です。
1番目のリソースで先ほど作成したVPC内にサブネットを作成しています。
2番目以降のリソースではそれぞれ、ルーティングテーブルの作成、パブリックサブネット-インターネット間のルートの作成、ルートテーブルのパブリックサブネットへの関連付けを行っています。EC2: Type: AWS::EC2::Instance Properties: ImageId: ami-00d101850e971728d KeyName: !Ref KeyName InstanceType: t2.micro NetworkInterfaces: - AssociatePublicIpAddress: "true" DeviceIndex: "0" SubnetId: !Ref PubSub GroupSet: - !Ref EC2SG UserData: !Base64 | #!/bin/bash sudo yum install -y git Tags: - Key: Name Value: ec2-a-cf次にEC2インスタンスの作成です。
EC2のAMIにはAmazon linux2を選択しています。今回は東京リージョンを選択していますが、リージョンが変わるとAMIのIDも変わるので、適宜変更する必要があります。テンプレート構文のMappingを使うことでリージョンについて条件判定を行った上で適切なAMIのIDを記述できるようです。
Mappingの利用:
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html
(ページ中程)EC2にはパブリックIPを自動で割り振ります。
その場合ネットワークインターフェースはデバイスインデックスが0である必要があるのでNetworkInterfaces下の設定を行っています。
EC2のパブリックIP自動割り振りについて:
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.htmlUserDataに記述した内容はインスタンスの作成時に実行されるので、プログラムのインストールなど初期設定を行うことができます。
何もしないのは寂しいのでgitをインストールしています。
UserData属性にはBase64エンコードされたテキストを渡す必要があるので、組み込み関数!Base64を使用しています。
(!Base64は入力文字列のBase64表現を返します。)EC2SG: Type: AWS::EC2::SecurityGroup Properties: GroupName: ec2-sg-cf GroupDescription: Allow SSH and HTTP access only MyIP VpcId: !Ref VPC SecurityGroupIngress: # http - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP # ssh - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref MyIP次にEC2インスタンスのセキュリティーブループを記述しています。
自分のIPアドレスからのみHTTP, SSH接続を許可しています。Outputs: EC2PublicIP: Value: !GetAtt EC2.PublicIp Description: Public IP of EC2 instance最後に出力パラメータを記述しています。
スタックの作成
AWSにログインし、サービスメニューからCloudFormationのページに移ります。
次にCloudFormationページ内の"スタックの作成"ボタンをクリックすると次のような画面に移ります。
テンプレートの選択項目のテンプレートをAmazon S3にアップロードを選択し、テンプレートファイルを選択して次へをクリックします。
詳細指定の画面に移ります。テンプレートファイルのParametersに記述したパラメータをここで指定することができます。
次のページはタグやアクセス権限のページです。必要ならば入力して次の確認ページに進み、問題がなければ作成ボタンをクリックします。
スタックの作成画面に移ります。作成に多少時間がかかりますが、正常に完了すると状態の項目にCREATE_COMPLETEと表示されます。
また、下の出力タブ内にテンプレートのOutputsに記述したEC2のパブリックIPが表示されていることがわかります。
指定したIPでSSHで接続を行うことで設定どおりスタックが作成されていることが確認できます。終わりに
- テンプレートファイルのParametersやOutputsで入力パラメータや出力パラメータを設定できるのは非常に便利でした。いろいろと有効活用ができそう。
- サブネットのルーティングの設定の部分はややコードが煩雑になってしまったので、もっと良い記述方法を探していきたいと思います。
- 構築したスタック内のリソースを一括で削除できるのはすごく楽です。
参考
AWS CloudFormation公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html
- 投稿日:2019-05-26T21:02:26+09:00
AWS WorkMailでユーザーを削除する方法
AWS WorkMailでは、コンソール上からユーザを削除することができない。
「Disable User」はあるものの、あくまで無効化するためのもので、永久に残り続けてしまう。手順
AWS CLIのインストールと設定
インストールは以下参照。
AWS CLI のインストールと設定インストール後の設定は以下参照。
AWS CLI の設定AWS CLIでdelete-userコマンドの実行
まず、delete-userコマンドを実行するために、削除するユーザのIDが必要なため、「list-users」コマンドでユーザIDを取得する。
list-usersコマンドの詳細は以下参照。
list-users ー AWS CLI 1.16.166 Command Reference$ aws workmail list-users --organization-id [コンソールの"Organization settings"で表示されている、Organization ID] { "Users": [ { "DisplayName": "xxxxxxxx", "Name": "xxx", "Email": "xxxxxxx@xxxxxx.xxxx", "State": "ENABLED", "EnabledDate": 1547190663.095, "UserRole": "USER", "Id": "00000-0000-000000-000000-0000000" }, { "State": "DISABLED", "Id": "000000-0000000-000000-00000-00000000", "UserRole": "SYSTEM_USER", "Name": "Administrator" } ] }そして、取得したユーザIDを指定して、delete-userコマンドを実行。
delete-userコマンドの詳細は以下参照。
delete-user ー AWS CLI 1.16.166 Command Reference$ aws workmail delete-user --organization-id [コンソールの"Organization settings"で表示されている、Organization ID] --user-id 00000-0000-000000-000000-0000000これでコンソール上からユーザが削除できるはずです。
(ただし、list-usersコマンドで見ると、ずっと残り続けるようです。。)
- 投稿日:2019-05-26T20:28:45+09:00
CodeBuildのSlack通知をTerraformでサクッと設定する
最近CodeBuildを利用し始めたのですが、CircleCI等のようにはサクッとSlack通知ができないのを少しもどかしく感じました。ビルドの状態がSlack上で楽に把握できないと、コンソールを見に行ってしまったり思考リソースを奪われてしまいますよね。
そこでよし通知をしようと思っても、まさにこれというTerraform Moduleがなかったのでmoduleを作ってみました。
en30/codebuild-to-slack/aws | Terraform Module Registry
これを利用するとCodeBuild上での以下のイベントを簡単にSlack通知できます。
IN_PROGRESS
: 開始SUCCEEDED
: 成功FAILED
: 失敗FAULT
: AWS側が原因での失敗?TIMED_OUT
: タイムアウトSTOPPED
: 中止使い方
main.tfvariable "encrypted_slack_webhook_url" {} resource "aws_kms_key" "slack_webhook_url" { description = "Key for Slack Webhook URL" } module "codebuild_notification" { source = "en30/codebuild-to-slack/aws" version = "0.0.1" encrypted_slack_webhook_url = "${var.encrypted_slack_webhook_url}" slack_channel = "#app" kms_key_arn = "${aws_kms_key.slack_webhook_url.arn}" }
encrypted_slack_webhook_url
は以下のようにAWS CLIを使うことで得ることができます。$ aws kms encrypt --key-id $AWS_KMS_KEY_ID --plaintext $SLACK_WEBHOOK_URL --query CiphertextBlob --output text
$AWS_KMS_KEY_ID
はmoduleへkms_key_arn
として渡しているkeyのid、$SLACK_WEBHOOK_URL
はSlackのIncoming WebhookのURLです。上の例のようにキーもTerraformで作ろうとすると
aws_kms_key
の作成(terraofmr apply
①)- キーを利用してwebhook urlを暗号化
- moduleを利用した通知設置(
terraofrm apply
②)と
terraform apply
で一発でいけないのが気持ち悪いところですが、よろしければ使ってみてください!中身の簡単な説明
やっていることとしては
- CodeBuildのビルド状態が変化に関するCloudWatch EventでLambdaを起動
- Lambdaでイベント情報を整形してSlack通知
です。LambdaにRuby Runtimeも入ったことですし、僕はRubyが好きなのでLambdaはRubyで書きました。
それほど面白いところがあるわけではないですが、Lambdaのデプロイをシンプルに済ますために、標準ライブラリ、Lambdaの環境に元々入っている
aws-sdk
だけで済ますようにしています。notify_slack.rbrequire "uri" require "net/http" require "json" require "base64" require "aws-sdk" COLORS = { "SUCCEEDED" => "good", "FAILED" => "danger", "FAULT" => "danger", "TIMED_OUT" => "danger", "STOPPED" => "warning", }.freeze def decrypt(encrypted_url) client = Aws::KMS::Client.new client.decrypt(ciphertext_blob: Base64.decode64(encrypted_url)).plaintext end def build_url(region, project, slug) region, project, slug = [region, project, slug].map(&URI.method(:encode_www_form_component)) "https://#{region}.console.aws.amazon.com/codesuite/codebuild/projects/#{project}/build/#{slug}/log" end def format(event) # rubocop:disable Metrics/MethodLength project = event["detail"]["project-name"] status = event["detail"]["build-status"] slug = event["detail"]["build-id"].split("/").last { attachments: [ { color: COLORS[status], title: slug, title_link: build_url(event["region"], project, slug), fallback: status, fields: [ { title: "Status", value: status, short: true, }, { title: "Initiator", value: event["detail"]["additional-information"]["initiator"], short: true, }, ], }, ], } end def notify_slack(slack_url, payload) Net::HTTP.post_form(URI.parse(slack_url), payload: JSON.dump(payload)) end def lambda_handler(event:, context:) slack_url = decrypt(ENV["ENCRYPTED_SLACK_WEBHOOK_URL"]) payload = { channel: ENV["SLACK_CHANNEL"], username: ENV["SLACK_USERNAME"], icon_emoji: ENV["SLACK_EMOJI"], }.merge(format(event)) notify_slack(slack_url, payload) end以上です。
AWSもTerraformも使い始めて日が浅いので、何か少しでも気になる部分があれば気軽にコメントやIssue作成をお願いします。
参考
- 投稿日:2019-05-26T19:18:51+09:00
AWSのGPU環境でスタイル変換をやってみた
■ 検証環境(AWS)
- リージョン:米国東部(バージニア北部):
- AMI:Deep Learning AMI (Ubuntu) Version 23.0 - ami-0bc213dc857866046
- インスタンス:p2.xlarge(NVIDIA K80 GPU)
- ストレージ:100 GB(汎用SSD(gp2))
■ 環境設定
- Deep Learning AMIには深層学習フレームワーク等が事前にインストールされているため,ユーザによる設定は不要
- ⇒フレームワークを選択することで使用可能になる
- 今回はTensorFlow(python2系)を利用する
$ source activate tensorflow_p27■ スタイル変換の動作検証
STEP.1 モデル作成
- 不足パッケージの導入
$ pip install moviepy
- ソースコードのダウンロード
$ git clone https://github.com/lengstrom/fast-style-transfer.git $ cd fast-style-transfer/
- 学習用イメージのダウンロード
- data/train2014に保存される
$ ./setup.sh
- モデル作成
- styleはexampleフォルダ内のthe_scream.jpgを使用
- 計算時間は7時間程度
$ python style.py --style example/style/the_scream.jpg \ --train-path data/train2014 \ --checkpoint-dir checkpoint/ \ --test examples/content/chicago.jpg \ --test-dir examples/content
- 出力ファイル:
- checkpoint
- fns.ckpt.index
- fns.ckpt.meta
- fns.ckpt.data-00000-of-00001
STEP.2 スタイル変換
- STEP.1で計算したモデルを使用して変換処理を実施
$ python evaluate.py --checkpoint-dir checkpoint --in-path input.jpg --out-path output.jpg
- 動画を変換する場合は以下を実施
$ python transform_video.py --checkpoint-dir checkpoint --in-path input.mp4 --out-path output.mp4
- 学習済みモデルは以下から取得可能
- 計算時は数秒
■ スタイル変換結果(参考)
- 投稿日:2019-05-26T19:18:51+09:00
AWSのGPU環境でスタイル変換を試してみた
■ 検証環境(AWS)
- リージョン:米国東部(バージニア北部):
- AMI:Deep Learning AMI (Ubuntu) Version 23.0 - ami-0bc213dc857866046
- インスタンス:p2.xlarge(NVIDIA K80 GPU)
- ストレージ:100 GB(汎用SSD(gp2))
■ 環境設定
- Deep Learning AMIには深層学習フレームワーク等が事前にインストールされているため,ユーザによる設定は不要
- ⇒フレームワークを選択することで使用可能になる
- 今回はTensorFlow(python2系)を利用
$ source activate tensorflow_p27■ スタイル変換の動作検証
〇STEP.1 モデル作成
- 不足パッケージの導入
$ pip install moviepy
- ソースコードのダウンロード
$ git clone https://github.com/lengstrom/fast-style-transfer.git $ cd fast-style-transfer/
- 学習用イメージのダウンロード
- data/train2014に保存される
$ ./setup.sh
- モデル作成
- styleはexampleフォルダ内のthe_scream.jpgを使用
- 計算時間は7時間程度
$ python style.py --style example/style/the_scream.jpg \ --train-path data/train2014 \ --checkpoint-dir checkpoint/ \ --test examples/content/chicago.jpg \ --test-dir examples/content
- 出力ファイル:
- checkpoint
- fns.ckpt.index
- fns.ckpt.meta
- fns.ckpt.data-00000-of-00001
〇 STEP.2 スタイル変換
- STEP.1で計算したモデルを使用して変換処理を実施
$ python evaluate.py --checkpoint-dir checkpoint --in-path input.jpg --out-path output.jpg
- 動画を変換する場合は以下を実施
$ python transform_video.py --checkpoint-dir checkpoint --in-path input.mp4 --out-path output.mp4
- 学習済みモデルは以下から取得することもできる
- 計算時間は数秒程度
- 変換処理は非GPU環境でも実施可能
■ スタイル変換結果
- 投稿日:2019-05-26T11:48:49+09:00
Amazon DeepRacerの学習と実際の走行を動画にまとめた【勉強会:DeepRacerハンズオン&走行会の記録】
DeepRacerハンズオン&走行会
IoTラボ様主催の「DeepRacerハンズオン&走行会」
- AWS DeepRacerについて知り、実際に走らせる会です -
https://iotlab.connpass.com/event/128169/こちらに19年5月25日に参加しました。
そのときの記録を7分ほどの動画にまとめました。
twitterの動画は2分ほどしか表示できないです。
7分のフル動画はこちらから見れます。
https://youtu.be/Tt_Raj5bbRo以下。
アマゾンの自動運転AIを学ぶための
— すぐる (@Neuro_educator) 2019年5月26日
カメラ付きラジコンカー「DeepRacer」の勉強会
(IoTラボ様主催)に参加しました。
そのときの記録を7分ほどの動画にまとめました。
twitterに入りきらないので7分動画はこちらhttps://t.co/smOpcXkV1Z pic.twitter.com/g1IcZ1kE9Z7分のフル動画
https://youtu.be/Tt_Raj5bbRoとても勉強になり、楽しいハンズオンでした。
IoTラボ様、ありがとうございました!
- 投稿日:2019-05-26T11:48:49+09:00
(動画にまとめた)AWS DeepRacerの学習と実際の走行【勉強会:DeepRacerハンズオン&走行会の記録】
DeepRacerハンズオン&走行会
IoTラボ様主催の「DeepRacerハンズオン&走行会」
- AWS DeepRacerについて知り、実際に走らせる会です -
https://iotlab.connpass.com/event/128169/こちらに19年5月25日に参加しました。
そのときの記録を7分ほどの動画にまとめました。
twitterの動画は2分ほどしか表示できないです。
7分のフル動画はこちらから見れます。
https://youtu.be/Tt_Raj5bbRo以下。
アマゾンの自動運転AIを学ぶための
— すぐる (@Neuro_educator) 2019年5月26日
カメラ付きラジコンカー「DeepRacer」の勉強会
(IoTラボ様主催)に参加しました。
そのときの記録を7分ほどの動画にまとめました。
twitterに入りきらないので7分動画はこちらhttps://t.co/smOpcXkV1Z pic.twitter.com/g1IcZ1kE9Z7分のフル動画
https://youtu.be/Tt_Raj5bbRoとても勉強になり、楽しいハンズオンでした。
IoTラボ様、ありがとうございました!
- 投稿日:2019-05-26T11:20:43+09:00
sbtでビルドしたDockerイメージをECRにプッシュする方法
sbt-native-packagerとsbt-ecrを使って、ビルド→ECRログイン→ECRへのプッシュまで行います。
https://github.com/sbt/sbt-native-packager
https://github.com/sbilinski/sbt-ecrECRを作成する
レジストリを作る。作成後 以下のようなURIが取得できます。
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/j5ik2o/thread-weaver-api-server
sbtプラグインの設定の設定
project/plugins.sbt
// ... addSbtPlugin("com.mintbeans" % "sbt-ecr" % "0.14.1") addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.10") // ...build.sbtの設定
repositoryName
は、上記で得られたURIのホスト名を除く文字列(j5ik2o/thread-weaver-api-server
)を指定することimport com.amazonaws.regions.{Region, Regions} val ecrSettings = Seq( region in Ecr := Region.getRegion(Regions.AP_NORTHEAST_1), repositoryName in Ecr := "j5ik2o/thread-weaver-api-server", repositoryTags in Ecr ++= Seq(version.value), // タグを付ける場合は指定する localDockerImage in Ecr := "j5ik2o/" + (packageName in Docker).value + ":" + (version in Docker).value, push in Ecr := ((push in Ecr) dependsOn (publishLocal in Docker, login in Ecr)).value ) val `api-server` = (project in file("api-server")) .enablePlugins(AshScriptPlugin, JavaAgent, EcrPlugin) .settings(baseSettings) .settings(ecrSettings) .settings( name = "thread-weaver-api-server", dockerBaseImage := "adoptopenjdk/openjdk8:x86_64-alpine-jdk8u191-b12", maintainer in Docker := "Junichi Kato <j5ik2o@gmail.com>", dockerUpdateLatest := true, dockerUsername := Some("j5ik2o"), bashScriptExtraDefines ++= Seq( "addJava -Xms${JVM_HEAP_MIN:-1024m}", "addJava -Xmx${JVM_HEAP_MAX:-1024m}", "addJava -XX:MaxMetaspaceSize=${JVM_META_MAX:-512M}", "addJava ${JVM_GC_OPTIONS:--XX:+UseG1GC}", "addJava -Dconfig.resource=${CONFIG_RESOURCE:-application.conf}" ), // ... )実行
profileを使う場合は以下のようにする
$ AWS_DEFAULT_PROFILE=xxxxx sbt api-server/ecr:push
- 投稿日:2019-05-26T09:50:14+09:00
BOX!!LivE!! 伊藤 vs ヘリングライブ
HQ--LivE!! 伊藤 vs ヘリングライブ,,
- 投稿日:2019-05-26T09:47:21+09:00
EC2のディスク拡張
はじめに
ついついデフォルトの8GBで環境を作ってしまって後悔しませんか?Dockerを使いだすとゴミイメージなどでどんどん容量を圧迫していきます。
という事で何回もやっているのでメモしておきます。
現在の使用容量の確認
dfコマンドで容量確認を行います。
df -h
8GBしかありませんね...。残り1.2GBでキチキチです(お掃除後の容量です)。
$ df -h Filesystem Size Used Avail Use% Mounted on ... /dev/xvda1 7.7G 6.5G 1.2G 85% / ...AWSコンソールよりEBSを拡張します。
ちょっと省略
ディスク容量の確認をおこないます。
メインパーティションは8GBのままですが、全体は16GBに拡張できました。
$lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 16G 0 disk └─xvda1 202:1 0 8G 0 part /パーティション拡張を行います
sudo growpart /dev/xvda 1
xvda1の領域の拡張を行います。これで16GBに拡張が完了しました。
が、まだ全体を使うことはできません。$ sudo growpart /dev/xvda 1 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 16G 0 disk └─xvda1 202:1 0 16G 0 part /ファイルシステムのリサイズ
sudo resize2fs /dev/xvda1
ファイルシステムのリサイズを行います。これで全体が使えるようになりました。
$ sudo resize2fs /dev/xvda1 resize2fs 1.42.13 (17-May-2015) Filesystem at /dev/xvda1 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 1 The filesystem on /dev/xvda1 is now 4194043 (4k) blocks long.拡張後の容量の確認
念の為dfコマンドで容量を確認します。
$ df -h Filesystem Size Used Avail Use% Mounted on ... /dev/xvda1 16G 6.5G 9.0G 43% / ...まとめ
ついつい容量を小さくとってしまいますがこれで安心ですね!