20190526のAWSに関する記事は13件です。

ALB+LambdaでHello WorldなWebアプリ

Lambda関数作成

  1. コンソールを開く → https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1
  2. 「サービスを検索する」で「lambda」を検索して移動 → https://ap-northeast-3.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/begin
  3. 「関数の作成」を押下
  4. 以下を入力して「関数の作成」を押下
    1. 一から作成:デフォルト(チェック)
    2. 関数名:helloworld
    3. ランタイム:デフォルト(Node.js 10.x) ★実案件ではJavaとしたい
    4. 実行ロール:デフォルト(基本的なLambdaアクセス権限で新しいロールを作成)
  5. 表示されているコードを以下の内容に変更して画面上部の「保存」を押下
exports.handler = async(event) => {
    return {
        statusCode: 200,
        headers: {
            'Content-Type': 'text/html'
        },
        body: 'Hello World'
    };
};

Application Load Balancer(ALB)作成

  1. コンソールを開く → https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1
  2. 「サービスを検索する」で「EC2」を検索して移動 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Home:
  3. 左メニューから「ロードバランサー」を探して移動 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers:sort=loadBalancerName
  4. 「ロードバランサーの作成」を押下 → https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SelectCreateELBWizard:
  5. 「Application Load Balancer」の「作成」を押下
  6. 以下を入力して「次の手順:セキュリティ設定の構成」を押下
    1. 名前:helloworld-alb
    2. スキーム:デフォルト(インターネット向け)
    3. IPアドレスタイプ:デフォルト(ipv4)
    4. ロードバランサーのプロトコル:デフォルト(HTTP、80)
    5. VPN:デフォルト
    6. アベイラビリティーゾーン:2つチェック
    7. タグ:デフォルト(なし)
  7. 「次の手順:セキュリティグループの設定」を押下
  8. 以下を入力して「次の手順:ルーティングの設定」を押下
    1. セキュリティグループの割り当て:新しいセキュリティグループを作成する
    2. その他:すべてデフォルト
  9. 以下を入力して「次の手順:ターゲットの登録」を押下
    1. ターゲットグループ:デフォルト(新しいターゲットグループ)
    2. 名前:helloworld-targetgroup
    3. ターゲットの種類:Lambda 関数
    4. ヘルスチェック パス:デフォルト(/)
    5. ヘルスチェックの詳細設定:すべてデフォルト
  10. 以下を入力して「次の手順:確認」を押下
    1. Lambda 関数 - リストから Lambda 関数を選択するか、関数を作成します:チェック
    2. 関数リスト:helloworld
    3. バージョン:チェック
    4. バージョンリスト:デフォルト($LATEST)
  11. 「作成」を押下
  12. 「閉じる」を押下
  13. 状態が「provisioning」の間、何度か右上の更新アイコンを押して「active」に変わるのを待つ (2~3分)
  14. 説明タブの「DNS名」をコピー (右端のアイコンでコピー可能)

動作確認

ブラウザで http://<コピーしたDNS名>/ にアクセス

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

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の情報は非常に少ないので、これから学習される方の少しでも助けになれたらと思います。

私も来月再受験頑張ります。

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

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.rb
SitemapGenerator::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
end

default_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=xxxxxxxxxxxxxxxxxx

localはdotenvで環境変数登録

gemのdotenvを入れて環境変数の登録

sitemap専用のルーティングを作る

get '/sitemap' => redirect('https://s3-ap-northeast-1.amazonaws.com/sitename/sitemap.xml.gz')

robots.txtにsitemapの場所を記述

robots.txt
Sitemap: https://sitename/sitemap
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.html

Properties

リソースのプロパティを指定します。

テンプレート解説

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.html

  PubSub:
    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.html

UserDataに記述した内容はインスタンスの作成時に実行されるので、プログラムのインストールなど初期設定を行うことができます。
何もしないのは寂しいので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ページ内の"スタックの作成"ボタンをクリックすると次のような画面に移ります。
スクリーンショット 2019-05-26 19.00.46ーテンプ選択.png
テンプレートの選択項目のテンプレートをAmazon S3にアップロードを選択し、テンプレートファイルを選択して次へをクリックします。

スクリーンショット 2019-05-26 19.00.46ーテ<img width=
詳細指定の画面に移ります。テンプレートファイルのParametersに記述したパラメータをここで指定することができます。
次のページはタグやアクセス権限のページです。必要ならば入力して次の確認ページに進み、問題がなければ作成ボタンをクリックします。

スクリーンショット 2019-05-26 19.11.03ー作成済み.png
スタックの作成画面に移ります。作成に多少時間がかかりますが、正常に完了すると状態の項目にCREATE_COMPLETEと表示されます。
また、下の出力タブ内にテンプレートのOutputsに記述したEC2のパブリックIPが表示されていることがわかります。
指定したIPでSSHで接続を行うことで設定どおりスタックが作成されていることが確認できます。

終わりに

  • テンプレートファイルのParametersやOutputsで入力パラメータや出力パラメータを設定できるのは非常に便利でした。いろいろと有効活用ができそう。
  • サブネットのルーティングの設定の部分はややコードが煩雑になってしまったので、もっと良い記述方法を探していきたいと思います。
  • 構築したスタック内のリソースを一括で削除できるのはすごく楽です。

参考

AWS CloudFormation公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html

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

AWS WorkMailでユーザーを削除する方法

AWS WorkMailでは、コンソール上からユーザを削除することができない。
「Disable User」はあるものの、あくまで無効化するためのもので、永久に残り続けてしまう。

1.png

手順

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コマンドで見ると、ずっと残り続けるようです。。)

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

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.tf
variable "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で作ろうとすると

  1. aws_kms_keyの作成(terraofmr apply①)
  2. キーを利用してwebhook urlを暗号化
  3. moduleを利用した通知設置(terraofrm apply②)

terraform applyで一発でいけないのが気持ち悪いところですが、よろしければ使ってみてください!

中身の簡単な説明

やっていることとしては

  • CodeBuildのビルド状態が変化に関するCloudWatch EventでLambdaを起動
  • Lambdaでイベント情報を整形してSlack通知

です。LambdaにRuby Runtimeも入ったことですし、僕はRubyが好きなのでLambdaはRubyで書きました。

それほど面白いところがあるわけではないですが、Lambdaのデプロイをシンプルに済ますために、標準ライブラリ、Lambdaの環境に元々入っているaws-sdkだけで済ますようにしています。

notify_slack.rb
require "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作成をお願いします。

参考

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

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

■ スタイル変換結果(参考)

sample1.jpg
sample2.jpg
sample3.jpg
sample4.jpg
sample5.jpg
sample6.jpg

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

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

■ スタイル変換結果

  • 元画像:
    • image.jpg

  • スタイル変換後:
    • sample1.jpg sample2.jpg
    • sample3.jpg sample4.jpg
    • sample5.jpg sample6.jpg
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

以下。

7分のフル動画
https://youtu.be/Tt_Raj5bbRo

とても勉強になり、楽しいハンズオンでした。
IoTラボ様、ありがとうございました!

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

(動画にまとめた)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

以下。

7分のフル動画
https://youtu.be/Tt_Raj5bbRo

とても勉強になり、楽しいハンズオンでした。
IoTラボ様、ありがとうございました!

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

sbtでビルドしたDockerイメージをECRにプッシュする方法

sbt-native-packagerとsbt-ecrを使って、ビルド→ECRログイン→ECRへのプッシュまで行います。

https://github.com/sbt/sbt-native-packager
https://github.com/sbilinski/sbt-ecr

ECRを作成する

レジストリを作る。作成後 以下のような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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

BOX!!LivE!! 伊藤 vs ヘリングライブ

HQ--LivE!! 伊藤 vs ヘリングライブ,,

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

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% /
...

まとめ

ついつい容量を小さくとってしまいますがこれで安心ですね!

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