- 投稿日:2020-03-25T23:53:05+09:00
AWS Kinesis data streams とiOSの連携に苦しんだので、記事化しておきたい
はじめに
この記事は筆者がiOSとAWSの連携をしていたときに苦しんだため書いたものである。筆者の備忘録的な意味合いもあるため、わかりずらさがあったらすいません。
- 苦しんだ理由
- Kinesis data streams との関連記事がなんか古い(2015年とか)けどとりあえず実装してみるかという甘い考えでいた。
- 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を無理やり文字列にしているのがいただけない・・・
- 投稿日:2020-03-25T23:35:29+09:00
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.htmlWhen 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つのルールセットがサポートされています。セキュリティ標準機能は、以前コンプライアンス標準機能と呼ばれていました。
日本語のコンソールでは コンプライアンス標準のままになっていますが、近いうちに
修正されるかと思います。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.pyfrom 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.")以上です。
参考になれば幸いです。
- 投稿日:2020-03-25T23:28:39+09:00
2019年度の AWS What's New を集計してみた
結果
概要
- What's New のアーカイブから 2019/4/1~2020/3/20 のアップデートを取得(Python の Beautiful Soup を利用)
- 件名から、えいやでサービスを分類するロジックを組んで集計(機械学習とかおしゃれなことをするほどのモチベーションはなかったです)
- AWSさん、アップデート情報にタグ付けして・・・
所感
- サービス別集計で上位5位までは「まぁ、そーよねー」という感じだが、6位とか7位に FSx とか SSM が出てきたのは意外だった
- 週別件数を見ると、週30~40件出るのが普通なので、追いつき続けるには工夫が必要だなーと改めて実感
- 私は社内で週次の勉強会を運営して強制的に習慣化
- とりあえず、AWSさん!!アップデート情報にタグ付けお願いします!!
- 投稿日:2020-03-25T23:14:41+09:00
【実務未経験】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つの教材を繰り返し勉強していました。
- Udemy:これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(初心者向け22時間完全コース)
- 黒本:徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書
学習順序
- クラウドプラクティショナー合格まで
- 約3か月かけてUdemyを1周
- 途中から並行しながら黒本を1か月ほどで1周
- 冗長構成でWordPressブログを立ち上げるハンズオンを経験
- 試験前の1週間で黒本の2周目を完了
- クラウドプラクティショナー合格からソリューションアーキテクト - アソシエイト合格まで
- 約2か月かけてUdemyの2周目
- 並行しながら黒本を1か月ほどで3周目
- 試験前の1週間でUdemyの3周目
- Architecting on AWSを受講
- 試験当日に不安な部分を黒本で流し読み
教材利用の詳細
これだけで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』がとても役立ちました。
ちょっと高額なので「全員受けたほうがいい!」とはとても言えませんが、会社から支援していただけるようであれば受講することをおすすめします。なんとか合格したものの、知識不足を実感しているので、合格に慢心せずに引き続き勉強していければと思います。
- 投稿日:2020-03-25T22:31:45+09:00
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 Componentsはymlの代わりにjsを使って
プログラマティックに記述出来るので、ものすごくメンテナンスがしやすいです。あと.envにAWS_ACCESS_KEY_IDとAWS_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.tsfunction requireBuildModule(module: string): string { return process.env.IS_LOCAL === 'true' ? module : ''; }使用方法は下記の通りです。
nuxt.config.tsbuildModules: [ // 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.tsbuild: { standalone: true, extend (config: WebpackConfiguration, ctx: any) { }, },上記のstandalone: trueを追記する事により、ビルド時にmoduleに定義されている物も一緒にBundleされるようになります。
これ気づくのに結構時間掛かりました。tailwindcss諦めようかと思ってたくらいまとめ
軽い気持ちでテンプレ作ろうと思ったらめちゃくちゃ時間掛かった
つらい
- 投稿日:2020-03-25T19:11:10+09:00
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 }'
- 投稿日:2020-03-25T18:45:06+09:00
warning: already initialized constant Rack::Utils::ParameterTypeError などのrack utils のエラーの解決例
1.どんなエラー?
デプロイをしたときにユニコーンのバージョンがローカルとずれてしまい、ユニコーンをダウングレードしたときにでたエラーで、連動して動けなくなってしまったgemを表示したものでした
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ミスを修正したら直りました
- 投稿日:2020-03-25T18:24:38+09:00
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.pyimport 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の技術サポートに聞くことができず、知ってる人いたら教えてください
- 投稿日:2020-03-25T18:20:25+09:00
【メモ】Amazon Linux 2 でDjangoを動かす
OSを最新の状態にする
$ sudo yum update -ypythonを入れる
pythonに必要な物を入れる
$ sudo yum install git gcc zlib-devel libffi-devel bzip2-devel readline-devel openssl-devel sqlite-develpyenvを入れる
$ 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" -lpyenvで入れれる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.1Djangoを入れる
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.productiongunicorn
$ pip install gunicorngunicornを使ってDjangoを起動してみる
$ gunicorn config.wsgi --bind=[プライベートIP] # 本番用の設定ファイルを使う $ gunicorn config.wsgi --bind=[プライベートIP] --env DJANGO_SETTINGS_MODULE=config.settings.productionnginx
$ 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.confserver { 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 13504systemctlコマンド登録
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参考
- 投稿日:2020-03-25T18:11:51+09:00
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が内部的に使います(個人のアカウントには現れません)。
事前準備
- Reactアプリ(たとえば、「React版Reactivesearch v3を使ってゼロから最速でElasticsearchフロントアプリを作る」で作ったReactアプリ)
- GitHub環境(たとえば、「AWS Codepipelineを使ってReactアプリのCI環境をゼロから作る」の「GitHub環境の準備」まで)
- Route53での独自ドメインホストゾーン(たとえば、「AWS S3 + CloudFrontでReactアプリをHTTPS公開するための正しい構成」の「Route53登録」)
手順
AWS Amplify Consoleの設定
- AWS管理コンソールにログインし、AWS Amplifyの画面に移動
- 「Deploy With the Amplify Console」の下の「GET STARTED」ボタンを押す(もしくは「アプリの作成」ボタンを押す)
- 「From your existing code」でGitHubにチェックを入れ「Continue」ボタンを押す
- GitHubの認証を行う
- GitHubリポジトリ、ブランチを選択し、「次へ」ボタンを押す
- 「ビルド設定の追加」で「アプリの名前」を任意で付け、「ビルドの設定」で「Edit」ボタンを押し、Reactivesearchのインストール定義を入れて「Save」ボタンを押し(下「ビルドの設定でのamplify.yml内容」参照)、「次へ」ボタンを押す
- 内容を確認し「保存してデプロイ」ボタンを押す
- 初回の環境構築、ビルド、デプロイが走るので検証がOKになるまで待つ
- 環境にアクセスし動作しているか確認する(https://master.xxxxx.amplifyapp.com/ のようなURL)
- また、「検証」をクリックすると検証タブで、さまざまなデバイスでどう見えるかについても確認可能
ビルドの設定でのamplify.yml内容例
Reactivesearchモジュールを含めてビルドします。
amplify.ymlversion: 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の設定
- AWS管理コンソールのAWS Amplifyの画面に移動
- 左ペインを開き、該当アプリのリンクをクリックする
- 左ペインの「アプリの設定」にある「ドメイン管理」をクリックする
- 「カスタムドメインの追加」ボタンを押す
- 「ドメイン」欄でRoute53に登録されているドメイン名がリストされるので該当のドメインを選び、「ドメインの検索」ボタンを押す
- ドメインのルートを使いたくない場合は「Exclude root」ボタンを押してルートをグレーアウトし、サブドメイン名に独自URLとして付けたい名前を入れ(ここではcityrank)、「保存」ボタンを押す
- 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でビルドしてデプロイするのみとなります。
- 投稿日:2020-03-25T17:02:49+09:00
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 通知の設定)
バウンス情報を設定したEメールに通知する
SNSですがトピックのサブスクリプションで通知方法や通知先を設定できます。
通知方法ですか例えばEメールといった設定ができます。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を設定するだけでした。
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.phpRouter::mapResources('hogehogeapis'); Router::parseExtensions();そしてコントローラー(POSTされた情報を扱うコントローラ)に以下の部分を追加しました。
hogehogeapisController.phppublic 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に格納し管理画面に表示することができそうでした。今回は調査して機能を実装するにあたっての方針を見つけらました。
実装していく中で新たな問題点等やノウハウが見つかりましたら、別の記事として書いていけたらなと思っております。
- 投稿日:2020-03-25T15:04:21+09:00
【初心者向け】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 を勉強するための、取っ掛かりが欲しい。
簡単用語説明
- AWS のWeb ホスティングサービスです。
- 同系統の他サービスとしては、Firebase Hosting や Netlify 、GitHub Pages などが挙げられます。
- AWS のサービスのため、他のAWS サービス ( Route 53 など ) と親和性が高いのが特徴です。
- AWS マネジメントコンソール ( 以降、AWS M/C と略記 ) から操作できます。
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 を使う方法
章の構成
- 1-1. MkDocs のインストール & コンテンツ追加
- Windows でMkDocs をセットアップする方法を紹介します。
- 1-2. Git リポジトリの用意
- GitHub でリポジトリのセットアップする方法を紹介します。
- 1-3. Amplify Console の設定
- AWS M/C からAmplify Console を使ってWeb サイトを公開する方法を紹介します。
- ( Web サイトのURL のドメインは、Amplify のドメインになります。)
- 1-4. Amplify Console からドメイン登録
- Web サイトのURL のドメインを、独自ドメインに変更する方法を紹介します。
- 1-5. develop ブランチもデプロイしてみる
- master ブランチ以外の、他のブランチの内容をWeb 公開する方法を紹介します。
- 1-6. develop 用ページにBasic 認証を追加する
- 公開しているWeb サイトに、Amplify Console の機能でBasic 認証をかける方法を紹介します。
- 1-7. Preview 機能でプルリクエストを出しているブランチを公開
- プルリクエストを出しているブランチを Web 公開する方法を紹介します。
各節の構成
- 前提
- 後段の「操作」を実施するにあたっての前提知識や、用意/登録するべきサービスを紹介しています。
- 「操作」を実施する前に、ご一読されることをお勧めします。
- 操作
- 操作手順を、操作画面やコマンドプロンプトの実行コマンドを交えて紹介しています。
- 実行コマンドは、基本的に 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 のサンプルページが表示されれば成功。結果
参考
- MkDocs のテーマ変更などの作りこみに関しては、MkDocs によるドキュメント作成(Qiita) が参考になりました。
- MkDocs のインストールからGitHub Pages を使った公開方法まで記載されています。公開するコンテンツの目的/用途によっては、Amplify Console ではなくGitHub Pages を選択した方が良い場合があります。
1-2. Git リポジトリの用意
前提
- 1-1. まで完了した状態にしてください。
- Amplify Console は下記のGit リポジトリサービスに対応しています。
- GitHub 、BitBucket 、GitLab 、AWS CodeCommit
- 参照:Q: AWS Amplify コンソールは、どの Git ソースコードプロバイダをサポートしていますか?)
- ⇒ 本記事では、GitHub を使って説明していきます。
- 作業PC にGit が入っている必要があります。
- Windows 用Git インストール手順 ⇒ 【初心者向け】Gitのインストール方法をわかり易く解説(画面付き)
- Mac 用Git インストール手順 ⇒ Git のインストール 〜Git をMacにインストールしよう〜
- GitHub アカウントを持っていない方は下記を参照して用意してください。
- GitHub でリポジトリを作成する方法は下記を参考にしました。
- 参照:Github に新規リポジトリを追加(Qiita)
- 用意するリポジトリの公開状況( Public / Private ) は、どちらでも問題ありません。
操作
> 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 の設定
前提
- 1-2. まで完了した状態にしてください。
- AWS アカウントを持っていない方は、下記を参照して用意してください。
- 参照:AWS アカウント作成の流れ(AWS公式)
- AWS M/C にサインインしたところから説明を始めます。
操作
- AWS M/C ホーム画面から、Amplify サービス画面まで行ってください。
Amplify サービス画面 です。(リージョンは東京リージョンを別案件で既に使用しているため、バージニア北部リージョンを選択しています。)
任意のGit リポジトリ(ここでは1-2. で作成したGitHub リポジトリ)を選択して、「Continue 」を選択します。
GitHub の認証画面に移動しますので、操作するリポジトリが所属するGitHub アカウントにサインインしてください。
Vue.js や React を使っている場合は自動でビルド設定を検出してくれますが、MkDocs では検出されないため、「Edit 」を選択して
amplify.yml
を修正します。( 関係ないですけど、ちょっとコメントが面白いですよね。)
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: []結果
- 「検証」までチェックが付けばデプロイ完了です。URLを選択すると 1-1. の結果と同じ画面が表示されることが確認できます。
- このままではAmplify のドメインがユーザーに表示されてしまうため、1-4. で独自ドメインが表示されるように変更します。
- 「Learn how to get the most out of Amplify Console 」のチェックリストの1 つ目にチェックが付きました!
- 次の節以降では、このチェックリストのチェック項目全てにチェックが付くように順番に説明していき、Amplify Console のマスターを目指します。
1-4. Amplify Consoleからドメイン登録
前提
- 1-3. まで完了した状態にしてください。
- 独自ドメインを持っていない方や、Route 53 に登録していない方は下記を参考にして用意してください。
- 参照:無料ドメイン(.tk)とRoute53を利用して0円でHTTPS環境を設定してみた
- 操作手順の内、「freenom作業(1)」、「AWS作業 (1)」、「freenom作業 (2)」でRoute 53の登録までが完了していれば大丈夫です。
- 本記事では、Route 53 のホストゾーンにドメインが登録されている想定で進めます。
操作
- Amplify サービス画面から「ドメイン管理」を選択し、「カスタムドメインの追加」を選択してください。
- 図のように設定して「保存」を選択してください。
- 画面が遷移するので、処理が完了するまで 30 分ほど待ってください。(裏側で ACM 証明書の作成と CloudFront への適用がされていると思われます。どちらも AWS M/C からは存在が確認できません。)
結果
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 サービス画面から「全般」→「ブランチを接続する」を選択してください。
- develop ブランチが表示されているので、選択して「次へ」を選択してください。
- develop ブランチのデプロイが開始されます。
結果
オプション操作 & 結果
- develop ブランチの方も master のように独自ドメインを登録できます。
- 「ドメイン管理」→「サブドメインの管理」を選択してください。
- 「追加」を選択し、develop ブランチ用の行を追加し、「更新」を選択してください。
- develop の独自ドメインでアクセスできました!
1-6. develop 用ページにBasic 認証を追加する
前提
- 1-5. まで完了した状態にしてください。( master ブランチの内容にBasic 認証をかける場合は1-3. 完了までで問題ありません。 )
操作
- 「アクセスコントロール」→「アクセスの管理」を選択してください。
- develop の Access setting を「制限」に変更してユーザー/パスワードを登録し、「Save 」を選択してください。
結果
1-7. Preview 機能でプルリクエストを出しているブランチを公開
前提
- 1-5. まで完了した状態にしてください。( 1-6. は省略して問題ありません。 )
操作
- 「Preview 」→「Enable Preview 」を選択してください。GitHub App をインストールするように求められるのでインストールしてください。
- GitHub App をインストールするリポジトリを選択し、「install 」を選択してください。
- Preview の画面に戻り、develop を選択し「Manage 」を選択、表示されるモーダルの中でEnabled にチェックを付け、「確認」を選択してください。
- develop から分岐させたブランチを新たに作り、プルリクを作成してください。
- プルリクに応じた環境が作成されていることが確認できます。
結果
プルリクエストを出したブランチ用のページが公開されています。(Basic 認証などは後から設定しないといけませんでした。)
チェックリストはなんと…リストごと削除されました!ヽ(・ω・)/ズコー ( …どうせなら全部チェックが付いた状態で残しておいてほしかった。。)
この後、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 の書き方が分かってきた気がします。以下、気づきです。
- 画面ショットは必要なところだけ使うようにした方が良いと感じました。たくさん画像を用意してしまったため、貼り付けが地味に大変でした。
- 文章の中で、半角文字の後ろに半角スペースを置くなどすると読みやすくなるということは知っていましたが、必要に応じて半角文字の前にも半角スペースを置いた方が良いと感じました。とくに半角カッコ () の前後は半角スペースを置かないと、少し見にくいのではないかと思っています。
この記事内でお気づきになった点や、修正が必要な記載がありましたら、ご指摘いただけますと幸いです。
最後になりましたが、参照記事を執筆された方々に感謝を申し上げます。ありがとうございました。
以上です。
- 投稿日:2020-03-25T14:25:41+09:00
[はじめて]失敗から学んだ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でリモート接続できたのかと気づいた次第です。上記説明の「HTTP および HTTPS ポートに無制限のアクセス権限を与えます。」の具体的な設定は以下の通りです。これでウェブサーバーのルールができました。
設定場所は[EC2 > Security Group]です。(補足)
HTTPポートは80、HTTPSポートは443です。このような明示的に許可されていない通信は拒否される仕組みを「ステートフルインスペクション」といいます。
ステートフルインスペクションは、リクエスト元を追跡しリクエストに対する応答が自動的に元のコンピュータに戻るようにできます。参考
Linux インスタンスの Amazon EC2 セキュリティグループ
セキュリティグループのルールのリファレンス
Amazon VPCのよくある質問
- 投稿日:2020-03-25T14:02:00+09:00
【SSH】公開鍵認証とEC2について
はじめに
SSHについての記事はたくさんありますが、どうしてもイメージとして捉えられませんでした。
先日AWSのデプロイを行った際に、RUNTEQの講師の方に説明をしていただいて自分なりに解釈したので書き記しておきます。
なお、これは覚書であって手順書ではないのでご注意ください。実際に行う手順は一部省略しています。こんな人が読んだら腑に落ちるかもしれない
- SSHはコピペでなんとかするもの。
- どうして公開鍵をいろんなところに登録するんだろう。
- 鍵とか錠とか言うけど、なんか納得できない。
SSH鍵事始め
ローカル$ cd ~/.ssh $ ssh-keygenこのコマンドによって、
~/.ssh
ディレクトリに(特に指定をしなければ)id_rsa
とid_rsa.pub
が作成される。前者が秘密鍵、後者が公開鍵となる。
公開鍵を外部に登録することはあるが、秘密鍵を登録することはない。というか、秘密鍵が漏れるとやばい。よく言う鍵と錠の関係
よく、公開鍵は南京錠で秘密鍵はその鍵だと言う。確かに、錠は見せてもいいが鍵は見せてはならないと言うイメージではしっくりくるが、この鍵と錠は一対一の関係ではない。
実際はその南京錠を複製することがよくある。例えば、私はid_rsa.pub
をGitHubとEC2インスタンス内に登録している。どちらもid_rsa
で開けることができる。
また、一つのドアに複数の南京錠が付いていることもある。例えば、私のGitHubには複数の公開鍵が登録されている。この場合、いずれかの対応する秘密鍵があれば開けることができる。
EC2に接続するときの手順
EC2インスタンスを作成するときに、新規にキーペアを作成する。(すでに鍵がある場合はそれを使うこともできる)
このときにダウンロードしたプライベートキー(pemファイル)を~/.ssh配下に保存しておく。
作成したインスタンスを選択して「接続」ボタンを押すと、手順が表示されるので、基本的にはそれに従えばいい。ありがたいね。
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 updateSSH認証に成功した場合、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_keys
にaws-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インスタンスとキーペアは現在削除済みです。参考リンク
- 投稿日:2020-03-25T12:41:42+09:00
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上に構築します。
事前準備
- 「React版Reactivesearch v3を使ってゼロから最速でElasticsearchフロントアプリを作る」で作ったReactアプリ、もしくはcreate-react-appで作ったReactアプリ
- 「AWS S3 + CloudFrontでReactアプリをHTTPS公開するための正しい構成」で作った環境、もしくはアプリを公開するS3環境
手順
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 masteroriginという名前でGitHub上のリポジトリをリモート登録し、masterという名前のブランチにpushしています。
SSH鍵のパスフレーズの入力を求められるので、SSH鍵を作るときに設定したパスフレーズを入力します。Codepiplineの準備
buildspec.ymlの準備
Reactプロジェクトのホームディレクトリ直下に、以下の内容でbuildspec.ymlファイルを新規作成します。この定義に従って、このあと構成するCodebuildがビルドします。ここでは、Reactivesearchを使ったReactアプリを前提にbuildspec.ymlを作っています(install部分)。
ファイル作成後、git pushします。buildspec.ymlversion: 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 masterCodepipelineの構成
- AWS管理コンソールにログインし、Codepipelineの画面に移動
- 「パイプラインを作成する」ボタンを押す
- 「パイプライン名」に任意の名前を入れ、それ以外はデフォルトのまま「次に」ボタンを押す
- 「ソースプロバイダー」としてGitHubをリストから選び、「GitHubに接続する」ボタンを押して接続後、リポジトリとブランチを選択(接続するとGitHub上にあるものから選べるようになります)、検出オプションはGitHub ウェブフックのまま「次に」ボタンを押す
- 「プロバイダーを構築する」ではCodebuildを選び、リージョンはアジアパシフィック(東京)のまま、「プロジェクトを作成する」ボタンを押す
- 別ウィンドウが立ち上がるので、プロジェクト名に任意の名前を入れ、オペレーティングシステムにAmazon Linux 2、ランタイムにStandard、イメージにaws/codebuild/amazonlinux2-x86_64-standard:3.0を選択肢、それ以外はデフォルトのまま(ビルド仕様はbuildspecファイルを使用する、CloudWatch Logsはチェックをいれたまま)、「Codepipelineに進む」ボタンを押す
- 少し待つと、元のCodepipelineの画面に戻り「正常に作成されました」メッセージが表示されるので、「次に」ボタンを押す
- 「デプロイプロバイダー」にAmazon S3を選択し、「バケット」に公開用バケットを選び、「デプロイする前にファイルを抽出する」にチェックを入れて「次に」ボタンを押す
- 内容を確認し、「パイプラインを作成する」ボタンを押す
パイプライン作成後、自動で初回のパイプラインが走ります。エラーがないか確認し、Deployに成功していれば、公開環境へアクセスしてアプリが動作するか確認します。
リンク
Reactで作ったWebアプリをGitHubで管理してS3に自動デプロイする
buildspec.ymlについては、AWS Codebuild ユーザーガイド
- 投稿日:2020-03-25T10:40:47+09:00
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 8hkubectl 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をポチポチして作成すると以下のような画面に繋がります。
次回
Kubeflowの機能を試していこうと思います
- 投稿日:2020-03-25T10:40:47+09:00
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 8hkubectl 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をポチポチして作成すると以下のような画面に繋がります。
次回
Kubeflowの機能を試していこうと思います
- 投稿日:2020-03-25T00:56:05+09:00
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 インスタンスを立てる必要がない。
DockerfileFROM 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.txtLayer を登録する
作成された
layer.zip
をアップロードする。Layer を使用する
一番簡単な例として、Pandas の読み込み以外は何もしない Lambda Function を作ってみる。
lambda_function.pyimport pandas def lambda_handler(event, context): pass作った Lambda Function に登録した Layer を追加する。
この Lambda Function を実行してみてエラーが出なければ OK 。
- 投稿日:2020-03-25T00:15:33+09:00
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プロジェクトを作る。
でできるのが、こちら
LambdaFunctionHandler.javapackage 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.htmlEC2をごにょごにょする
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インスタンスを停止する。ActionEC2Instancespackage 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>