20200325のAWSに関する記事は19件です。

AWS Kinesis data streams とiOSの連携に苦しんだので、記事化しておきたい

 はじめに

この記事は筆者がiOSとAWSの連携をしていたときに苦しんだため書いたものである。筆者の備忘録的な意味合いもあるため、わかりずらさがあったらすいません。

  • 苦しんだ理由
  1. Kinesis data streams との関連記事がなんか古い(2015年とか)けどとりあえず実装してみるかという甘い考えでいた。
  2. swift Jsonなどの知識不足

 実際起こった問題

AWSKinesis iOSでググると2015年の記事がいっぱい出てくる、それを実装しても曖昧な関数なので、ダメです!とかいうエラーが出てよくわかんない

 完成形のコード

  • 前提条件
    cocoapods,AWSCore,AWSKinesis,AWSCognitoはimportで宣言済み

    let kinesisRecorder = AWSKinesisRecorder.default()
    let jsonStr = """{\"hogehoge\": \"hogehoge\",\"mobile_timestamp\": \"2016-03-16 01:40:12\",\"hogehoge\": \"hogehoge\",\"hogehoge\": \"hogehoge\",\"hogehoge\": \"hogehogehoge\",\"hogehoge\": \"hogehoge\"}"""
    
    let yourData = jsonStr.data(using: .utf8)
    kinesisRecorder.saveRecord(yourData, streamName: "your stream name")   
    kinesisRecorder.submitAllRecords()
    

ざっくりと見てみる

一行目 kinesisを使うためのレコーダー宣言
二行目 Jsonの定義
三行目 utf8でのエンコード
四行目 作成したストリームを指定して、宛先を指定
五行目 送信

これだけでデータを送れると
ただ、"""を使用してjsonを無理やり文字列にしているのがいただけない・・・

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

AWS Security Hub のセキュリティ標準チェックが自動で有効化される条件

※ 2020/3/25 時点の挙動を元に記載しているため、今後変更される可能性があります

Security Hubを有効化する方法によって挙動が異なる

AWS CLI や AWS SDK など EnableSecurityHub API を使用して Security Hubを有効化した場合、
CIS AWS Foundations Benchmark のセキュリティ標準チェックも自動で有効化されます。
2020/2/13 から利用可能になった PCI DSS のセキュリティ標準チェックは有効化されないため
利用者が明示的に有効化する必要があります。
以下の API リファレンスにも記載があります。

AWS Security Hub > API Reference > EnableSecurityHub
https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_EnableSecurityHub.html

When you use the EnableSecurityHub operation to enable Security Hub, you also automatically enable the CIS AWS Foundations standard. You do not enable the Payment Card Industry Data Security Standard (PCI DSS) standard.

一方、CloudFormation で Security Hubを有効化する場合、CIS AWS Foundations Benchmarkの
セキュリティ標準チェックは自動で有効化されません。

以前は CloudFormationで有効化した際もCISのチェックが有効化されていましたが、
どこかのタイミングでこのような挙動に変わっています。
PCIDSSのチェックが追加になった前後かなと予想はしていますが、ドキュメントには特に記載がありません。

問題となるケース

上記のような動作の違いにより、CIS AWS Foundations Benchmark のセキュリティ標準チェックを
有効化したつもりが有効になっていなかった、または機能を使う予定がないのに自動的に有効化されている
ということが起こる可能性があります。

また、現状 CloudFormation では Security Hub の対応リソースが限られており、
AWS::SecurityHub::Hub(Security Hub 自体の有効化)のみ可能です。
セキュリティ標準チェックの有効/無効化に対応していないため、
CloudFormation 以外の操作が必要になります。(リソースの拡充に期待!)

SecurityHub Resource Type Reference
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_SecurityHub.html

以降、おまけ

AWS Security Hubとは

AWS Security Hub は AWS環境全体のセキュリティとコンプライアンスの状況を確認可能なサービスです。

https://aws.amazon.com/jp/security-hub/

Security Hub のセキュリティ標準機能を利用すると、サポートされているルールセットに対して
自動的かつ継続的なチェックを行うことができます。
2020年3月現在は以下の2つのルールセットがサポートされています。

  • CIS AWS Foundations Benchmark v1.2.0
  • PCI DSS v3.2.1 image.png

セキュリティ標準機能は、以前コンプライアンス標準機能と呼ばれていました。
日本語のコンソールでは コンプライアンス標準のままになっていますが、近いうちに
修正されるかと思います。

CloudFormationのテンプレート例

AWSTemplateFormatVersion: "2010-09-09"
Description: Example Hub with Tags
Resources:
  ExampleHubWithTags:
    Type: 'AWS::SecurityHub::Hub'
    Properties:
      Tags:
        key1: value1
        key2: value2
Outputs:
  HubArn:
    Value: !Ref ExampleHubWithTags

ただし前述のとおり、上記のテンプレートで Security Hub を有効化しても
CIS AWS Foundations Benchmark のセキュリティ標準チェックは有効化されないため
他の方法で明示的に有効化する必要があります。

AWS SDK(boto3) で有効化する例

AWS Lambda で全リージョンのSecurity Hubを有効化することを想定した例です。
この例ではCIS AWS Foundations Benchmark のセキュリティ標準チェックも自動で有効化されます。

lambda_function.py
from logging import getLogger, INFO
import sys
import boto3
from botocore.exceptions import ClientError

logger = getLogger()
logger.setLevel(INFO)

def get_client(service, region, credentials=None):
    """Returns the client for the specified region"""
    if credentials is None:
        client = boto3.client(service, region_name=region)
    else:
        client = boto3.client(
            service,
            region_name=region,
            aws_access_key_id=credentials['AccessKeyId'],
            aws_secret_access_key=credentials['SecretAccessKey'],
            aws_session_token=credentials['SessionToken']
        )
    return client

def get_region_list():
    """Return Available Region List"""
    ec2 = get_client('ec2', 'us-east-1')
    available_regions = map(lambda x: x['RegionName'], ec2.describe_regions()['Regions'])
    return available_regions

def lambda_handler(event, context):
    available_regions = get_region_list()
    logger.info("Enable Security Hub All Regions Start.")
    for region in available_regions:
        securityhub = get_client('securityhub', region)
        # Enalbe Security Hub
        try:
            securityhub.enable_security_hub()
        except ClientError as err:
            logger.error(
                "Enalbe Security Hub Request failed in %s: %s",
                region, err.response['Error']['Message']
            )
            sys.exit(1)
        logger.info("Enabled Security Hub in %s", region)
    logger.info("Successfully enabled Security Hub for all regions.")

Boto3 Docs
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/securityhub.html#SecurityHub.Client.enable_security_hub

以上です。
参考になれば幸いです。

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

2019年度の AWS What's New を集計してみた

結果

aws_whats_new_FY2019.png
image.png

概要

  • What's New のアーカイブから 2019/4/1~2020/3/20 のアップデートを取得(Python の Beautiful Soup を利用)
  • 件名から、えいやでサービスを分類するロジックを組んで集計(機械学習とかおしゃれなことをするほどのモチベーションはなかったです)
    • AWSさん、アップデート情報にタグ付けして・・・

所感

  • サービス別集計で上位5位までは「まぁ、そーよねー」という感じだが、6位とか7位に FSx とか SSM が出てきたのは意外だった
  • 週別件数を見ると、週30~40件出るのが普通なので、追いつき続けるには工夫が必要だなーと改めて実感
    • 私は社内で週次の勉強会を運営して強制的に習慣化
  • とりあえず、AWSさん!!アップデート情報にタグ付けお願いします!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実務未経験】AWS認定ソリューションアーキテクト - アソシエイト(新バージョンSAA-C02)合格体験記

はじめに

実務未経験の研究開発エンジニアがAWS認定ソリューションアーキテクト - アソシエイトに合格したので振り返りの記事です。
土日勉強して月曜に受験したいと考えていたら、意図せず新バージョン公開当日(2020年3月23日)に受験することとなりました…
新バージョンについては、まだ対応した教材が発売されていないと思うので(確認はしておりません…)、既存の教材で勉強している方の参考になれば嬉しいです。

受験時の知識レベル

  • IT系研究開発エンジニア
  • 基本情報技術者・応用情報技術者・AWS認定クラウドプラクティショナー取得済み
  • AWS経験
    • 冗長構成でWordPressブログを立ち上げるハンズオンを経験
    • 独学でAPI Gateway・Lambda・RDSを用いたAPIを構築
    • Architecting on AWSを受講
    • 実務は未経験
  • ネットワーク知識は上記IPA試験の勉強のみ
  • オンプレミスのインフラ知識なし
  • Web系の知識は広く浅く…

受験の経緯

まずはじめに業務を通して社会価値を高められるスキルが身についていない危機感を抱いている最中、上司から自社ではあまり取り組めないかも知れないけれども、今後確実にAWSを知らないとやっていけない時代が来る(すでに来ているのかもしれませんが…)から勉強しておいた方がいいとの後押しがあってAWS認定試験の受験を決意しました。

実務未経験の不安から手始めにクラウドプラクティショナーを12月に受験・合格。
手応えを感じたので、勢いそのままに今月3月にソリューションアソシエイトの受験に至りました。

使用した教材

ひたすら以下2つの教材を繰り返し勉強していました。

学習順序

  1. クラウドプラクティショナー合格まで
    1. 約3か月かけてUdemyを1周
    2. 途中から並行しながら黒本を1か月ほどで1周
    3. 冗長構成でWordPressブログを立ち上げるハンズオンを経験
    4. 試験前の1週間で黒本の2周目を完了
  2. クラウドプラクティショナー合格からソリューションアーキテクト - アソシエイト合格まで
    1. 約2か月かけてUdemyの2周目
    2. 並行しながら黒本を1か月ほどで3周目
    3. 試験前の1週間でUdemyの3周目
    4. Architecting on AWSを受講
    5. 試験当日に不安な部分を黒本で流し読み

教材利用の詳細

これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(初心者向け22時間完全コース)

オンライン学習サイトUdemyでベストセラーとなっているこちらの講座。
クラウドプラクティショナー受験前にハンズオンも含めて講座部分を1周しました。
模試も含まれているのですが、クラウドプラクティショナー受験時は難易度が違いすぎたため、一通り解くだけ解いて解説すら読まずに終了。

実務未経験の部分はこちらのハンズオンで少しはカバーできたかと。
ただ、順番にそってクリックしたりするだけではなかなか身に付いた実感がなかったので、途中から何のために操作を行うのか理解することに重点を置きながら学習を進めました。
理解は深まりましたが、学習効率は落ちました。

ソリューションアーキテクト - アソシエイト試験に向けた2周目・3周目は手を動かすことよりも理解することに重きを置きました。
2周目はハンズオンも自分で実際に行うことはせず、講義と同様聞いて理解することに集中。
3周目はハンズオン部分を飛ばして、繰り返し説明を理解することで知識の定着を図りました。

小テストや模試は100%になるまで繰り返し受験しました。
このおかげでかなり知識を定着させる事ができたと実感しています。

徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書

こちらの黒本は説明に古い部分がある上に、内容も若干浅い気がしますが、動画ではふとした疑問に対する振り返りを行いにくかったので、その点ではとても役立ちました。
クラウドプラクティショナー受験時に主に利用していたのですが、ソリューションアーキテクト - アソシエイトの試験には内容不足の部分が多いように思えたので、こちらに向けて重点的に使わなくて正解でした。

AWS Well-Architected フレームワークの括りで章立てされており、得た知識をまとめるには良い構成でした。
Udemyと並行して学習を進めることで、同じ内容でも若干の説明の違いがあり、より理解が深まりやすかったと感じております。

(ダウンロード可能な模試は行わなかったので感想は記載できません。)

結果

試験の結果は満点1000点・合格点720点で753点とギリギリ合格でした。
受験中も知らない単語がいくつか出てきていて不安だったので、点数と手応えの乖離はないかと思います。

知らない単語が出てきたと書きましたが、これが試験のバージョンアップによるものなのか、単なる勉強不足なのかはわかりませんが、とりあえず上記の教材では補いきれていない部分はあったと思います。

反省点

  • だらだらと長期間勉強せず、2か月・3か月程度の短期でクラウドプラクティショナー・ソリューションアーキテクト - アソシエイトの2種類を取得すべきだった
  • 苦手と実感している部分とスコアは合致していたので、苦手を潰すよう努力すべきだった

クラウドプラクティショナー・ソリューションアーキテクト - アソシエイトの2種類を誰もが取る必要があるかと言われると、そうではないかと思います。
ただ、受験すること自体も含め、試験に慣れるという意味でも自分のレベルよりも低いところからチャレンジした方が安心かもしれません。

苦手分野は実際の試験最中もあやふやな部分が多かったので、しっかり確認すべきだったと猛省しました…

まとめ

新バージョンの試験を公開当日に受けてきましたが、とりあえず従来の教材でも実務未経験で合格ラインまで届くことは可能でした。
ただ、やはり網羅できていない部分もあるので、合格する可能性を上げるためにも今後出てくる教材・更新された教材を利用した方がいいかもしれません。

個人的には上司の理解があったために受けることができた『Architecting on AWS』がとても役立ちました。
ちょっと高額なので「全員受けたほうがいい!」とはとても言えませんが、会社から支援していただけるようであれば受講することをおすすめします。

なんとか合格したものの、知識不足を実感しているので、合格に慢心せずに引き続き勉強していければと思います。

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

Nuxt.jsをServerlessでデプロイするにあたってぶつかった4つの壁

概要

今回の内容は下記の技術解説記事になります。
爆速でLambda@edgeにNuxt.jsを構築できるテンプレートを作った

AWSへのデプロイを自動化

今回デプロイ作業を自動化するにあたって下記の2種類候補がありました。
1. Serverless Frameworkを使う方法
2. Serverless Componentsを使う方法

開発初期段階ではServerless Frameworkを使っていたのですが、
とある理由でServerless Componentsを使う方針に切り替えました。

なぜServerless Componentsに切り替えたのか

まず1つ目の大きな理由ですが、serverless.ymlを書くのが面倒すぎる!!!!!!!
ちょっとしたLambdaをデプロイするだけならまだマシですが、
CloudFrontやS3を絡めた少し複雑な環境になるとserverless.ymlの内容がめちゃくちゃ長文になり、
見通しも悪すぎて何を書いてるか分からなくなってきます。

それに比べてServerless Componentsymlの代わりにjsを使って
プログラマティックに記述出来るので、ものすごくメンテナンスがしやすいです。

あと.envAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを記述するだけでデプロイ実行出来るのも地味に便利です。

ただ1つだけServerless Componentsにも欠点があります。
ドキュメントが少なすぎる!!!!!!!!
日本語の解説記事もですが、英語での解説記事も殆どありません。
僕はServerlessのレポジトリに上がっている物を参考に今回のテンプレを作成しました。

Lambda@EdgeへExpressをデプロイする方法

今回はこちらの記事で紹介されているaws-serverless-express-edgeを使用しました。

しかし、いざデプロイして見るとhostHeader.startsWith is not a functionというエラーが出てレスポンスが返ってきません。
エラーが出ている箇所のコードを見ると、CloudFrontからのリクエストからHeaderを取り出す方法が間違っていました。
AWSのドキュメントを見てみるとheadersの中身が下記のような構造になっています。

"user-agent": [{
  "key": "User-Agent",
  "value": "curl/7.66.0"
}]

上記の形式に合わせて修正した物がこちらになります。
aws-serverless-express-edgeはもうメンテナンスされていないようだったので、今回はフォークして該当箇所を修正しました。

デプロイ速度の改善

デプロイで一番時間の掛かる部分はnode_moduleの更新です。
本番環境で使用しない物は出来るだけdevDependenciesに追いやるのがベストですが、
本来であればbuildModulesで使用するライブラリはdevDependenciesに入れるべきなのですが、Lambda実行時にエラーが出てしまします。
Nuxt.jsをExpressの上に乗せて動かしている事による弊害です。

対処

今回はローカルで実行するコマンドに対して、IS_LOCAL=trueというenvをセットするようにし、
nuxt.config.tsに下記の関数を定義する事により対処しました。

nuxt.config.ts
function requireBuildModule(module: string): string {
  return process.env.IS_LOCAL === 'true' ? module : '';
}

使用方法は下記の通りです。

nuxt.config.ts
buildModules: [
  // Doc: https://github.com/nuxt/typescript
  requireBuildModule('@nuxt/typescript-build'),
  // Doc: https://axios.nuxtjs.org/usage
  requireBuildModule('@nuxtjs/axios'),
  // Doc: https://github.com/nuxt-community/dotenv-module
  requireBuildModule('@nuxtjs/dotenv'),
  // Doc: https://tailwindcss.com/
  requireBuildModule('@nuxtjs/tailwindcss'),
  // Doc: https://pwa.nuxtjs.org
  requireBuildModule('@nuxtjs/pwa'),
  // Doc: https://github.com/Developmint/nuxt-webfontloader
  requireBuildModule('nuxt-webfontloader'),
].filter(Boolean),

Lambdaから実行する際にはIS_LOCALが定義されていないので、上記のbuildModuleは全て空文字の配列になります。
そのまま空文字を残したままにしてしまうとエラーが出てしまうので、最後にfilter(Boolean)で空文字を消しています。
これによりLambdaから実行する際にはbuildModuleは読み込まれなくなる為、依存ライブラリをほぼ全てdevDependenciesへ移行することが可能になります。

Build時にModuleもBundleするように変更する

Nuxt.jsはビルド時にassetsやら.vueファイルやらがBundleされて出力されますが、
moduleに定義されている物はBundle対象から除外されます。
例) @nuxtjs/tailwindcss等

その為、ビルド自体は成功するのですが実際にデプロイするとどこかしらでエラーが出てしまいます。

対処

実はドキュメントにも記載されていない、実際にNuxt.jsのソースコードを見ないと気づかない隠し設定が存在します。

nuxt.config.ts
build: {
  standalone: true,
  extend (config: WebpackConfiguration, ctx: any) {
  },
},

上記のstandalone: trueを追記する事により、ビルド時にmoduleに定義されている物も一緒にBundleされるようになります。
これ気づくのに結構時間掛かりました。tailwindcss諦めようかと思ってたくらい

まとめ

軽い気持ちでテンプレ作ろうと思ったらめちゃくちゃ時間掛かった
つらい

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

AWS CLIで現在作業中のアカウント情報を確認する方法

AWS CLIで現在作業中のアカウント情報を確認する方法を備忘録的に書いていきます。

JSON形式で情報取得する

GetCallerIdentityというものがあるらしく、これを使うことでJSON形式で情報を取得することができます。

$ aws sts get-caller-identity

{
    "Account": "123456789012",
    "UserId": "AIDAXXXXXXXXXXXXXXXXX",
    "Arn": "arn:aws:iam::123456789012:user/user_name"
}

特定の情報だけを取得する

特定の情報だけを取得したい場合はqueryオプションなどを使って取得することができます。(outputオプションを使ってるのはダブルコーテーションを省くためです)

$ aws sts get-caller-identity --query 'Account' --output text

ユーザー名だけを取得する

ユーザー名だけを取得したい場合は、色々な方法があると思いますがawkコマンドを使って下記のように書くことができると思います。

$ aws sts get-caller-identity --query 'Arn' | awk '{ print substr($1, index($1, "/")) }' | awk '{ sub("/", ""); sub("\"", ""); print }'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

warning: already initialized constant Rack::Utils::ParameterTypeError などのrack utils のエラーの解決例

1.どんなエラー?

デプロイをしたときにユニコーンのバージョンがローカルとずれてしまい、ユニコーンをダウングレードしたときにでたエラーで、連動して動けなくなってしまったgemを表示したものでした

スクリーンショット 2020-03-25 14.58.37.png
スクリーンショット 2020-03-25 14.58.52.png
スクリーンショット 2020-03-25 14.58.58.png

2.解決方法

unicornの指定のバージョンを新しいものに変え(筆者はそのまま本番環境が新しいものになっていたためそのまま)、RAILS_SERV_STATIC_FILE=1 bundle exec unicorn_rails -c config/unicorn.rb -E production -Dとすることで、おそらくこのエラーは解消しました。

もう少し深掘りするとbundle execをつけることで初期設定でbundle installで更新されないgemが更新されるため、このエラー文は解決できたと思われます。

また、bundle update -defaultすれば直るという記事がいくつか見受けられるのですが、筆者はこれでなかなか苦労したのでupdateコマンドは慎重に行われた方が良いと思います

3.注意事項

筆者の場合はこのエラーを解決してもその他のエラーが残り、cssが当たらず引き続き試行錯誤を行なっているため、根本的な解決になっているかは不明なのであくまで参考程度にしていただければと思います。
もしかするとこの方法は、「動いていた頃のデータを使う」というその場しのぎの方法かもしれないため、うまくいったときでも最新のものが本番環境に反映されているか再度ご確認ください。

4.後日談(エラー解決しました)

この方法であっていました。そのほかはnginxとunicorn.rbのpathミスを修正したら直りました

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

CloudFrontのx-edge-request-idをAPI側に渡す方法

概要

データを分析するにあたってエッジロケーションからのリクエスト単位で集計をしたく、CloudFrontのログに出力されているx-edge-request-idを使用するという事になった

x-edge-request-idはレスポンスヘッダではx-amz-cf-idとして出力されるのでてっきりOriginにもx-amz-cf-idに同じ値が格納されていると思っていた
しかし検証した結果、OriginでCloudFrontからのリクエストを受け取った際にx-amz-cf-idはあるにはあるが
ヘッダに格納されているx-amz-cf-idの値がx-edge-request-idとは異なる値になっていた

これを解消するために調査した結果を記しておく

結論

Lambda@EdgeをOrigin Requestに設置し、リクエストを中継する
Originに渡されるx-amz-cf-idがx-edge-request-idと同じになる

Lambda@Edgeのサンプルコード

event.py
import json

def lambda_handler(event, context):
    # TODO implement
    print('####lambda edge start###')
    print('####event###')
    print(event)
    print('####lambda edge end###')
    print('####context###')
    print(context)
    cf_request = event['Records'][0]['cf']['request']    
    return cf_request

その他

他の方法としてはOrigin RequestのLambda@Edgeで別のヘッダにrequestId(x-edge-request-idのLambda@Edgeのkey)をコピーする方法がある

なんでこんな挙動なのかは諸事情によりAWSの技術サポートに聞くことができず、知ってる人いたら教えてください

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

【メモ】Amazon Linux 2 でDjangoを動かす

OSを最新の状態にする

$ sudo yum update -y

pythonを入れる

pythonに必要な物を入れる

$ sudo yum install git gcc zlib-devel libffi-devel bzip2-devel readline-devel openssl-devel sqlite-devel

pyenvを入れる

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

パスを通す

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ exec "$SHELL" -l

pyenvで入れれるpythonの最新バーションを調べる

$ pyenv install --list

最新のバージョンのpythonを入れる

$ pyenv install 3.8.1

インストールしたpythonをデフォルトで使うようにする

$ python -V
Python 2.7.16
$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.8.1
$ pyenv global 3.8.1
$ pyenv versions
  system
* 3.8.1 (set by /home/ec2-user/.pyenv/version)
$ pyenv rehash
$ python -V
Python 3.8.1

Djangoを入れる

pyenvで入れたパッケージにpipもはいっているので、pip本体をアップグレードしてから、Djangoをインストール

$ pip install --upgrade pip
$ pip install Django Pillow

ディレクトリを作ってその中にDjangoプロジェクトを作成

$ cd /var/www
$ mkdir django
$ django-admin startproject config .

DB

MySQLをインストール

$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
$ yum install mysql-community-server
$ mysqld --version
mysqld  Ver 5.7.29 for Linux on x86_64 (MySQL Community Server (GPL))

DB接続

Djangoはmysqlclientを推奨。PyMySQLはなるべく使わない。

$ sudo yum install mysql-devel
$ pip install mysqlclient

接続の確認

$ python manage.py dbshell
# 本番用の設定ファイルを使う
$ python manage.py dbshell --settings=config.settings.production

gunicorn

$ pip install gunicorn

gunicornを使ってDjangoを起動してみる

$ gunicorn config.wsgi --bind=[プライベートIP]
# 本番用の設定ファイルを使う
$ gunicorn config.wsgi --bind=[プライベートIP] --env DJANGO_SETTINGS_MODULE=config.settings.production

nginx

$ sudo amazon-linux-extras install nginx1.12 -y
$ sudo cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.back
$ sudo systemctl start nginx.service
# 自動起動
$ sudo systemctl enable nginx.service
$ systemctl is-enabled nginx.service
enabled
$ sudo vim /etc/nginx/conf.d/django.conf
server {
    listen  80;
    server_name [パブリックIP や elb やドメイン];

    location /static {
        alias /var/www/manage/static;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
$ gunicorn config.wsgi --daemon --bind 127.0.0.1:8000
$ gunicorn config.wsgi --daemon --bind 127.0.0.1:8000 --env DJANGO_SETTINGS_MODULE=config.settings.production

確認できたらプロセスをkill

$ sudo lsof -i:8000
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gunicorn 13502 ec2-user    5u  IPv4  68558      0t0  TCP [プライベートIP].ap-northeast-1.compute.internal:irdmi (LISTEN)
gunicorn 13504 ec2-user    5u  IPv4  68558      0t0  TCP ip-[プライベートIP].ap-northeast-1.compute.internal:irdmi (LISTEN)
$ sudo kill -9  13502 13504

systemctlコマンド登録

sudo vim /etc/systemd/system/project.service
[Unit]
Description=gunicorn
After=network.target

[Service]
WorkingDirectory=/var/www/django
ExecStart=/home/ec2-user/.pyenv/shims/gunicorn --bind 127.0.0.1:8000 config.wsgi:application --env DJANGO_SETTINGS_MODULE=config.settings.production

[Install]
WantedBy=multi-user.target

参考

https://narito.ninja/blog/detail/21/

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

AWS Amplify Consoleを使ってReactアプリのCICD環境を10分で作る

はじめに

AWS Amplify Consoleを使うと、Reactアプリなどのフロントエンドアプリを簡単にデプロイできるCICD環境が作れます。驚くほど簡単で早いです。
AWS S3 + CloudFrontでReactアプリをHTTPS公開するための正しい構成」や「AWS Codepipelineを使ってReactアプリのCI環境をゼロから作る」で作ってきた環境を数ステップ、10分以内で作成できます。また、リポジトリのブランチに合わせて環境を簡単に作っていくことができるのも非常に便利です。ただし、制約もあります(Amplifyの制約)。

作成するもの

Amplifyを使って、GitHubにpushしたコードを、自動的にCloudFront+S3環境にビルドしデプロイする環境です。CloudFrontやS3はAmplifyが内部的に使います(個人のアカウントには現れません)。
Amplify.png

事前準備

手順

AWS Amplify Consoleの設定

  1. AWS管理コンソールにログインし、AWS Amplifyの画面に移動
  2. 「Deploy With the Amplify Console」の下の「GET STARTED」ボタンを押す(もしくは「アプリの作成」ボタンを押す)
  3. 「From your existing code」でGitHubにチェックを入れ「Continue」ボタンを押す
  4. GitHubの認証を行う
  5. GitHubリポジトリ、ブランチを選択し、「次へ」ボタンを押す
  6. 「ビルド設定の追加」で「アプリの名前」を任意で付け、「ビルドの設定」で「Edit」ボタンを押し、Reactivesearchのインストール定義を入れて「Save」ボタンを押し(下「ビルドの設定でのamplify.yml内容」参照)、「次へ」ボタンを押す
  7. 内容を確認し「保存してデプロイ」ボタンを押す
  8. 初回の環境構築、ビルド、デプロイが走るので検証がOKになるまで待つ
  9. 環境にアクセスし動作しているか確認する(https://master.xxxxx.amplifyapp.com/ のようなURL)
  10. また、「検証」をクリックすると検証タブで、さまざまなデバイスでどう見えるかについても確認可能

ビルドの設定でのamplify.yml内容例

Reactivesearchモジュールを含めてビルドします。

amplify.yml
version: 0.1
frontend:
  phases:
    install:
      commands:
        - npm install @appbaseio/reactivesearch
    preBuild:
      commands:
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: build
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*

独自URLの設定

  1. AWS管理コンソールのAWS Amplifyの画面に移動
  2. 左ペインを開き、該当アプリのリンクをクリックする
  3. 左ペインの「アプリの設定」にある「ドメイン管理」をクリックする
  4. 「カスタムドメインの追加」ボタンを押す
  5. 「ドメイン」欄でRoute53に登録されているドメイン名がリストされるので該当のドメインを選び、「ドメインの検索」ボタンを押す
  6. ドメインのルートを使いたくない場合は「Exclude root」ボタンを押してルートをグレーアウトし、サブドメイン名に独自URLとして付けたい名前を入れ(ここではcityrank)、「保存」ボタンを押す
  7. Route53設定やサーバ証明書設定が自動で行われ、独自URLでアプリが公開される

これだけです。

Amplifyの制約

Amplifyのアプリ公開環境は、Amplifyが内部的に用意します。マニュアル上はCloudFront + S3環境を使っているように読めますが(QuickStart)、自分のアカウントのCloudFrontやS3ではないため、CloudFrontやS3への追加の設定ができません。
そのため、現時点では、たとえば、CloudFrontにAWS WAFの機能を付けられません。また、CloudFrontが持っているモニタリングツールで監視することもできません。公開環境へのアクセスログは、CloudFront相当のものが取得できますが、管理コンソールから確認およびダウンロードできるものの、AWS CLIではダウンロードできません。
CICD環境としても、ブランチごとの設定などはできますが、CodePipelineで設定できるような細かいパイプラインの設定はできません。基本的にはブランチごとにGitHubのWeb HookなどをトリガーにCodebuildでビルドしてデプロイするのみとなります。

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

Amazon SES経由のバウンスメールをWebアプリで受け取る

こんにちは、MYLOPSのエンジニアの後河内です。
当社では、WEBアプリのメールサービスにAmazon SESを利用することが多いです。
以前、こちらに、Amazon SESとPostfixの連携でハマったポイントといった記事も書きました。

さて、今回ですが、CakePHP2で作成したWEBアプリでSES経由でメール送っていたのですが、その際にバウンスメールになったものをWEBアプリ側で受け取りその結果を管理者画面に表示できないかという相談を受け調査しましたので、その調査結果などをまとめていきたい思います。

SESからのメールのバウンスをWEBアプリで扱うにはどうしたらいいのか調べたところ、Amazon SNS(Amazon Simple Notification Service とは)を利用すれば実現できそうなことがわかりました。

まずSES側の設定でバウンス(Bounce)や苦情(Complaint)など、SNSのトピックを設定することができます。(Amazon SNS の Amazon SES 通知の設定

image.png

バウンス情報を設定したEメールに通知する

SNSですがトピックのサブスクリプションで通知方法や通知先を設定できます。
通知方法ですか例えばEメールといった設定ができます。

image.png

Eメールを設定した場合、バウンスメールがあると以下のようなメールがバウンスメールの送り先に送られてきます。

{"notificationType":"Bounce","bounce":
{"bounceType":"Permanent","bounceSubType":"General","bouncedRecipients":
[{"emailAddress":"bounce@simulator.amazonses.com","action":"failed",
"status":"5.1.1","diagnosticCode":"smtp; 550 5.1.1 user unknown"}],
"timestamp":"2020-02-26T11:53:43.465Z","feedbackId":"0000000-00000-000-0000-000-000000-000000",
"remoteMtaIp":"X.XX.XXX.XXX","reportingMTA":"dsn; a48-37.smtp-out.amazonses.com"},
"mail":{"timestamp":"2020-02-26T11:53:42.000Z","source":"info@hogehoge.jp",
"sourceArn":"arn:aws:ses:us-east-1:0000000000000:identity/hogehoge.jp",
"sourceIp":"XX.XXX.XXX.XXX","sendingAccountId":"0000000000",
"messageId":"0000000-000000-000000-000000-000000-000000","destination":["bounce@simulator.amazonses.com"]}}

"emailAddress":"bounce@simulator.amazonses.com"

上記の部分がバウンスメールが戻ってきたメールアドレスになります

ちなみに今回バウンスメールのテストに使ったアドレスですが、AWSが準備しているバウンステストのメールアドレスを利用してます。(Amazon SES での E メール送信のテスト - Amazon Simple Email Service

SNSを利用すればバウンスメールになったメールアドレス情報を特定のメールアドレスに送るといったことは非常に簡単にできました。
ただし今回の要件は、WEBアプリの画面に表示する必要がありました。
SNSの送信方式を探したところ、SNSのサブスクリプションにはEメール以外に、https(http)に情報をPOSTするといった機能もありましたのでこちらを利用することにしました。

SNSでバウンス情報をPOSTする

バウンス情報をPOSTするには、SNSのサブスクリプトの登録で、プロトコルにHTTPSを選び、エンドポイントにPOST先のURLを設定するだけでした。

image.png

POSTされたバウンス情報を受け取る

POSTされたバウンス情報は当初は以下のようなPHPのコードで受け取りを考えました。

$postData = file_get_contents('php://input');
$data = json_decode($postData);

CakePHP2を利用せずに、PHPのみでコーディングした場合は受け取りができたのですが、CakePHPのコントローラに上記のコードを書いても受け取りすることができませんでした。
受け取ったデータの中身を調べてみても空(NULL)となってしまいました。

CakePHP2でREST API

CakePHP2でPOSTされた情報の受け取り方を調査したところCakePHP2でREST APIを実装すればPOSTしたデータを受け取ることができそうでした。

REST設定に参考にしたページ

実装方法ですがroutes.phpに以下の実装を追加しました。

routes.php
Router::mapResources('hogehogeapis');
Router::parseExtensions();

そしてコントローラー(POSTされた情報を扱うコントローラ)に以下の部分を追加しました。

hogehogeapisController.php
public function beforeFilter()
{
$this->response->header('Access-Control-Allow-Origin: *');
$this->response->header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
$this->response->header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    }


if ($this->request->is('post')) {
$data = $this->request->input('json_decode',true);

上記の設定をしたところPOSTされたデータを受け取ることができました。

ちなみにバウンスメール情報が送られるようにするには、一度POST先としてSNSのPOST先としての認証をする必要があります。
認証するには下記の方法でやるようですが、最初にPOSTされたデータの中身を確認し、SubscribeURLに手動でアクセスという形で認証をおこないました。

受信者が HTTP/S エンドポイントの場合のシステム間メッセージングに Amazon SNS を使用する

バウンス情報からメールアドレス部分の抜き出し

HTTPSにPOSTされる形式ですがJSON形式になります。
JSON形式からメールの部分を抜き出すために以下のようなコード追加しました。

hogehogeapisController.php
$data = $this->request->input('json_decode',true);
$bounce=json_decode($data['Message'],true);

$bounce['bounce']['bouncedRecipients'][0]['emailAddress'],true));

ちなみに上記のコードでは受け取ったデータのJSON形式の文字列を配列化してさらに、配列化してます。

このようにすることで、メールアドレスを受け取ることができました。
上記までいけば、DBに格納し管理画面に表示することができそうでした。

今回は調査して機能を実装するにあたっての方針を見つけらました。
実装していく中で新たな問題点等やノウハウが見つかりましたら、別の記事として書いていけたらなと思っております。

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

【初心者向け】AWS Amplify Console + MkDocs で気軽に始める Web サイト公開

はじめに

Amplify Console は、簡単にWeb サイトを公開できるサービスです。MkDocs はMarkdown から HTML を生成する静的サイトジェネレーターです。この記事では、Amplify Console とMkDocs を使って、Markdown の内容をインターネットに公開する方法をチュートリアル形式で紹介します。

対象読者

以下の条件に当てはまる方を想定しています。

  • GitHub にコンテンツを push したら、勝手にインターネット公開までしてくれるような仕組みを知りたい。
  • 独自ドメインでHTTPS 対応のWeb サイトを、インターネット公開したい。
  • 所属しているチームでAWS を使っており、Web サイトもAWS でインターネット公開したい。
  • インターネット公開したWeb サイトに手軽に認証をかけたい。
  • AWS Amplify を勉強するための、取っ掛かりが欲しい。

簡単用語説明

  • Amplify Console

    • AWS のWeb ホスティングサービスです。
    • 同系統の他サービスとしては、Firebase HostingNetlifyGitHub Pages などが挙げられます。
    • AWS のサービスのため、他のAWS サービス ( Route 53 など ) と親和性が高いのが特徴です。
    • AWS マネジメントコンソール ( 以降、AWS M/C と略記 ) から操作できます。
  • MkDocs

    • Python ベースの静的サイトジェネレータです。
    • ざっくり説明すると、Markdown ファイルをHTML ファイルに変換してくれるツールです。
    • 同系統の他サービスとしては、GatsbyHugo などが挙げられます。
    • 設定次第で PlantUML や 数式を表示できる、テーマを変更できるなど、拡張性が高いのが特徴です。

Amplify Console を使ったWeb サイト公開の方法 2つ

  • 1. AWS M/C から使う方法

    • GUI ( AWS M/C ) を利用する方法です。Amplify 初心者向け。
    • 本記事ではこちらの方法のみを紹介します。
  • 2. Amplify CLI から使う方法

    • CUI ( Amplify CLI ) を利用する方法です。1. の方法で Amplify に慣れた方向け。
    • こちらの方法は、また別の記事で紹介するようにします。

1. AWS M/C から Amplify Console を使う方法

章の構成

各節の構成

  • 前提
    • 後段の「操作」を実施するにあたっての前提知識や、用意/登録するべきサービスを紹介しています。
    • 「操作」を実施する前に、ご一読されることをお勧めします。
  • 操作
    • 操作手順を、操作画面やコマンドプロンプトの実行コマンドを交えて紹介しています。
    • 実行コマンドは、基本的に Windows 10 のコマンドプロンプトで実行した結果を表示しています。
  • 結果
    • 「操作」を実施した後に想定される結果を紹介しています。
    • 節の内容に応じて「結果」の後にオプションで項目を追加しています。
    • 例) 「1-5. develop ブランチもデプロイしてみる」の「オプション操作 & 結果」など

1-1. MkDocs のインストール & コンテンツ追加

前提

  • MkDocs はPython 上で動くため、Python のインストールが必要です。
    • Python が動けば、Windows でもMac でも MkDocs が利用できます。
    • 注意!:本記事執筆時点では、MkDocs は Python 3.8 以降をサポートしていません。
    • 私の環境で Python 3.8 を試したときは、MkDocs のインストール自体は成功しましたが、ビルドするときにエラーが出力されて失敗しました。
    • 以下、MkDocs 公式ページの抜粋です。

MkDocs supports Python versions 2.7.9+, 3.4, 3.5, 3.6, 3.7, and pypy.

操作 (Windows コマンドプロンプト)

  • 下記で、MkDocs のインストールまで実施してください。
# Python のバージョン確認
> python --version
Python 3.7.3  # 3.8 より前のバージョンであることを確認

# pip が使えることを確認
> pip --version
pip 20.0.2 from <pip がインストールされているローカルのフォルダ/ディレクトリ> (python 3.7)

# MkDocs のインストール ( 出力結果は長いため省略 )
> pip install mkdocs

# MkDocs がインストールされていることを確認
> mkdocs --version
mkdocs, version 1.0.4 from < MkDocsがインストールされているローカルのフォルダ/ディレクトリ > (Python 3.7)
  • 下記で、MkDocs 新規プロジェクトを作成してください。
> cd project-dir  # 任意のフォルダ
> mkdocs new amplify-project   # MkDocs の新規プロジェクト作成
INFO    -  Creating project directory: amplify-project
INFO    -  Writing config file: amplify-project\mkdocs.yml
INFO    -  Writing initial docs: amplify-project\docs\index.md

> cd amplify-project  # 作成したプロジェクトフォルダ直下に移動
> mkdocs serve    # MkDocsをローカル実行。⇒ ブラウザで「http://127.0.0.1:8000/ 」にアクセスしてMkDocs のサンプルページが表示されれば成功。

結果

  • 上記実行後、ブラウザでhttp://127.0.0.1:8000/にアクセスすると、下記のようにMkDocs のサンプルページが表示されるはずです。 image.png

参考

  • MkDocs のテーマ変更などの作りこみに関しては、MkDocs によるドキュメント作成(Qiita) が参考になりました。
    • MkDocs のインストールからGitHub Pages を使った公開方法まで記載されています。公開するコンテンツの目的/用途によっては、Amplify Console ではなくGitHub Pages を選択した方が良い場合があります。

1-2. Git リポジトリの用意

前提

操作

  • GitHub で下記のように新規リポジトリを作成してください。 (今回はPublic で作成)
    github-newrepository.png

  • 1-1. で作成したMkDocs プロジェクトで、Git の設定をしてください。

> echo "# mkdocs-sample" >> README.md
> git init   # Git 初期化
> git add .  # ステージング
> git commit -m "My first commit"  # コミット
[master (root-commit) bb60ddb] My first commit
 2 files changed, 18 insertions(+)
 create mode 100644 docs/index.md
 create mode 100644 mkdocs.yml

> git remote add origin https://github.com/codesmith/mkdocs-sample.git   # リモートGit リポジトリを指定
> git push -u origin master   # GitHub 上のリモートGit リポジトリに push

結果

  • GitHub のページを更新すると、ローカルで作成したMkDocs プロジェクトフォルダが、GitHub にアップロードされて登録されていることが確認できます。

1-3. Amplify Console の設定

前提

操作

  • AWS M/C ホーム画面から、Amplify サービス画面まで行ってください。 amplifystart.jpg
  • Amplify サービス画面 です。(リージョンは東京リージョンを別案件で既に使用しているため、バージニア北部リージョンを選択しています。)
    amplify-home.jpg

  • Amplify サービス画面で新規アプリを作成してください。( 左上の「」のアイコンから「すべてのアプリ」を選択 )
    image.png

  • 「アプリの作成」を選択します。
    amplify-create.jpg

  • 任意のGit リポジトリ(ここでは1-2. で作成したGitHub リポジトリ)を選択して、「Continue 」を選択します。
    image.png

  • GitHub の認証画面に移動しますので、操作するリポジトリが所属するGitHub アカウントにサインインしてください。
    github-gamen.jpg

  • Amplify によるGitHub リポジトリへのアクセスを許可します。
    github-auth.jpg

  • 再びAmplify サービス画面に移動します。公開するコンテンツのリポジトリとブランチを選択して「次へ」を選択します。
    amplify-repo.jpg

  • Vue.js や React を使っている場合は自動でビルド設定を検出してくれますが、MkDocs では検出されないため、「Edit 」を選択してamplify.ymlを修正します。( 関係ないですけど、ちょっとコメントが面白いですよね。)
    image.png

  • amplify.ymlを、下記に書き換えて「保存」を選択し、その後の画面で「次へ」を選択してください。( ここの設定は後で「ビルドの設定」から変更 / 修正できます。 )

yml(amplify.yml)
version: 0.1
frontend:
  phases:
    preBuild:
      commands:
        - python3 -m pip install --upgrade pip
        - python3 -m pip install pymdown-extensions
        - python3 -m pip install plantuml-markdown
        - python3 -m pip install mkdocs
        - python3 -m pip install mkdocs
        - python3 -m pip install pymdown-extensions
    build:
      commands: 
        - mkdocs build
  artifacts:
    baseDirectory: site
    files:
      - '**/*'
  cache:
    paths: []
  • 確認画面です。「保存してデプロイ」を選択してください。 amplify-save.jpg
  • Amplify サービス画面で新しくアプリが作成されていることを確認してください。( この画面はビルド中のものです。) image.png

結果

  • 「検証」までチェックが付けばデプロイ完了です。URLを選択すると 1-1. の結果と同じ画面が表示されることが確認できます。 image.png
  • このままではAmplify のドメインがユーザーに表示されてしまうため、1-4. で独自ドメインが表示されるように変更します。 amplify-mkdocs.jpg
  • 「Learn how to get the most out of Amplify Console 」のチェックリストの1 つ目にチェックが付きました! image.png
  • 次の節以降では、このチェックリストのチェック項目全てにチェックが付くように順番に説明していき、Amplify Console のマスターを目指します。

1-4. Amplify Consoleからドメイン登録

前提

  • 1-3. まで完了した状態にしてください。
  • 独自ドメインを持っていない方や、Route 53 に登録していない方は下記を参考にして用意してください。

操作

  • Amplify サービス画面から「ドメイン管理」を選択し、「カスタムドメインの追加」を選択してください。 amplify-domain-start.jpg
  • 図のように設定して「保存」を選択してください。 image.png
  • 画面が遷移するので、処理が完了するまで 30 分ほど待ってください。(裏側で ACM 証明書の作成と CloudFront への適用がされていると思われます。どちらも AWS M/C からは存在が確認できません。) image.png

結果

  • 独自ドメインでアクセスできるようになっています。 image.png
  • チェックリストに、2 つ目のチェックが付きました! image.png

1-5. develop ブランチもデプロイしてみる

前提

  • 1-3. まで完了した状態にしてください。( 1-4. は省略して問題ありません。)

操作

  • 下記コマンドを実行してください。(コマンドプロンプト)
# master ブランチを基にしてdevelop ブランチを作成
> git checkout -b develop

# project-dir/docs/index.md を修正。「This is develop branch! 」という文言を追加して保存。

# 変更をステージング & コミット
> git add .
> git commit -m "develop added!"

# develop ブランチをリモートにプッシュ
> git push origin develop -u
  • Amplify サービス画面から「全般」→「ブランチを接続する」を選択してください。 amplify-add-branch.jpg
  • develop ブランチが表示されているので、選択して「次へ」を選択してください。 image.png
  • develop ブランチのデプロイが開始されます。 image.png

結果

  • develop ブランチのリリースが完了しています。
    • develop ブランチと、master ブランチのリリース状況が 1 つの画面の中で見れます。
    • チェックリストの 3 つ目にチェックが付きました! image.png
  • develop ブランチで変更した内容が更新されています。 image.png

オプション操作 & 結果

  • develop ブランチの方も master のように独自ドメインを登録できます。
  • 「ドメイン管理」→「サブドメインの管理」を選択してください。 image.png
  • 「追加」を選択し、develop ブランチ用の行を追加し、「更新」を選択してください。 image.png
  • develop の独自ドメインでアクセスできました! image.png

1-6. develop 用ページにBasic 認証を追加する

前提

  • 1-5. まで完了した状態にしてください。( master ブランチの内容にBasic 認証をかける場合は1-3. 完了までで問題ありません。 )

操作

  • 「アクセスコントロール」→「アクセスの管理」を選択してください。 image.png
  • develop の Access setting を「制限」に変更してユーザー/パスワードを登録し、「Save 」を選択してください。 image.png

結果

  • develop 用のURL にBasic 認証が付きました。 image.png
  • 4 つ目のチェックが付きました!残りあと1 つです!もう少しなので頑張ってください。 image.png

1-7. Preview 機能でプルリクエストを出しているブランチを公開

前提

  • 1-5. まで完了した状態にしてください。( 1-6. は省略して問題ありません。 )

操作

  • 「Preview 」→「Enable Preview 」を選択してください。GitHub App をインストールするように求められるのでインストールしてください。 image.png
  • GitHub App をインストールするリポジトリを選択し、「install 」を選択してください。 github-app.jpg
  • Preview の画面に戻り、develop を選択し「Manage 」を選択、表示されるモーダルの中でEnabled にチェックを付け、「確認」を選択してください。 image.png
  • develop から分岐させたブランチを新たに作り、プルリクを作成してください。 image.png
  • プルリクに応じた環境が作成されていることが確認できます。 kekka.jpg

結果

  • プルリクエストを出したブランチ用のページが公開されています。(Basic 認証などは後から設定しないといけませんでした。)
    kekka-feature.jpg

  • チェックリストはなんと…リストごと削除されました!ヽ(・ω・)/ズコー ( …どうせなら全部チェックが付いた状態で残しておいてほしかった。。)
    image.png

  • この後、GitHub 画面からプルリクエストを承認したところ、Amplify の環境も削除されていました。

操作 & 結果は以上です。

まとめ

  • Amplify Console + MkDocs で、簡単に・( Git を使った ) 継続的な、Web サイト公開の仕組みが作れます。
    • Amplify Console では、独自ドメインの設定や、Basic 認証の設定 が簡単に設定できます。
    • 一回構築が終われば、コンテンツを更新して GitHub に push すれば自動で Web にリリースされます。パイプラインやビルドの環境を用意しなくて良く、とても簡単にコンテンツを更新していくことができます!

最後に

  • Mkdocs と S3/Cloudfront によるドキュメント公開システムの構築 ( Qiita ) で初めてAmplify Console の存在を知り、インスパイアされる形で、今回の Qiita 投稿に至りました。
  • 記事中に出てくるチェックリストの機能以外にも、Amplify Console にはリダイレクトやメール通知・アクセスログ表示など、紹介できなかった機能がたくさんありますので順次記事の内容を充実させていきたいと思います。

  • 私自身、この記事が Qiita での 2 回目の投稿になるのですが、少しずつ Qiita の書き方が分かってきた気がします。以下、気づきです。

    • 画面ショットは必要なところだけ使うようにした方が良いと感じました。たくさん画像を用意してしまったため、貼り付けが地味に大変でした。
    • 文章の中で、半角文字の後ろに半角スペースを置くなどすると読みやすくなるということは知っていましたが、必要に応じて半角文字の前にも半角スペースを置いた方が良いと感じました。とくに半角カッコ () の前後は半角スペースを置かないと、少し見にくいのではないかと思っています。
  • この記事内でお気づきになった点や、修正が必要な記載がありましたら、ご指摘いただけますと幸いです。

  • 最後になりましたが、参照記事を執筆された方々に感謝を申し上げます。ありがとうございました。

以上です。

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

[はじめて]失敗から学んだEC2のセキュリティグループ【接続できない】

概要

はじめてEC2のインスタンスをテンプレートから作成した時に、うっかり設定もれでWebサーバーに接続できなかったときの記録とその原因となったセキュリティグループの説明です。

前提条件

記事内容に関して以下の条件があります。

  • ウェブサーバーはインストールされているものとします。
  • 設定方法、サービスのインストール、開始などのLinuxコマンドは省略します。
  • 技術的に深い内容ではありません。

間違えていた設定内容

以下の設定値でテンプレートからインスタンスの作成をすすめていました。
入門書など読むとテンプレートからインスタンスを作成すればすぐに自分が用意したウェブサーバーにアクセスできるようでしたが、私の場合は接続タイムアウトになってしまいました。

以下が設定内容です。

EC2の起動テンプレートからEC2のインスタンスを作成。()内は設定内容

1.AMI の選択(Amazon Linux 2 AMI (HVM))
2.インスタンスタイプの選択(t2.micro)
3. インスタンスの設定(デフォルトの設定)
4. ストレージの追加(デフォルトの設定、追加なし)
5. タグの追加(必要に応じて今回は一つ。WebSampleと入力)
6. セキュリティグループの設定(デフォルトの設定、追加なし)← ココ! 

セキュリティグループの設定でポートを追加していなかったのが接続できなかった原因です。

セキュリティグループとは

「インスタンスのトラフィックを制御するファイアウォールのルールセットです。」
とインスタンスの作成の「ステップ 6: セキュリティグループの設定」に説明されています。

はい、セキュリティグループとはファイアウォールだったのでした。

さらに「ウェブサーバーをセットアップして、インターネットトラフィックにインスタンスへの到達を許可する場合、HTTP および HTTPS ポートに無制限のアクセス権限を与えます。」
と具体例も記載されています。

なお、デフォルトの設定ではSSHだけ許可されています。
だから何も設定せずSSHでリモート接続できたのかと気づいた次第です。

スクリーンショット (3).png

上記説明の「HTTP および HTTPS ポートに無制限のアクセス権限を与えます。」の具体的な設定は以下の通りです。これでウェブサーバーのルールができました。
設定場所は[EC2 > Security Group]です。

スクリーンショット (5).png

(補足)
HTTPポートは80、HTTPSポートは443です。

このような明示的に許可されていない通信は拒否される仕組みを「ステートフルインスペクション」といいます。
ステートフルインスペクションは、リクエスト元を追跡しリクエストに対する応答が自動的に元のコンピュータに戻るようにできます。

参考

Linux インスタンスの Amazon EC2 セキュリティグループ
セキュリティグループのルールのリファレンス
Amazon VPCのよくある質問

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

【SSH】公開鍵認証とEC2について

はじめに

SSHについての記事はたくさんありますが、どうしてもイメージとして捉えられませんでした。
先日AWSのデプロイを行った際に、RUNTEQの講師の方に説明をしていただいて自分なりに解釈したので書き記しておきます。
なお、これは覚書であって手順書ではないのでご注意ください。実際に行う手順は一部省略しています。

こんな人が読んだら腑に落ちるかもしれない

  • SSHはコピペでなんとかするもの。
  • どうして公開鍵をいろんなところに登録するんだろう。
  • 鍵とか錠とか言うけど、なんか納得できない。

SSH鍵事始め

ローカル
$ cd ~/.ssh
$ ssh-keygen

このコマンドによって、~/.sshディレクトリに(特に指定をしなければ)id_rsaid_rsa.pubが作成される。前者が秘密鍵、後者が公開鍵となる。
公開鍵を外部に登録することはあるが、秘密鍵を登録することはない。というか、秘密鍵が漏れるとやばい。

よく言う鍵と錠の関係

よく、公開鍵は南京錠で秘密鍵はその鍵だと言う。確かに、錠は見せてもいいが鍵は見せてはならないと言うイメージではしっくりくるが、この鍵と錠は一対一の関係ではない。
実際はその南京錠を複製することがよくある。例えば、私はid_rsa.pubをGitHubとEC2インスタンス内に登録している。どちらもid_rsaで開けることができる。
また、一つのドアに複数の南京錠が付いていることもある。例えば、私のGitHubには複数の公開鍵が登録されている。この場合、いずれかの対応する秘密鍵があれば開けることができる。
Untitled Diagram.jpg

EC2に接続するときの手順

EC2インスタンスを作成するときに、新規にキーペアを作成する。(すでに鍵がある場合はそれを使うこともできる)
スクリーンショット 2020-03-23 21.26.02.png
このときにダウンロードしたプライベートキー(pemファイル)を~/.ssh配下に保存しておく。
作成したインスタンスを選択して「接続」ボタンを押すと、手順が表示されるので、基本的にはそれに従えばいい。ありがたいね。
スクリーンショット 2020-03-23 21.40.49.png

SSH認証のエラーいろいろ

せっかくなので手順に従わずいろいろやってみたら、見事に怒られたので紹介する。

"aws-key.pem"を指定しない場合

ローカル
$ cd ~/.ssh
$ ssh ec2-user@18.176.56.238

ec2-user@18.176.56.238: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

特に鍵の指定がない場合は、id_rsaを用いて認証を行う。
id_rsaの公開鍵は登録されていないぞ。アクセスさせるわけにはいかない」

ディレクトリに"aws-key.pem"がない場合

ローカル
$ ssh -i "aws-key.pem" ec2-user@18.176.56.238

Warning: Identity file aws-key.pem not accessible: No such file or directory.
ec2-user@18.176.56.238: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

「そんな名前のファイルもディレクトリも無いぞ。鍵がないから駄目だ」

chmod 400 aws-key.pemしていない場合

ローカル
$ ssh -i "aws-key.pem" ec2-user@18.176.56.238

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'aws-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "aws-key.pem": bad permissions
ec2-user@18.176.56.238: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

「ばっかやろう!その秘密鍵は誰でも見れることになってるじゃないか!そんな鍵は認めないぞ!!」
パーミッションについて

手順に沿った場合

ローカル
$ ssh -i "aws-key.pem" ec2-user@18.176.56.238

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 6 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-11-209 ~]$ sudo yum update

SSH認証に成功した場合、EC2インスタンス内に入ることができ、このように表示される。
Run "sudo yum update" to apply all updates.と言われたので、yumをアップデートしておく。

公開鍵の場所

起動時に、パブリックキーコンテンツは、~/.ssh/authorized_keys内のエントリに配置されます。
Amazon EC2 のキーペア - Amazon Elastic Compute Cloud

ということなので、実際に確認してみる。

インスタンス
[ec2-user@ip-10-0-11-209 ~]$ cd ~/.ssh
[ec2-user@ip-10-0-11-209 .ssh]$ ls
authorized_keys
[ec2-user@ip-10-0-11-209 .ssh]$ cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyZDViLAZcA7F8N8ebO9KlYoKOFC9hlG1y7BB6/R8grwcvKRGVhVCBRrCvLIoijkDfv+NYJnCyPxPb7QWdjQ/apD6FPfdmk9fdunyFRC5IRuFwXW17TUeVnBQwnHmatW/S36ZsDJxiK3O4s+L+WuK8XEriyddEHS1xLZi8+vNaTiSmqhNdPhhP/ocdAE/yWvSQqmdmTL4/HFVqp+Hy4C3v8+sgztj+F2+vpbHMmlb8aArdTMTDKcqPryNtLEN/ib1opqJLv4zhrv7EteqtCeFR6OnQttiAO+32UD0XP2mtj9lzsskCZ1wnNwG38WJbRdgD2mM/Ap8kNx0k/4Tkg7W3 aws-key

authorized_keysaws-key.pemのペアとなるパブリッシュキーが登録されていることがわかる。

EC2インスタンスの中で行う推奨設定

編集用ユーザーを追加する

ec2-userはルートユーザーなので、編集用ユーザーを作成する。

インスタンス
[ec2-user@ip-10-0-11-209 ~]$ sudo useradd username  # usernameは任意の名前
[ec2-user@ip-10-0-11-209 ~]$ sudo passwd username
ユーザー username のパスワードを変更。
新しいパスワード:  # 表示されないが問題ない
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[ec2-user@ip-10-0-11-209 ~]$ sudo visudo  # vimエディタが開くので、usernameの行を追加する。

  ## Allow root to run any commands anywhere
  root      ALL=(ALL)       ALL
  username  ALL=(ALL)       NOPASSWD: ALL

[ec2-user@ip-10-0-11-209 ~]$ su - username  # usernameに切り替える
パスワード:  # 先ほど設定したパスワードを入力
[username@ip-10-0-11-209 ec2-user]$ cd ~/ 

これで、usernameを作成することができた。

自分の公開鍵を登録する

単一のインスタンスにアクセスする複数のユーザーがいる場合、インスタンスにユーザーアカウントを追加できます。(省略)各ユーザー用にキーペアを作成し、インスタンスの各ユーザー用の.ssh/authorized_keysファイルに各キーペアからのパブリックキー情報を追加できます。その後、ユーザーに対してプライベートキーファイルを配布できます。この方法では、AWS アカウントルートユーザー用に使用しているプライベートキーファイル(補足:aws-key.pemのこと)と同一のファイルを複数のユーザーに配布する必要はありません。
Amazon EC2 のキーペア - Amazon Elastic Compute Cloud

インスタンス
[username@ip-10-0-11-209 ~]$ mkdir .ssh
[username@ip-10-0-11-209 ~]$ chmod 700 .ssh
[username@ip-10-0-11-209 ~]$ cd ~/.ssh
[username@ip-10-0-11-209 .ssh]$ touch authorized_keys
[username@ip-10-0-11-209 .ssh]$ chmod 600 authorized_keys

authorized_keyを作成し、このファイルにローカルのid_rsa.pubを記述することで公開鍵情報を登録する。
これで、次回からは$ ssh username@18.176.56.238でインスタンスにアクセスできる。

おわりに

これはSSHについて教えてもらったことを私なりにデフォルメして解釈したものです。
間違っている点や書き落としなどございましたら、是非ご指摘いただければと思います。
また、この記事で作成したEC2インスタンスとキーペアは現在削除済みです。

参考リンク

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

AWS Codepipelineを使ってReactアプリのCI環境をゼロから作る

はじめに

Macローカルで開発しているReactアプリを、git pushすれば自動的にビルドし公開環境へデプロイするCI環境をゼロから作ります。AWS Codepipelineを使い、GitHubと連携させてCodebuildでビルドしS3へデプロイします。

別記事にて紹介するAWS Amplifyを使えば(AWS Amplify Consoleを使ってReactアプリのCICD環境を10分で作る)、より簡単にCICD環境を作ることが可能です。ただしAmplifyにはいくつか制約もあるため、手動でCI環境を作る以下の手順も残します。

作成するもの

次のような環境をAWS上に構築します。

Untitled Diagram.png

事前準備

手順

GitHub環境の準備

GitHubリポジトリの準備

GitHubアカウントを開設し、公開鍵を登録し、リポジトリを作成します。アカウント開設と公開鍵登録までは「GitHubのアカウント登録からリポジトリ操作まで」が参考になります。リンク先はWindows環境ですが、Macだと最初からgitコマンドやssh-keygenコマンドが入っていますのでそれをそのまま使えます。gitを最新バージョンにしたい場合は「最新の Git を Mac にインストールする手順」が参考になります。
新規リポジトリの作成は、リンク先と異なり、Initialize this repository with a READMEのチェックボックスは外して空のリポジトリを作成します。ローカルのMacでcreate-react-appを使って作ったReactソースコードをリポジトリにアップロードするためです。リポジトリ名はここでは「cityrank」として説明を進めます。

Reactコードのリポジトリへのpush

ローカルでcreate-react-appを使って作ったReactアプリをGitHubのリポジトリに反映します。
create-react-appで作ると、自動的にgit initやgit commitは行われているため、下の手順でリポジトリの登録とpushを行います。
Reactプロジェクトのホームディレクトリに移動して下コマンドを実行します。

$ git remote add origin https://github.com/[アカウント名]/cityrank.git
$ git push -u origin master

originという名前でGitHub上のリポジトリをリモート登録し、masterという名前のブランチにpushしています。
SSH鍵のパスフレーズの入力を求められるので、SSH鍵を作るときに設定したパスフレーズを入力します。

Codepiplineの準備

buildspec.ymlの準備

Reactプロジェクトのホームディレクトリ直下に、以下の内容でbuildspec.ymlファイルを新規作成します。この定義に従って、このあと構成するCodebuildがビルドします。ここでは、Reactivesearchを使ったReactアプリを前提にbuildspec.ymlを作っています(install部分)。
ファイル作成後、git pushします。

buildspec.yml
version: 0.2
phases:
    install:
        commands:
            - npm install @appbaseio/reactivesearch
    pre_build:
        commands:
            - npm ci
    build:
        commands:
            - npm run build
artifacts:
    base-directory: build
    files:
        - '**/*'
cache:
    paths:
        - node_modules/**/*

buildspec.ymlをgit pushします。

$ git add buildspec.yml
$ git commit -m "buildspec hogehoge"
$ git push -u origin master

Codepipelineの構成

  1. AWS管理コンソールにログインし、Codepipelineの画面に移動
  2. 「パイプラインを作成する」ボタンを押す
  3. 「パイプライン名」に任意の名前を入れ、それ以外はデフォルトのまま「次に」ボタンを押す
  4. 「ソースプロバイダー」としてGitHubをリストから選び、「GitHubに接続する」ボタンを押して接続後、リポジトリとブランチを選択(接続するとGitHub上にあるものから選べるようになります)、検出オプションはGitHub ウェブフックのまま「次に」ボタンを押す
  5. 「プロバイダーを構築する」ではCodebuildを選び、リージョンはアジアパシフィック(東京)のまま、「プロジェクトを作成する」ボタンを押す
  6. 別ウィンドウが立ち上がるので、プロジェクト名に任意の名前を入れ、オペレーティングシステムにAmazon Linux 2、ランタイムにStandard、イメージにaws/codebuild/amazonlinux2-x86_64-standard:3.0を選択肢、それ以外はデフォルトのまま(ビルド仕様はbuildspecファイルを使用する、CloudWatch Logsはチェックをいれたまま)、「Codepipelineに進む」ボタンを押す
  7. 少し待つと、元のCodepipelineの画面に戻り「正常に作成されました」メッセージが表示されるので、「次に」ボタンを押す
  8. 「デプロイプロバイダー」にAmazon S3を選択し、「バケット」に公開用バケットを選び、「デプロイする前にファイルを抽出する」にチェックを入れて「次に」ボタンを押す
  9. 内容を確認し、「パイプラインを作成する」ボタンを押す

パイプライン作成後、自動で初回のパイプラインが走ります。エラーがないか確認し、Deployに成功していれば、公開環境へアクセスしてアプリが動作するか確認します。

リンク

GitHubのアカウント登録からリポジトリ操作まで

Reactで作ったWebアプリをGitHubで管理してS3に自動デプロイする

buildspec.ymlについては、AWS Codebuild ユーザーガイド

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

Kubeflow 1.0 on AWS #1 構築

はじめに

これは、Kubeflow 1.0 をAWSで構築する記事です。
動作確認が主な目的ですので、本番環境での利用は全く想定していません。

環境について

  • kubernetes
    • Amazon EKS v1.14(検証開始時点)
  • kubeflow
    • kubeflow 1.0.1(検証開始時点での最新)
  • クライアント環境
    • DockerHubのdockerイメージ上で実行(私が作成したもの)
    • kubectl, eksctl, awscli 等々検証に必要なものはだいたいインストール済み

構築

GitHubに書いてあります

構築後にやったこと

環境の確認

kubectl get all -A
NAMESPACE      NAME                                                               READY   STATUS      RESTARTS   AGE
anonymous      pod/test1-0                                                        2/2     Running     0          8h
cert-manager   pod/cert-manager-564b4bffd7-svsvz                                  1/1     Running     0          8h
cert-manager   pod/cert-manager-cainjector-596986f94-rtrjn                        1/1     Running     0          8h
cert-manager   pod/cert-manager-webhook-755d75845c-qqxt4                          1/1     Running     0          8h
istio-system   pod/cluster-local-gateway-748f94c9ff-4lcbp                         1/1     Running     0          8h
istio-system   pod/grafana-67c69bb567-ckqz6                                       1/1     Running     0          8h
istio-system   pod/istio-citadel-67697b6697-dnn94                                 1/1     Running     0          8h
istio-system   pod/istio-cleanup-secrets-1.1.6-ql8mr                              0/1     Completed   0          8h
istio-system   pod/istio-egressgateway-7dbbb87698-6tgqd                           1/1     Running     0          8h
istio-system   pod/istio-galley-7bffd57ff4-hqzmk                                  1/1     Running     0          8h
istio-system   pod/istio-grafana-post-install-1.1.6-rhcpc                         0/1     Completed   0          8h
istio-system   pod/istio-ingressgateway-565b894b5f-kn9nm                          1/1     Running     0          8h
istio-system   pod/istio-pilot-6dd5b8f74c-rf2mm                                   2/2     Running     0          8h
istio-system   pod/istio-policy-7f8bb87857-bkrjj                                  2/2     Running     1          8h
istio-system   pod/istio-security-post-install-1.1.6-m48kv                        0/1     Completed   0          8h
istio-system   pod/istio-sidecar-injector-fd5875568-xlkzp                         1/1     Running     0          8h
istio-system   pod/istio-telemetry-8759dc6b7-99jqb                                2/2     Running     1          8h
istio-system   pod/istio-tracing-5d8f57c8ff-j2mf2                                 1/1     Running     0          8h
istio-system   pod/kiali-d4d886dd7-hdd4z                                          1/1     Running     0          8h
istio-system   pod/prometheus-d8d46c5b5-8xqm6                                     1/1     Running     0          8h
kube-system    pod/aws-node-9xtq9                                                 1/1     Running     0          9h
kube-system    pod/aws-node-cxw86                                                 1/1     Running     0          9h
kube-system    pod/aws-node-d55n9                                                 1/1     Running     0          9h
kube-system    pod/aws-node-fljdw                                                 1/1     Running     0          9h
kube-system    pod/aws-node-hfdzw                                                 1/1     Running     0          9h
kube-system    pod/aws-node-r56ql                                                 1/1     Running     0          9h
kube-system    pod/coredns-84549585c-5s4lv                                        1/1     Running     0          9h
kube-system    pod/coredns-84549585c-gkkx9                                        1/1     Running     0          9h
kube-system    pod/kube-proxy-27tcv                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-84dws                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-lbnb6                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-lwchd                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-t5grh                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-wlwcj                                               1/1     Running     0          9h
kubeflow       pod/admission-webhook-bootstrap-stateful-set-0                     1/1     Running     0          8h
kubeflow       pod/admission-webhook-deployment-64cb96ddbf-t6k8j                  1/1     Running     0          8h
kubeflow       pod/alb-ingress-controller-8574c47cdb-8h229                        1/1     Running     0          8h
kubeflow       pod/application-controller-stateful-set-0                          1/1     Running     0          8h
kubeflow       pod/argo-ui-778676df64-8kdh5                                       1/1     Running     0          8h
kubeflow       pod/centraldashboard-7dd7dd685d-fvjl9                              1/1     Running     0          8h
kubeflow       pod/jupyter-web-app-deployment-89789fd5-b7v9m                      1/1     Running     0          8h
kubeflow       pod/katib-controller-6b789b6cb5-tlf7g                              1/1     Running     1          8h
kubeflow       pod/katib-db-manager-64f548b47c-xdh7l                              1/1     Running     0          8h
kubeflow       pod/katib-mysql-57884cb488-ghtq8                                   1/1     Running     0          8h
kubeflow       pod/katib-ui-5c5cc6bd77-rzsvf                                      1/1     Running     0          8h
kubeflow       pod/metacontroller-0                                               1/1     Running     0          8h
kubeflow       pod/metadata-db-76c9f78f77-b5rhv                                   1/1     Running     0          8h
kubeflow       pod/metadata-deployment-674fdd976b-pq2lr                           1/1     Running     0          8h
kubeflow       pod/metadata-envoy-deployment-5688989bd6-xc8p2                     1/1     Running     0          8h
kubeflow       pod/metadata-grpc-deployment-5579bdc87b-44xjf                      1/1     Running     4          8h
kubeflow       pod/metadata-ui-9b8cd699d-76876                                    1/1     Running     0          8h
kubeflow       pod/minio-755ff748b-zzkp2                                          1/1     Running     0          8h
kubeflow       pod/ml-pipeline-79b4f85cbc-24fjr                                   1/1     Running     0          8h
kubeflow       pod/ml-pipeline-ml-pipeline-visualizationserver-5fdffdc5bf-pgknt   1/1     Running     0          8h
kubeflow       pod/ml-pipeline-persistenceagent-645cb66874-vxvst                  1/1     Running     0          8h
kubeflow       pod/ml-pipeline-scheduledworkflow-6c978b6b85-hxqh5                 1/1     Running     0          8h
kubeflow       pod/ml-pipeline-ui-6995b7bccf-2wfvv                                1/1     Running     0          8h
kubeflow       pod/ml-pipeline-viewer-controller-deployment-8554dc7b9f-jppcf      1/1     Running     0          8h
kubeflow       pod/mpi-operator-5bf8b566b7-btz8t                                  1/1     Running     0          8h
kubeflow       pod/mysql-598bc897dc-5jrtd                                         1/1     Running     0          8h
kubeflow       pod/notebook-controller-deployment-7db57b9ccf-sw494                1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-bckbj                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-j86gk                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-sjrsh                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-sq2d9                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-vqjjd                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-zzh5d                           1/1     Running     0          8h
kubeflow       pod/profiles-deployment-b45dbc6f-ksf4s                             2/2     Running     0          8h
kubeflow       pod/pytorch-operator-5fd5f94bdd-wpltv                              1/1     Running     0          8h
kubeflow       pod/seldon-controller-manager-679fc777cd-cjtlj                     1/1     Running     0          8h
kubeflow       pod/spark-operatorcrd-cleanup-hbzfn                                0/2     Completed   0          8h
kubeflow       pod/spark-operatorsparkoperator-c7b64b87f-jqktr                    1/1     Running     0          8h
kubeflow       pod/spartakus-volunteer-6b79679599-5m6qg                           1/1     Running     0          8h
kubeflow       pod/tensorboard-6544748d94-c72sf                                   1/1     Running     0          8h
kubeflow       pod/tf-job-operator-7d7c8fb8bb-rpfxx                               1/1     Running     0          8h
kubeflow       pod/workflow-controller-945c84565-gt5r6                            1/1     Running     0          8h


NAMESPACE      NAME                                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
anonymous      service/test1                                         ClusterIP   10.100.52.23     <none>        80/TCP                                                                                                                                       8h
cert-manager   service/cert-manager                                  ClusterIP   10.100.148.158   <none>        9402/TCP                                                                                                                                     8h
cert-manager   service/cert-manager-webhook                          ClusterIP   10.100.51.103    <none>        443/TCP                                                                                                                                      8h
default        service/kubernetes                                    ClusterIP   10.100.0.1       <none>        443/TCP                                                                                                                                      9h
istio-system   service/cluster-local-gateway                         ClusterIP   10.100.57.146    <none>        80/TCP,443/TCP,31400/TCP,15011/TCP,8060/TCP,15029/TCP,15030/TCP,15031/TCP,15032/TCP                                                          8h
istio-system   service/grafana                                       ClusterIP   10.100.79.107    <none>        3000/TCP                                                                                                                                     8h
istio-system   service/istio-citadel                                 ClusterIP   10.100.78.125    <none>        8060/TCP,15014/TCP                                                                                                                           8h
istio-system   service/istio-egressgateway                           ClusterIP   10.100.214.220   <none>        80/TCP,443/TCP,15443/TCP                                                                                                                     8h
istio-system   service/istio-galley                                  ClusterIP   10.100.233.242   <none>        443/TCP,15014/TCP,9901/TCP                                                                                                                   8h
istio-system   service/istio-ingressgateway                          NodePort    10.100.210.137   <none>        15020:31941/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30395/TCP,15030:31313/TCP,15031:30738/TCP,15032:32608/TCP,15443:31210/TCP   8h
istio-system   service/istio-pilot                                   ClusterIP   10.100.16.61     <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       8h
istio-system   service/istio-policy                                  ClusterIP   10.100.46.12     <none>        9091/TCP,15004/TCP,15014/TCP                                                                                                                 8h
istio-system   service/istio-sidecar-injector                        ClusterIP   10.100.161.15    <none>        443/TCP                                                                                                                                      8h
istio-system   service/istio-telemetry                               ClusterIP   10.100.98.143    <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       8h
istio-system   service/jaeger-agent                                  ClusterIP   None             <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                                   8h
istio-system   service/jaeger-collector                              ClusterIP   10.100.189.159   <none>        14267/TCP,14268/TCP                                                                                                                          8h
istio-system   service/jaeger-query                                  ClusterIP   10.100.233.125   <none>        16686/TCP                                                                                                                                    8h
istio-system   service/kiali                                         ClusterIP   10.100.86.41     <none>        20001/TCP                                                                                                                                    8h
istio-system   service/prometheus                                    ClusterIP   10.100.46.3      <none>        9090/TCP                                                                                                                                     8h
istio-system   service/tracing                                       ClusterIP   10.100.15.74     <none>        80/TCP                                                                                                                                       8h
istio-system   service/zipkin                                        ClusterIP   10.100.17.2      <none>        9411/TCP                                                                                                                                     8h
kube-system    service/kube-dns                                      ClusterIP   10.100.0.10      <none>        53/UDP,53/TCP                                                                                                                                9h
kubeflow       service/admission-webhook-service                     ClusterIP   10.100.92.200    <none>        443/TCP                                                                                                                                      8h
kubeflow       service/application-controller-service                ClusterIP   10.100.79.239    <none>        443/TCP                                                                                                                                      8h
kubeflow       service/argo-ui                                       NodePort    10.100.87.172    <none>        80:30385/TCP                                                                                                                                 8h
kubeflow       service/centraldashboard                              ClusterIP   10.100.32.250    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/jupyter-web-app-service                       ClusterIP   10.100.153.47    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/katib-controller                              ClusterIP   10.100.251.51    <none>        443/TCP,8080/TCP                                                                                                                             8h
kubeflow       service/katib-db-manager                              ClusterIP   10.100.48.46     <none>        6789/TCP                                                                                                                                     8h
kubeflow       service/katib-mysql                                   ClusterIP   10.100.196.178   <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/katib-ui                                      ClusterIP   10.100.238.76    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/metadata-db                                   ClusterIP   10.100.109.172   <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/metadata-envoy-service                        ClusterIP   10.100.143.66    <none>        9090/TCP                                                                                                                                     8h
kubeflow       service/metadata-grpc-service                         ClusterIP   10.100.120.211   <none>        8080/TCP                                                                                                                                     8h
kubeflow       service/metadata-service                              ClusterIP   10.100.126.140   <none>        8080/TCP                                                                                                                                     8h
kubeflow       service/metadata-ui                                   ClusterIP   10.100.251.249   <none>        80/TCP                                                                                                                                       8h
kubeflow       service/minio-service                                 ClusterIP   10.100.42.199    <none>        9000/TCP                                                                                                                                     8h
kubeflow       service/ml-pipeline                                   ClusterIP   10.100.176.178   <none>        8888/TCP,8887/TCP                                                                                                                            8h
kubeflow       service/ml-pipeline-ml-pipeline-visualizationserver   ClusterIP   10.100.113.144   <none>        8888/TCP                                                                                                                                     8h
kubeflow       service/ml-pipeline-tensorboard-ui                    ClusterIP   10.100.46.114    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/ml-pipeline-ui                                ClusterIP   10.100.239.18    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/mysql                                         ClusterIP   10.100.235.36    <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/notebook-controller-service                   ClusterIP   10.100.167.185   <none>        443/TCP                                                                                                                                      8h
kubeflow       service/profiles-kfam                                 ClusterIP   10.100.90.227    <none>        8081/TCP                                                                                                                                     8h
kubeflow       service/pytorch-operator                              ClusterIP   10.100.222.24    <none>        8443/TCP                                                                                                                                     8h
kubeflow       service/seldon-webhook-service                        ClusterIP   10.100.213.191   <none>        443/TCP                                                                                                                                      8h
kubeflow       service/tensorboard                                   ClusterIP   10.100.69.23     <none>        9000/TCP                                                                                                                                     8h
kubeflow       service/tf-job-operator                               ClusterIP   10.100.151.226   <none>        8443/TCP                                                                                                                                     8h

NAMESPACE     NAME                                            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   daemonset.apps/aws-node                         6         6         6       6            6           <none>          9h
kube-system   daemonset.apps/kube-proxy                       6         6         6       6            6           <none>          9h
kubeflow      daemonset.apps/nvidia-device-plugin-daemonset   6         6         6       6            6           <none>          8h

NAMESPACE      NAME                                                          READY   UP-TO-DATE   AVAILABLE   AGE
cert-manager   deployment.apps/cert-manager                                  1/1     1            1           8h
cert-manager   deployment.apps/cert-manager-cainjector                       1/1     1            1           8h
cert-manager   deployment.apps/cert-manager-webhook                          1/1     1            1           8h
istio-system   deployment.apps/cluster-local-gateway                         1/1     1            1           8h
istio-system   deployment.apps/grafana                                       1/1     1            1           8h
istio-system   deployment.apps/istio-citadel                                 1/1     1            1           8h
istio-system   deployment.apps/istio-egressgateway                           1/1     1            1           8h
istio-system   deployment.apps/istio-galley                                  1/1     1            1           8h
istio-system   deployment.apps/istio-ingressgateway                          1/1     1            1           8h
istio-system   deployment.apps/istio-pilot                                   1/1     1            1           8h
istio-system   deployment.apps/istio-policy                                  1/1     1            1           8h
istio-system   deployment.apps/istio-sidecar-injector                        1/1     1            1           8h
istio-system   deployment.apps/istio-telemetry                               1/1     1            1           8h
istio-system   deployment.apps/istio-tracing                                 1/1     1            1           8h
istio-system   deployment.apps/kiali                                         1/1     1            1           8h
istio-system   deployment.apps/prometheus                                    1/1     1            1           8h
kube-system    deployment.apps/coredns                                       2/2     2            2           9h
kubeflow       deployment.apps/admission-webhook-deployment                  1/1     1            1           8h
kubeflow       deployment.apps/alb-ingress-controller                        1/1     1            1           8h
kubeflow       deployment.apps/argo-ui                                       1/1     1            1           8h
kubeflow       deployment.apps/centraldashboard                              1/1     1            1           8h
kubeflow       deployment.apps/jupyter-web-app-deployment                    1/1     1            1           8h
kubeflow       deployment.apps/katib-controller                              1/1     1            1           8h
kubeflow       deployment.apps/katib-db-manager                              1/1     1            1           8h
kubeflow       deployment.apps/katib-mysql                                   1/1     1            1           8h
kubeflow       deployment.apps/katib-ui                                      1/1     1            1           8h
kubeflow       deployment.apps/metadata-db                                   1/1     1            1           8h
kubeflow       deployment.apps/metadata-deployment                           1/1     1            1           8h
kubeflow       deployment.apps/metadata-envoy-deployment                     1/1     1            1           8h
kubeflow       deployment.apps/metadata-grpc-deployment                      1/1     1            1           8h
kubeflow       deployment.apps/metadata-ui                                   1/1     1            1           8h
kubeflow       deployment.apps/minio                                         1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline                                   1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-ml-pipeline-visualizationserver   1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-persistenceagent                  1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-scheduledworkflow                 1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-ui                                1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-viewer-controller-deployment      1/1     1            1           8h
kubeflow       deployment.apps/mpi-operator                                  1/1     1            1           8h
kubeflow       deployment.apps/mysql                                         1/1     1            1           8h
kubeflow       deployment.apps/notebook-controller-deployment                1/1     1            1           8h
kubeflow       deployment.apps/profiles-deployment                           1/1     1            1           8h
kubeflow       deployment.apps/pytorch-operator                              1/1     1            1           8h
kubeflow       deployment.apps/seldon-controller-manager                     1/1     1            1           8h
kubeflow       deployment.apps/spark-operatorsparkoperator                   1/1     1            1           8h
kubeflow       deployment.apps/spartakus-volunteer                           1/1     1            1           8h
kubeflow       deployment.apps/tensorboard                                   1/1     1            1           8h
kubeflow       deployment.apps/tf-job-operator                               1/1     1            1           8h
kubeflow       deployment.apps/workflow-controller                           1/1     1            1           8h

NAMESPACE      NAME                                                                     DESIRED   CURRENT   READY   AGE
cert-manager   replicaset.apps/cert-manager-564b4bffd7                                  1         1         1       8h
cert-manager   replicaset.apps/cert-manager-cainjector-596986f94                        1         1         1       8h
cert-manager   replicaset.apps/cert-manager-webhook-755d75845c                          1         1         1       8h
istio-system   replicaset.apps/cluster-local-gateway-748f94c9ff                         1         1         1       8h
istio-system   replicaset.apps/grafana-67c69bb567                                       1         1         1       8h
istio-system   replicaset.apps/istio-citadel-67697b6697                                 1         1         1       8h
istio-system   replicaset.apps/istio-egressgateway-7dbbb87698                           1         1         1       8h
istio-system   replicaset.apps/istio-galley-7bffd57ff4                                  1         1         1       8h
istio-system   replicaset.apps/istio-ingressgateway-565b894b5f                          1         1         1       8h
istio-system   replicaset.apps/istio-pilot-6dd5b8f74c                                   1         1         1       8h
istio-system   replicaset.apps/istio-policy-7f8bb87857                                  1         1         1       8h
istio-system   replicaset.apps/istio-sidecar-injector-fd5875568                         1         1         1       8h
istio-system   replicaset.apps/istio-telemetry-8759dc6b7                                1         1         1       8h
istio-system   replicaset.apps/istio-tracing-5d8f57c8ff                                 1         1         1       8h
istio-system   replicaset.apps/kiali-d4d886dd7                                          1         1         1       8h
istio-system   replicaset.apps/prometheus-d8d46c5b5                                     1         1         1       8h
kube-system    replicaset.apps/coredns-84549585c                                        2         2         2       9h
kubeflow       replicaset.apps/admission-webhook-deployment-64cb96ddbf                  1         1         1       8h
kubeflow       replicaset.apps/alb-ingress-controller-8574c47cdb                        1         1         1       8h
kubeflow       replicaset.apps/argo-ui-778676df64                                       1         1         1       8h
kubeflow       replicaset.apps/centraldashboard-7dd7dd685d                              1         1         1       8h
kubeflow       replicaset.apps/jupyter-web-app-deployment-89789fd5                      1         1         1       8h
kubeflow       replicaset.apps/katib-controller-6b789b6cb5                              1         1         1       8h
kubeflow       replicaset.apps/katib-db-manager-64f548b47c                              1         1         1       8h
kubeflow       replicaset.apps/katib-mysql-57884cb488                                   1         1         1       8h
kubeflow       replicaset.apps/katib-ui-5c5cc6bd77                                      1         1         1       8h
kubeflow       replicaset.apps/metadata-db-76c9f78f77                                   1         1         1       8h
kubeflow       replicaset.apps/metadata-deployment-674fdd976b                           1         1         1       8h
kubeflow       replicaset.apps/metadata-envoy-deployment-5688989bd6                     1         1         1       8h
kubeflow       replicaset.apps/metadata-grpc-deployment-5579bdc87b                      1         1         1       8h
kubeflow       replicaset.apps/metadata-ui-9b8cd699d                                    1         1         1       8h
kubeflow       replicaset.apps/minio-755ff748b                                          1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-79b4f85cbc                                   1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-ml-pipeline-visualizationserver-5fdffdc5bf   1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-persistenceagent-645cb66874                  1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-scheduledworkflow-6c978b6b85                 1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-ui-6995b7bccf                                1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-viewer-controller-deployment-8554dc7b9f      1         1         1       8h
kubeflow       replicaset.apps/mpi-operator-5bf8b566b7                                  1         1         1       8h
kubeflow       replicaset.apps/mysql-598bc897dc                                         1         1         1       8h
kubeflow       replicaset.apps/notebook-controller-deployment-7db57b9ccf                1         1         1       8h
kubeflow       replicaset.apps/profiles-deployment-b45dbc6f                             1         1         1       8h
kubeflow       replicaset.apps/pytorch-operator-5fd5f94bdd                              1         1         1       8h
kubeflow       replicaset.apps/seldon-controller-manager-679fc777cd                     1         1         1       8h
kubeflow       replicaset.apps/spark-operatorsparkoperator-c7b64b87f                    1         1         1       8h
kubeflow       replicaset.apps/spartakus-volunteer-6b79679599                           1         1         1       8h
kubeflow       replicaset.apps/tensorboard-6544748d94                                   1         1         1       8h
kubeflow       replicaset.apps/tf-job-operator-7d7c8fb8bb                               1         1         1       8h
kubeflow       replicaset.apps/workflow-controller-945c84565                            1         1         1       8h

NAMESPACE   NAME                                                        READY   AGE
anonymous   statefulset.apps/test1                                      1/1     8h
kubeflow    statefulset.apps/admission-webhook-bootstrap-stateful-set   1/1     8h
kubeflow    statefulset.apps/application-controller-stateful-set        1/1     8h
kubeflow    statefulset.apps/metacontroller                             1/1     8h

NAMESPACE      NAME                                                        REFERENCE                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
istio-system   horizontalpodautoscaler.autoscaling/cluster-local-gateway   Deployment/cluster-local-gateway   <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-egressgateway     Deployment/istio-egressgateway     <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-ingressgateway    Deployment/istio-ingressgateway    <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-pilot             Deployment/istio-pilot             <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-policy            Deployment/istio-policy            <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-telemetry         Deployment/istio-telemetry         <unknown>/80%   1         5         1          8h

NAMESPACE      NAME                                          COMPLETIONS   DURATION   AGE
istio-system   job.batch/istio-cleanup-secrets-1.1.6         1/1           5s         8h
istio-system   job.batch/istio-grafana-post-install-1.1.6    1/1           7s         8h
istio-system   job.batch/istio-security-post-install-1.1.6   1/1           10s        8h
kubeflow       job.batch/spark-operatorcrd-cleanup           1/1           3s         8h
kubectl get ingress -n istio-system
NAME            HOSTS   ADDRESS                                                                 PORTS   AGE
istio-ingress   *       xxxxxx-istiosystem-istio-xxxxx-xxxxx.us-west-2.elb.amazonaws.com   80      8h

こんな感じでkubeflowがデプロイされてそうなことが確認できました

ALBのセキュリティグループの編集

GitHubにも書きましたが、この状態だと無認証かつIP制限もかかっていないです。
幸いにも私の会社・自宅環境は固定IPのため、セキュリティグループでIP制限を設けました。
IPが固定できない場合などは、Kubeflowの公式ページに cognitoを使って認証を設ける方法も記載があるので、それをやってみる必要があるかもしれません
(本番環境であれば、認証・認可は必須なので、近々検証してみようと思います)

kubeflow UIへのアクセス

ELBへアクセスすると namespaceを作成する画面になるので、初期値の anonymous というnamespaceをポチポチして作成すると以下のような画面に繋がります。
image.png

次回

Kubeflowの機能を試していこうと思います

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

kubeflow 1.0 on AWS #1 構築

はじめに

これは、kubeflow 1.0 をAWSで構築する記事です。
動作確認が主な目的ですので、本番環境での利用は全く想定していません。

環境について

  • kubernetes
    • Amazon EKS v1.14(検証開始時点)
  • kubeflow
    • kubeflow 1.0.1(検証開始時点での最新)
  • クライアント環境
    • DockerHubのdockerイメージ上で実行(私が作成したもの)
    • kubectl, eksctl, awscli 等々検証に必要なものはだいたいインストール済み

構築

GitHubに書いてあります

構築後にやったこと

環境の確認

kubectl get all -A
NAMESPACE      NAME                                                               READY   STATUS      RESTARTS   AGE
anonymous      pod/test1-0                                                        2/2     Running     0          8h
cert-manager   pod/cert-manager-564b4bffd7-svsvz                                  1/1     Running     0          8h
cert-manager   pod/cert-manager-cainjector-596986f94-rtrjn                        1/1     Running     0          8h
cert-manager   pod/cert-manager-webhook-755d75845c-qqxt4                          1/1     Running     0          8h
istio-system   pod/cluster-local-gateway-748f94c9ff-4lcbp                         1/1     Running     0          8h
istio-system   pod/grafana-67c69bb567-ckqz6                                       1/1     Running     0          8h
istio-system   pod/istio-citadel-67697b6697-dnn94                                 1/1     Running     0          8h
istio-system   pod/istio-cleanup-secrets-1.1.6-ql8mr                              0/1     Completed   0          8h
istio-system   pod/istio-egressgateway-7dbbb87698-6tgqd                           1/1     Running     0          8h
istio-system   pod/istio-galley-7bffd57ff4-hqzmk                                  1/1     Running     0          8h
istio-system   pod/istio-grafana-post-install-1.1.6-rhcpc                         0/1     Completed   0          8h
istio-system   pod/istio-ingressgateway-565b894b5f-kn9nm                          1/1     Running     0          8h
istio-system   pod/istio-pilot-6dd5b8f74c-rf2mm                                   2/2     Running     0          8h
istio-system   pod/istio-policy-7f8bb87857-bkrjj                                  2/2     Running     1          8h
istio-system   pod/istio-security-post-install-1.1.6-m48kv                        0/1     Completed   0          8h
istio-system   pod/istio-sidecar-injector-fd5875568-xlkzp                         1/1     Running     0          8h
istio-system   pod/istio-telemetry-8759dc6b7-99jqb                                2/2     Running     1          8h
istio-system   pod/istio-tracing-5d8f57c8ff-j2mf2                                 1/1     Running     0          8h
istio-system   pod/kiali-d4d886dd7-hdd4z                                          1/1     Running     0          8h
istio-system   pod/prometheus-d8d46c5b5-8xqm6                                     1/1     Running     0          8h
kube-system    pod/aws-node-9xtq9                                                 1/1     Running     0          9h
kube-system    pod/aws-node-cxw86                                                 1/1     Running     0          9h
kube-system    pod/aws-node-d55n9                                                 1/1     Running     0          9h
kube-system    pod/aws-node-fljdw                                                 1/1     Running     0          9h
kube-system    pod/aws-node-hfdzw                                                 1/1     Running     0          9h
kube-system    pod/aws-node-r56ql                                                 1/1     Running     0          9h
kube-system    pod/coredns-84549585c-5s4lv                                        1/1     Running     0          9h
kube-system    pod/coredns-84549585c-gkkx9                                        1/1     Running     0          9h
kube-system    pod/kube-proxy-27tcv                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-84dws                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-lbnb6                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-lwchd                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-t5grh                                               1/1     Running     0          9h
kube-system    pod/kube-proxy-wlwcj                                               1/1     Running     0          9h
kubeflow       pod/admission-webhook-bootstrap-stateful-set-0                     1/1     Running     0          8h
kubeflow       pod/admission-webhook-deployment-64cb96ddbf-t6k8j                  1/1     Running     0          8h
kubeflow       pod/alb-ingress-controller-8574c47cdb-8h229                        1/1     Running     0          8h
kubeflow       pod/application-controller-stateful-set-0                          1/1     Running     0          8h
kubeflow       pod/argo-ui-778676df64-8kdh5                                       1/1     Running     0          8h
kubeflow       pod/centraldashboard-7dd7dd685d-fvjl9                              1/1     Running     0          8h
kubeflow       pod/jupyter-web-app-deployment-89789fd5-b7v9m                      1/1     Running     0          8h
kubeflow       pod/katib-controller-6b789b6cb5-tlf7g                              1/1     Running     1          8h
kubeflow       pod/katib-db-manager-64f548b47c-xdh7l                              1/1     Running     0          8h
kubeflow       pod/katib-mysql-57884cb488-ghtq8                                   1/1     Running     0          8h
kubeflow       pod/katib-ui-5c5cc6bd77-rzsvf                                      1/1     Running     0          8h
kubeflow       pod/metacontroller-0                                               1/1     Running     0          8h
kubeflow       pod/metadata-db-76c9f78f77-b5rhv                                   1/1     Running     0          8h
kubeflow       pod/metadata-deployment-674fdd976b-pq2lr                           1/1     Running     0          8h
kubeflow       pod/metadata-envoy-deployment-5688989bd6-xc8p2                     1/1     Running     0          8h
kubeflow       pod/metadata-grpc-deployment-5579bdc87b-44xjf                      1/1     Running     4          8h
kubeflow       pod/metadata-ui-9b8cd699d-76876                                    1/1     Running     0          8h
kubeflow       pod/minio-755ff748b-zzkp2                                          1/1     Running     0          8h
kubeflow       pod/ml-pipeline-79b4f85cbc-24fjr                                   1/1     Running     0          8h
kubeflow       pod/ml-pipeline-ml-pipeline-visualizationserver-5fdffdc5bf-pgknt   1/1     Running     0          8h
kubeflow       pod/ml-pipeline-persistenceagent-645cb66874-vxvst                  1/1     Running     0          8h
kubeflow       pod/ml-pipeline-scheduledworkflow-6c978b6b85-hxqh5                 1/1     Running     0          8h
kubeflow       pod/ml-pipeline-ui-6995b7bccf-2wfvv                                1/1     Running     0          8h
kubeflow       pod/ml-pipeline-viewer-controller-deployment-8554dc7b9f-jppcf      1/1     Running     0          8h
kubeflow       pod/mpi-operator-5bf8b566b7-btz8t                                  1/1     Running     0          8h
kubeflow       pod/mysql-598bc897dc-5jrtd                                         1/1     Running     0          8h
kubeflow       pod/notebook-controller-deployment-7db57b9ccf-sw494                1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-bckbj                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-j86gk                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-sjrsh                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-sq2d9                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-vqjjd                           1/1     Running     0          8h
kubeflow       pod/nvidia-device-plugin-daemonset-zzh5d                           1/1     Running     0          8h
kubeflow       pod/profiles-deployment-b45dbc6f-ksf4s                             2/2     Running     0          8h
kubeflow       pod/pytorch-operator-5fd5f94bdd-wpltv                              1/1     Running     0          8h
kubeflow       pod/seldon-controller-manager-679fc777cd-cjtlj                     1/1     Running     0          8h
kubeflow       pod/spark-operatorcrd-cleanup-hbzfn                                0/2     Completed   0          8h
kubeflow       pod/spark-operatorsparkoperator-c7b64b87f-jqktr                    1/1     Running     0          8h
kubeflow       pod/spartakus-volunteer-6b79679599-5m6qg                           1/1     Running     0          8h
kubeflow       pod/tensorboard-6544748d94-c72sf                                   1/1     Running     0          8h
kubeflow       pod/tf-job-operator-7d7c8fb8bb-rpfxx                               1/1     Running     0          8h
kubeflow       pod/workflow-controller-945c84565-gt5r6                            1/1     Running     0          8h


NAMESPACE      NAME                                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
anonymous      service/test1                                         ClusterIP   10.100.52.23     <none>        80/TCP                                                                                                                                       8h
cert-manager   service/cert-manager                                  ClusterIP   10.100.148.158   <none>        9402/TCP                                                                                                                                     8h
cert-manager   service/cert-manager-webhook                          ClusterIP   10.100.51.103    <none>        443/TCP                                                                                                                                      8h
default        service/kubernetes                                    ClusterIP   10.100.0.1       <none>        443/TCP                                                                                                                                      9h
istio-system   service/cluster-local-gateway                         ClusterIP   10.100.57.146    <none>        80/TCP,443/TCP,31400/TCP,15011/TCP,8060/TCP,15029/TCP,15030/TCP,15031/TCP,15032/TCP                                                          8h
istio-system   service/grafana                                       ClusterIP   10.100.79.107    <none>        3000/TCP                                                                                                                                     8h
istio-system   service/istio-citadel                                 ClusterIP   10.100.78.125    <none>        8060/TCP,15014/TCP                                                                                                                           8h
istio-system   service/istio-egressgateway                           ClusterIP   10.100.214.220   <none>        80/TCP,443/TCP,15443/TCP                                                                                                                     8h
istio-system   service/istio-galley                                  ClusterIP   10.100.233.242   <none>        443/TCP,15014/TCP,9901/TCP                                                                                                                   8h
istio-system   service/istio-ingressgateway                          NodePort    10.100.210.137   <none>        15020:31941/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30395/TCP,15030:31313/TCP,15031:30738/TCP,15032:32608/TCP,15443:31210/TCP   8h
istio-system   service/istio-pilot                                   ClusterIP   10.100.16.61     <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       8h
istio-system   service/istio-policy                                  ClusterIP   10.100.46.12     <none>        9091/TCP,15004/TCP,15014/TCP                                                                                                                 8h
istio-system   service/istio-sidecar-injector                        ClusterIP   10.100.161.15    <none>        443/TCP                                                                                                                                      8h
istio-system   service/istio-telemetry                               ClusterIP   10.100.98.143    <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       8h
istio-system   service/jaeger-agent                                  ClusterIP   None             <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                                   8h
istio-system   service/jaeger-collector                              ClusterIP   10.100.189.159   <none>        14267/TCP,14268/TCP                                                                                                                          8h
istio-system   service/jaeger-query                                  ClusterIP   10.100.233.125   <none>        16686/TCP                                                                                                                                    8h
istio-system   service/kiali                                         ClusterIP   10.100.86.41     <none>        20001/TCP                                                                                                                                    8h
istio-system   service/prometheus                                    ClusterIP   10.100.46.3      <none>        9090/TCP                                                                                                                                     8h
istio-system   service/tracing                                       ClusterIP   10.100.15.74     <none>        80/TCP                                                                                                                                       8h
istio-system   service/zipkin                                        ClusterIP   10.100.17.2      <none>        9411/TCP                                                                                                                                     8h
kube-system    service/kube-dns                                      ClusterIP   10.100.0.10      <none>        53/UDP,53/TCP                                                                                                                                9h
kubeflow       service/admission-webhook-service                     ClusterIP   10.100.92.200    <none>        443/TCP                                                                                                                                      8h
kubeflow       service/application-controller-service                ClusterIP   10.100.79.239    <none>        443/TCP                                                                                                                                      8h
kubeflow       service/argo-ui                                       NodePort    10.100.87.172    <none>        80:30385/TCP                                                                                                                                 8h
kubeflow       service/centraldashboard                              ClusterIP   10.100.32.250    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/jupyter-web-app-service                       ClusterIP   10.100.153.47    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/katib-controller                              ClusterIP   10.100.251.51    <none>        443/TCP,8080/TCP                                                                                                                             8h
kubeflow       service/katib-db-manager                              ClusterIP   10.100.48.46     <none>        6789/TCP                                                                                                                                     8h
kubeflow       service/katib-mysql                                   ClusterIP   10.100.196.178   <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/katib-ui                                      ClusterIP   10.100.238.76    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/metadata-db                                   ClusterIP   10.100.109.172   <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/metadata-envoy-service                        ClusterIP   10.100.143.66    <none>        9090/TCP                                                                                                                                     8h
kubeflow       service/metadata-grpc-service                         ClusterIP   10.100.120.211   <none>        8080/TCP                                                                                                                                     8h
kubeflow       service/metadata-service                              ClusterIP   10.100.126.140   <none>        8080/TCP                                                                                                                                     8h
kubeflow       service/metadata-ui                                   ClusterIP   10.100.251.249   <none>        80/TCP                                                                                                                                       8h
kubeflow       service/minio-service                                 ClusterIP   10.100.42.199    <none>        9000/TCP                                                                                                                                     8h
kubeflow       service/ml-pipeline                                   ClusterIP   10.100.176.178   <none>        8888/TCP,8887/TCP                                                                                                                            8h
kubeflow       service/ml-pipeline-ml-pipeline-visualizationserver   ClusterIP   10.100.113.144   <none>        8888/TCP                                                                                                                                     8h
kubeflow       service/ml-pipeline-tensorboard-ui                    ClusterIP   10.100.46.114    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/ml-pipeline-ui                                ClusterIP   10.100.239.18    <none>        80/TCP                                                                                                                                       8h
kubeflow       service/mysql                                         ClusterIP   10.100.235.36    <none>        3306/TCP                                                                                                                                     8h
kubeflow       service/notebook-controller-service                   ClusterIP   10.100.167.185   <none>        443/TCP                                                                                                                                      8h
kubeflow       service/profiles-kfam                                 ClusterIP   10.100.90.227    <none>        8081/TCP                                                                                                                                     8h
kubeflow       service/pytorch-operator                              ClusterIP   10.100.222.24    <none>        8443/TCP                                                                                                                                     8h
kubeflow       service/seldon-webhook-service                        ClusterIP   10.100.213.191   <none>        443/TCP                                                                                                                                      8h
kubeflow       service/tensorboard                                   ClusterIP   10.100.69.23     <none>        9000/TCP                                                                                                                                     8h
kubeflow       service/tf-job-operator                               ClusterIP   10.100.151.226   <none>        8443/TCP                                                                                                                                     8h

NAMESPACE     NAME                                            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   daemonset.apps/aws-node                         6         6         6       6            6           <none>          9h
kube-system   daemonset.apps/kube-proxy                       6         6         6       6            6           <none>          9h
kubeflow      daemonset.apps/nvidia-device-plugin-daemonset   6         6         6       6            6           <none>          8h

NAMESPACE      NAME                                                          READY   UP-TO-DATE   AVAILABLE   AGE
cert-manager   deployment.apps/cert-manager                                  1/1     1            1           8h
cert-manager   deployment.apps/cert-manager-cainjector                       1/1     1            1           8h
cert-manager   deployment.apps/cert-manager-webhook                          1/1     1            1           8h
istio-system   deployment.apps/cluster-local-gateway                         1/1     1            1           8h
istio-system   deployment.apps/grafana                                       1/1     1            1           8h
istio-system   deployment.apps/istio-citadel                                 1/1     1            1           8h
istio-system   deployment.apps/istio-egressgateway                           1/1     1            1           8h
istio-system   deployment.apps/istio-galley                                  1/1     1            1           8h
istio-system   deployment.apps/istio-ingressgateway                          1/1     1            1           8h
istio-system   deployment.apps/istio-pilot                                   1/1     1            1           8h
istio-system   deployment.apps/istio-policy                                  1/1     1            1           8h
istio-system   deployment.apps/istio-sidecar-injector                        1/1     1            1           8h
istio-system   deployment.apps/istio-telemetry                               1/1     1            1           8h
istio-system   deployment.apps/istio-tracing                                 1/1     1            1           8h
istio-system   deployment.apps/kiali                                         1/1     1            1           8h
istio-system   deployment.apps/prometheus                                    1/1     1            1           8h
kube-system    deployment.apps/coredns                                       2/2     2            2           9h
kubeflow       deployment.apps/admission-webhook-deployment                  1/1     1            1           8h
kubeflow       deployment.apps/alb-ingress-controller                        1/1     1            1           8h
kubeflow       deployment.apps/argo-ui                                       1/1     1            1           8h
kubeflow       deployment.apps/centraldashboard                              1/1     1            1           8h
kubeflow       deployment.apps/jupyter-web-app-deployment                    1/1     1            1           8h
kubeflow       deployment.apps/katib-controller                              1/1     1            1           8h
kubeflow       deployment.apps/katib-db-manager                              1/1     1            1           8h
kubeflow       deployment.apps/katib-mysql                                   1/1     1            1           8h
kubeflow       deployment.apps/katib-ui                                      1/1     1            1           8h
kubeflow       deployment.apps/metadata-db                                   1/1     1            1           8h
kubeflow       deployment.apps/metadata-deployment                           1/1     1            1           8h
kubeflow       deployment.apps/metadata-envoy-deployment                     1/1     1            1           8h
kubeflow       deployment.apps/metadata-grpc-deployment                      1/1     1            1           8h
kubeflow       deployment.apps/metadata-ui                                   1/1     1            1           8h
kubeflow       deployment.apps/minio                                         1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline                                   1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-ml-pipeline-visualizationserver   1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-persistenceagent                  1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-scheduledworkflow                 1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-ui                                1/1     1            1           8h
kubeflow       deployment.apps/ml-pipeline-viewer-controller-deployment      1/1     1            1           8h
kubeflow       deployment.apps/mpi-operator                                  1/1     1            1           8h
kubeflow       deployment.apps/mysql                                         1/1     1            1           8h
kubeflow       deployment.apps/notebook-controller-deployment                1/1     1            1           8h
kubeflow       deployment.apps/profiles-deployment                           1/1     1            1           8h
kubeflow       deployment.apps/pytorch-operator                              1/1     1            1           8h
kubeflow       deployment.apps/seldon-controller-manager                     1/1     1            1           8h
kubeflow       deployment.apps/spark-operatorsparkoperator                   1/1     1            1           8h
kubeflow       deployment.apps/spartakus-volunteer                           1/1     1            1           8h
kubeflow       deployment.apps/tensorboard                                   1/1     1            1           8h
kubeflow       deployment.apps/tf-job-operator                               1/1     1            1           8h
kubeflow       deployment.apps/workflow-controller                           1/1     1            1           8h

NAMESPACE      NAME                                                                     DESIRED   CURRENT   READY   AGE
cert-manager   replicaset.apps/cert-manager-564b4bffd7                                  1         1         1       8h
cert-manager   replicaset.apps/cert-manager-cainjector-596986f94                        1         1         1       8h
cert-manager   replicaset.apps/cert-manager-webhook-755d75845c                          1         1         1       8h
istio-system   replicaset.apps/cluster-local-gateway-748f94c9ff                         1         1         1       8h
istio-system   replicaset.apps/grafana-67c69bb567                                       1         1         1       8h
istio-system   replicaset.apps/istio-citadel-67697b6697                                 1         1         1       8h
istio-system   replicaset.apps/istio-egressgateway-7dbbb87698                           1         1         1       8h
istio-system   replicaset.apps/istio-galley-7bffd57ff4                                  1         1         1       8h
istio-system   replicaset.apps/istio-ingressgateway-565b894b5f                          1         1         1       8h
istio-system   replicaset.apps/istio-pilot-6dd5b8f74c                                   1         1         1       8h
istio-system   replicaset.apps/istio-policy-7f8bb87857                                  1         1         1       8h
istio-system   replicaset.apps/istio-sidecar-injector-fd5875568                         1         1         1       8h
istio-system   replicaset.apps/istio-telemetry-8759dc6b7                                1         1         1       8h
istio-system   replicaset.apps/istio-tracing-5d8f57c8ff                                 1         1         1       8h
istio-system   replicaset.apps/kiali-d4d886dd7                                          1         1         1       8h
istio-system   replicaset.apps/prometheus-d8d46c5b5                                     1         1         1       8h
kube-system    replicaset.apps/coredns-84549585c                                        2         2         2       9h
kubeflow       replicaset.apps/admission-webhook-deployment-64cb96ddbf                  1         1         1       8h
kubeflow       replicaset.apps/alb-ingress-controller-8574c47cdb                        1         1         1       8h
kubeflow       replicaset.apps/argo-ui-778676df64                                       1         1         1       8h
kubeflow       replicaset.apps/centraldashboard-7dd7dd685d                              1         1         1       8h
kubeflow       replicaset.apps/jupyter-web-app-deployment-89789fd5                      1         1         1       8h
kubeflow       replicaset.apps/katib-controller-6b789b6cb5                              1         1         1       8h
kubeflow       replicaset.apps/katib-db-manager-64f548b47c                              1         1         1       8h
kubeflow       replicaset.apps/katib-mysql-57884cb488                                   1         1         1       8h
kubeflow       replicaset.apps/katib-ui-5c5cc6bd77                                      1         1         1       8h
kubeflow       replicaset.apps/metadata-db-76c9f78f77                                   1         1         1       8h
kubeflow       replicaset.apps/metadata-deployment-674fdd976b                           1         1         1       8h
kubeflow       replicaset.apps/metadata-envoy-deployment-5688989bd6                     1         1         1       8h
kubeflow       replicaset.apps/metadata-grpc-deployment-5579bdc87b                      1         1         1       8h
kubeflow       replicaset.apps/metadata-ui-9b8cd699d                                    1         1         1       8h
kubeflow       replicaset.apps/minio-755ff748b                                          1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-79b4f85cbc                                   1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-ml-pipeline-visualizationserver-5fdffdc5bf   1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-persistenceagent-645cb66874                  1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-scheduledworkflow-6c978b6b85                 1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-ui-6995b7bccf                                1         1         1       8h
kubeflow       replicaset.apps/ml-pipeline-viewer-controller-deployment-8554dc7b9f      1         1         1       8h
kubeflow       replicaset.apps/mpi-operator-5bf8b566b7                                  1         1         1       8h
kubeflow       replicaset.apps/mysql-598bc897dc                                         1         1         1       8h
kubeflow       replicaset.apps/notebook-controller-deployment-7db57b9ccf                1         1         1       8h
kubeflow       replicaset.apps/profiles-deployment-b45dbc6f                             1         1         1       8h
kubeflow       replicaset.apps/pytorch-operator-5fd5f94bdd                              1         1         1       8h
kubeflow       replicaset.apps/seldon-controller-manager-679fc777cd                     1         1         1       8h
kubeflow       replicaset.apps/spark-operatorsparkoperator-c7b64b87f                    1         1         1       8h
kubeflow       replicaset.apps/spartakus-volunteer-6b79679599                           1         1         1       8h
kubeflow       replicaset.apps/tensorboard-6544748d94                                   1         1         1       8h
kubeflow       replicaset.apps/tf-job-operator-7d7c8fb8bb                               1         1         1       8h
kubeflow       replicaset.apps/workflow-controller-945c84565                            1         1         1       8h

NAMESPACE   NAME                                                        READY   AGE
anonymous   statefulset.apps/test1                                      1/1     8h
kubeflow    statefulset.apps/admission-webhook-bootstrap-stateful-set   1/1     8h
kubeflow    statefulset.apps/application-controller-stateful-set        1/1     8h
kubeflow    statefulset.apps/metacontroller                             1/1     8h

NAMESPACE      NAME                                                        REFERENCE                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
istio-system   horizontalpodautoscaler.autoscaling/cluster-local-gateway   Deployment/cluster-local-gateway   <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-egressgateway     Deployment/istio-egressgateway     <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-ingressgateway    Deployment/istio-ingressgateway    <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-pilot             Deployment/istio-pilot             <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-policy            Deployment/istio-policy            <unknown>/80%   1         5         1          8h
istio-system   horizontalpodautoscaler.autoscaling/istio-telemetry         Deployment/istio-telemetry         <unknown>/80%   1         5         1          8h

NAMESPACE      NAME                                          COMPLETIONS   DURATION   AGE
istio-system   job.batch/istio-cleanup-secrets-1.1.6         1/1           5s         8h
istio-system   job.batch/istio-grafana-post-install-1.1.6    1/1           7s         8h
istio-system   job.batch/istio-security-post-install-1.1.6   1/1           10s        8h
kubeflow       job.batch/spark-operatorcrd-cleanup           1/1           3s         8h
kubectl get ingress -n istio-system
NAME            HOSTS   ADDRESS                                                                 PORTS   AGE
istio-ingress   *       xxxxxx-istiosystem-istio-xxxxx-xxxxx.us-west-2.elb.amazonaws.com   80      8h

こんな感じでkubeflowがデプロイされてそうなことが確認できました

ALBのセキュリティグループの編集

GitHubにも書きましたが、この状態だと無認証かつIP制限もかかっていないです。
幸いにも私の会社・自宅環境は固定IPのため、セキュリティグループでIP制限を設けました。
IPが固定できない場合などは、Kubeflowの公式ページに cognitoを使って認証を設ける方法も記載があるので、それをやってみる必要があるかもしれません
(本番環境であれば、認証・認可は必須なので、近々検証してみようと思います)

kubeflow UIへのアクセス

ELBへアクセスすると namespaceを作成する画面になるので、初期値の anonymous というnamespaceをポチポチして作成すると以下のような画面に繋がります。
image.png

次回

Kubeflowの機能を試していこうと思います

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

Docker で AWS Lambda の Python 用 Layer を作成する

AWS Lambda の Python ランタイムでよく使うモジュールを Lambda Layers に登録しようと思ったが、EC2 インスタンスを立ち上げてパッケージを作るのが面倒なので Docker でできるようにした。

Lambda Layers とは何か

  • ファイルを zip で固めたものをアップロードして「レイヤー」として登録することができる
  • Lambda Function にレイヤーを追加すると、ランタイムの /opt 以下に固めたファイルが展開されて実行時に利用できるになる
  • 言語ごとに指定された名前のディレクトリの中にモジュールを入れておくと、Lambda Function から読み込めるようにパスを通してくれる
    • 例えば Python ランタイムの場合、レイヤー zip 内の python という名前のディレクトリに Python モジュールを入れておくと Lambda Function 側でそのモジュールを import で読み込むことができる

詳しくは: AWS Lambda レイヤー - AWS Lambda

Layer を作成するための Docker イメージを作る

Python 3.8 ランタイムは Amazon Linux 2 で動いているらしい 1 ので、本来であれば Amazon Linux 2 の EC2 インスタンスを立ててその中でレイヤーを作るべきである (別に Linux ならなんでもいいかもしれないが、少なくとも macOS で作ったレイヤーは AWS Lambda では動かない 2 ) のだが、実は Amazon Linux は Docker Hub で公式イメージが配布されている 3 ので、これをベースにして Python 3.8 をインストールした Docker イメージを作ればわざわざ EC2 インスタンスを立てる必要がない。

Dockerfile
FROM amazonlinux:2

ARG PYTHON_VERSION=3.8.2

RUN yum update -y && yum install -y tar gzip make gcc openssl-devel bzip2-devel libffi-devel \
  && curl https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz | tar xz \
  && cd Python-${PYTHON_VERSION} && ./configure && make && make install \
  && cd - && rm -rf Python-${PYTHON_VERSION}

ADD entrypoint.sh /

RUN yum install -y zip \
  && mkdir /python \
  && chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

Entrypoint には pip install して zip で固めるスクリプトを登録しておく。

entrypoint.sh
#!/bin/bash -eu

SRC=/python
DIST=/dist/layer.zip

pip3 install -t ${SRC} $@
rm -f ${DIST}
zip -q -r ${DIST} ${SRC}

イメージをビルドする。

$ docker build . -t bundle-pip-modules-for-aws-lambda-layers:python3.8

イメージ名が長ったらしいが別にここは何でもいい。

Docker イメージを使って Layer を作成する

例えば Pandas が使える Lambda Layer を作成する場合。

$ docker run --rm \
    -v $(pwd):/dist \
    bundle-pip-modules-for-aws-lambda-layers:python3.8 \
        pandas

成功すればカレントディレクトリに layer.zip が作成される。

上の例では直接 pandas を指定したが、イメージ名以降の引数は pip3 install で指定できる引数を全て渡せるので、例えば requirements.txt をマウントした上で -r オプションを指定することで多くのモジュールをまとめて Layer にすることもできる。

$ echo 'pandas' > requirements.txt
$ docker run --rm \
    -v $(pwd)/requirements.txt:/requirements.txt \
    -v $(pwd):/dist \
    bundle-pip-modules-for-aws-lambda-layers:python3.8 \
        -r requirements.txt

Layer を登録する

作成された layer.zip をアップロードする。

image.png

Layer を使用する

一番簡単な例として、Pandas の読み込み以外は何もしない Lambda Function を作ってみる。

lambda_function.py
import pandas

def lambda_handler(event, context):
    pass

作った Lambda Function に登録した Layer を追加する。

image.png

この Lambda Function を実行してみてエラーが出なければ OK 。

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

AWS Lambda で Javaを使う ー実装編 - EC2を止める/立ち上げる

やりたいこと

Lambdaで実行するJavaでEC2を起動・停止する
(↓をJavaで書いてみて、ちょっとだけカスタマイズする。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/)

目次

Eclipse準備編
・登録実行編(次回以降)
・実装編 - EC2を止める/立ち上げる(今回)
・実装編 - CloudWatchの引数を確認する

とりあえずクラス作成

前回Eclipseでサンプルクラスを作成できるようにしたので、
それを使って、入力タイプ「Custom」のLambdaプロジェクトを作る。
image.png

でできるのが、こちら

LambdaFunctionHandler.java
    package com.amazonaws.lambda.demo;

    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;

    public class LambdaFunctionHandler implements RequestHandler<Object, String> {

        @Override
        public String handleRequest(Object input, Context context) {
            context.getLogger().log("Input: " + input);

            // TODO: implement your handler
            return "Hello from Lambda!";
        }
    }

handleRequestメソッドが作られるので、Lambdaで実行したい内容をゴリゴリ書いていく。
handlerの説明は下記を参照
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-handler.html
引数ではjsonを受け取ることができる。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-handler-pojo.html

EC2をごにょごにょする

EC2オブジェクトを作成する

// EC2オブジェクトを作成
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard().withRegion("us-east-1").build();

これで、引数のリージョンにあるEC2を操作できるようになる。
リージョンコードはここを参照
https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html
今回は使わないが、Regionsという名前でEnumも準備されているので、下のクラスも使える。
com.amazonaws.regions.Regions

インスタンスを起動する

// 引数のリストに格納されたインスタンスIDを起動
StartInstancesResult ret = ec2.startInstances(new StartInstancesRequest(instanceIdList));

これで、Listの中にあるインスタンスIDを起動できる。

インスタンスを停止する

// 引数のリストに格納されたインスタンスIDを停止
StopInstancesResult ret = ec2.stopInstances(new StopInstancesRequest(instanceIdList));

起動と同じで、ListのインスタンスIDを停止できる。
起動、停止両方の戻り値で、AmazonWebServiceResultを継承している、ので下の様にできる。

AmazonWebServiceResult<?> ret 

出来上がったのがこちら

引数を↓のようにして、複数のリージョン、インスタンスに対して操作をできるようにする。

{targets":[
    {
         "action":"start"
        ,"targetReagion":"us-east-1"
        ,"targetInstances":"x-xxxxxxxxxxxxx"
    }
    ,{
         "action":"stop"
        ,"targetReagion":"ap-northeast-1"
        ,"targetInstances":"y-yyyyyyyyyyy"
    }
]}

この引数の例だとバージニア北部のx-xxxxxxxxxxxxxというインスタンスを起動して、
東京のy-yyyyyyyyyyyインスタンスを停止する。

ActionEC2Instances
package com.amazonaws.lambda.demo;

import java.util.ArrayList;
import java.util.List;

import com.amazonaws.AmazonWebServiceResult;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.StartInstancesRequest;
import com.amazonaws.services.ec2.model.StopInstancesRequest;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import com.amazonaws.lambda.demo.ActionEC2Instances.Input;
import com.amazonaws.lambda.demo.ActionEC2Instances.Output;

public class ActionEC2Instances implements RequestHandler<Input, Output> {

    @Override
    public Output handleRequest(Input input, Context context) {
        context.getLogger().log("Input : " + input);
        Output output = new Output();

        for (Target action : input.targets) {
            output.result.add(doAction(action));
        }

        return output;
    }

    private String doAction(Target target) {
        AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard().withRegion(target.targetReagion).build();
        List<String> instances = target.targetInstances;

        AmazonWebServiceResult<?> ret = null;
        if ("start".equals(target.action)) {
            ret = ec2.startInstances(new StartInstancesRequest(instances));

        } else if ("stop".equals(target.action)) {
            ret = ec2.stopInstances(new StopInstancesRequest(instances));

        } else {
            return "Unexpected Action";

        }
        return ret.toString();
    }

    public static class Input {
        public List<Target> targets;

        @Override
        public String toString() {
            StringBuffer sbf = new StringBuffer();
            for (Target target : targets) {
                sbf.append(target);
            }
            return sbf.toString();
        }
    }

    public static class Target {

        private String action;
        private String targetReagion;
        private List<String> targetInstances;

        public String getAction() {
            return action;
        }

        public void setAction(String action) {
            this.action = action;
        }

        public String getTargetReagion() {
            return targetReagion;
        }

        public void setTargetReagion(String targetReagion) {
            this.targetReagion = targetReagion;
        }

        public List<String> getTargetInstances() {
            return targetInstances;
        }

        public void setTargetInstances(List<String> targetInstances) {
            this.targetInstances = targetInstances;
        }

        @Override
        public String toString() {
            StringBuffer sbf = new StringBuffer();
            sbf.append("{action :").append(action).append(" targetReagion :").append(targetReagion)
                    .append(" targetInstances :").append(targetInstances).append("}");

            return sbf.toString();
        }

    }

    public static class Output {
        public List<String> result = new ArrayList<String>();
    }
}

追加したpom

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.11.719</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-ec2</artifactId>
    <version>1.11.602</version>
    <scope>compile</scope>
</dependency>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む