CodeStarバンザイ!数クリックで始めるCI/CDパイプライン

CodeStarを使ってCI/CDパイプラインを構築してみたので、紹介します。

CodeStarとは?

AWSのマネージドサービスであるCodePipeline、CodeCommit、CodeBuild、CodeDeployを使ってCI/CDパイプライン+実行環境をさくっと構築してくれるサービスらしい。

https://aws.amazon.com/jp/codestar/

よしっ、動かしてみるぞ!!

1.プロジェクト作成

マネジメントコンソールからCodeStarを選び、「start a project」をポチッ。
するとプロジェクトのテンプレートを選択する画面が表示される。

カテゴリは、Web application、Web service、Alexa Skill、Static Websiteから、
言語は、Ruby、Node.js、Java、Python、PHP、HTML 5から、
実行環境は、Beanstalk、EC2、Lambdaから選択できる。
※もちろん存在しない組み合わせもあります。

今の時代っぽいWeb Application×Node.js×Lambdaなんてのも選択できるんですね。

うーん、ここはCodeBuildも使ってみたいし「Web Application×Java Spring×EC2」を選択。

使う1.png

そして、プロジェクト名を入力。インスタンスタイプを設定して。ポチッ、ポチッ。

使う2.png

。。。
はいっ、CI/CDパイプライン構築の作業はこれで終わり。

そして、待つこと10分。
CodePipeline、CodeCommit、CodeBuild、CodeDeployと、これを統合的に確認するためのダッシュボードがいい感じにできちゃいました。
もちろんjavaのwebアプリケーションも起動しています。

ダッシュボード

使う4修正.png

CodePipeline

使う8.png

CodeCommit

使う5.png

CodeBuild

使う6.png

CodeDeploy

使う7.png

デプロイされたjavaのwebアプリケーション

12.png

2.CI/CDパイプライン実行

ここからが本番。
gitへの接続情報をIAMで確認(ユーザ⇒認証情報⇒AWS CodeCommit の HTTPS Git 認証情報「生成」)し、code commit上のソースコードをcloneする。
するとこんなものが落ちてきます。

tree
.
├── README.md
├── appspec.yml
├── buildspec.yml
├── pom.xml
├── scripts
│   ├── install_dependencies
│   └── start_server
└── src
    └── main
        ├── java
        │   └── com
        │       └── aws
        │           └── codestar
        │               └── projecttemplates
        │                   ├── HelloWorldAppInitializer.java
        │                   ├── configuration
        │                   │   ├── ApplicationConfig.java
        │                   │   └── MvcConfig.java
        │                   └── controller
        │                       └── HelloWorldController.java
        ├── resources
        │   └── application.properties
        └── webapp
            ├── WEB-INF
            │   └── views
            │       └── index.jsp
            └── resources
                ├── gradients.css
                ├── set-background.js
                ├── styles.css
                └── tweet.svg

ふむふむ、なるほど。
ここは手っ取り早くCI/CDパイプラインを確認するため、index.jspをちょこっと修正。
そして、code commitにpush。
code commit上で、変更した内容も確認できます。

使う11.png
すると。。。

使う9.png

パイプラインが動き出したーーー
どうやら動きとしては、こんなことをやっているみたい。

  • Source : 新たしいコードがpushされると、code commitからソースコードを取得しS3に格納。
  • Build : S3からソースコードを取得しビルド。そしてビルドしたモジュールをS3に格納。
  • Application : S3に格納されたモジュールをEC2にデプロイ。

待つこと5分。デプロイまで成功。
そして、先程の画面を確認してみると。。。

使う10.png

変わった!
簡単!!

これを使えば

  • Java、Rubyなどメジャーな言語を利用したCI/CDパイプラインを爆速で構築できる。
  • Jenkinsから開放される。

がしかし。。

  • 東京リージョンにはまだ来ていない。
  • CodeStarというかcode commit側の問題になるが、pull requestが使えない。。

本番用のアプリケーション開発環境・実行環境として利用するのは、まだまだ難しいような気もしますが、
pocくらいであればこれで十分かもしれませんね。

続きを読む

AWS独学メモ

頑張って学んでいきます。

サービス俯瞰

コンピューティング関連

サービス名 概要
EC2 仮想サーバー
EC2 Container Service Doker(アプリ実行環境構築ツール)運用サービス
EC2 Container Regstry Dokerイメージ保存・共有サービス。
Elastic Beanstalk .NET/PHP/Python/Ruby/Node.jsアプリを自動でAWSにデプロイ。
Lambda クライアントからのリクエスト発生時に任意プログラミング起動。イベント駆動型サービス。
Auto Scaling CPU使用率等、事前決定条件に応じ、EC2インスタンス増減
Elastic Load Balancing トラフィックに応じ、複数EC2インスタンスに負荷分散

ストレージ・コンテンツ配信

サービス名 概要
S3 ファイルサーバ。画像格納したり。
CloudFront コンテンツ配信ネットワーク。利用者から近い場所から効率よく配信
EBS EC2データを保持するストレージ。EC2のHDD,SSDのような役割。
Elastic File System EC2共有ファイルストレージ
Glacier 低価格ストレージ。仕様頻度低いけど長期保存のバックアップ用。
Import / Export Snowball ペタバイト級の大容量転送サービス。
Storage Gateway オンプレミスとAWSを接続

DB関連

サービス名 概要
RDS DB(MySQL/Oracle/SQL Server/PostgreSQL/Aurora)が利用できる
Database Migration Service 最小限停止時間でDBを移行。オンプレミスのDBサーバからの移行等に用いる
DynamoDB NoSQLデータベスサービス構築/運用。
ElastiCache クラウドでのメモり内キャッシュの管理サービス
Redshift ビッグデータを分析

ネットワーク

サービス名 概要
VPC プライベートネットワーク構築サービス。
Direct Connect オンプレミスのネットワークとAWSのVPCネットワークを直接接続。
Route 53 DNS(ドメイン名とIPアドレスを対応)

開発者用ツール

サービス名 概要
CodeCommit プライベートGit
CodeDeploy 開発アプリを実行環境に自動配置
CodePipeline 継続的デリバリ使用したアプリのリリース

開発ツール

サービス名 概要
CloudWatch AWSリソース監視サービス
CloudFormation テンプレート利用したリソースの作成と管理
CloudTrail ユーザアクティビティとAPI使用状況確認
Config リソースのイベントリ変更の追跡
OpsWorks Chef利用し操作の自動化
Service Catalog 標準化製品の作成と使用
Trusted Advisor パフォーマンスとせきゅりてぃの最適化

セキュリティ

サービス名 概要
IAM AWS認証
Directory Service Active Directoryのホスティングと管理
Inspector アプリのセキュリティ分析
CloudHSM 暗号鍵管理の専用ハードウェア
Key Management Service 暗号鍵作成と管理
WAF 攻撃から保護するファイアウォール

分析

サービス名 概要
EMR Hadoopフレームワーク
Data Pipeline オーケストレーションサービス
Kinesis リアルタイムストリーミングデータとの連携
Machine Learning 機械学習
QuickSight 高速ビジネスインテリジェンスサービス

モバイルサービス

サービス名 概要
Mobile Hub モバイルアプリの構築/テスト/監視
API Gateway RESTful APIの構築/管理
Cofnito ユーザID及びアプリデータの同期
Device Farm iOS/Android/FireOSアプリのテスト
Mobile Analytics アプリ分析の収集/表示/エクスポート
Mobile SDK モバイルソフトウェアの開発キット

アプリケーションサービス

サービス名 概要
AppStream ストリーミングサービス
CloudSearch マネージド型検索サービス
Elastic Transcorder メディアと動画変換
SES Eメール送受信
SNS プッシュ通知サービス
SQS メッセージキューサービス
SWF アプリ同士を連携ワークフローサービス

大企業向け

サービス名 概要
WorkSpaces クラウド上仮想デスクトップパソコンサービス
WorkMail セキュリティ保護、企業向けEメール及びカレンダー
WorkDocs ファイル共有サービス

S3について

用語

用語 意味
バケット データの入れ物
オブジェクト 格納ファイル

ステップ

  1. バケット作成
  2. オブジェクト格納

EC2について

用語

用語 意味
EC2 仮想サーバ。オンプレミスのWindowsサーバやUNIXサーバに相当。
インスタンス 1台の仮想サーバ
EBS(Elastic Block Store) サーバのHDDに相当する仮想ディスク
AMI(Amazon Machine Image) サーバにインストールするOSやミドルウェアやアプリのイメージ。新インスタンスを複数生成時、AMIを利用。
yum パッケージ管理システム
scp(secure copy) SSH機能を用いて、安全にファイル転送する

EC2にSSH接続した

参考ページ1
参考ページ2

ミドルウェアをインストール

yum更新
$ sudo yum -y update
httpdインストール
$ sudo yum  install -y httpd
httpd起動
$ sudo service httpd start
httpd自動起動を確認
$ sudo chkconfig --list httpd
httpd自動起動を設定
$ sudo chkconfig  httpd on
$ sudo chkconfig  httpd off

scp(コンテンツをアップロードする)

【現在ここで躓き中!】
→ 突破!!

参考ページ1

HTTPコンテンツをコピー

HTTPコンテンツのコピー

$ sudo cp /home/ec2-user/index.html /var/www/html/

【現在ここで躓き中!】index.htmlへアクセスできない

続きを読む

転ばぬ先のAWSセキュリティ

サービスが大きくなればなるほど、セキュリティは重要になってくる


じゃあ最初から強固なものにしよう


  1. 強固なパスワード
  2. グループメール
  3. MFA(多要素認証)
  4. ルートアカウントのアクセスキーは使わない
  5. CloudTrail有効化
  6. git-secrets導入
  7. IAMユーザー、グループ、ロール

■ 参考
AWSリソースについてセキュリティベストプラクティスに従った設定をしよう!
git-secretsでAWSの不正利用を防ぐ


  1. 強固なパスワード
  2. グループメール
  3. MFA(多要素認証)
  4. ルートアカウントのアクセスキーは使わない
  5. CloudTrail有効化 ← これ
  6. git-secrets導入 ← これ
  7. IAMユーザー、グループ、ロール ← これ

これの部分を今日は話します


CloudTrail

AWSの操作履歴がすべて取得できるようになる戦犯発見サービス。
グラフとかにもできるっぽい。ログはS3に保存される。

■ 参考
TrailDashでCloudTrailを可視化する


git-secrets

リポジトリにアクセスキーなどが混入しないようにするためのAWS謹製Gitプラグイン。
アクセスキーやシークレットキーはgit管理すんなよというAWSからのお達し。


使い方(インストール)

$ brew update
$ brew install git-secrets

使い方(設定)

  1. gitconfigにアクセスキーの標準パターンを登録
    => これだけだと無効なまま。一応ファイル内のスキャンはできる
  2. gitコミット時のhookに設定
  3. 例外があれば設定

具体的な設定方法はこちらの記事が参考になります


IAMユーザー、グループ、ロール


Identity and Access Management


それぞれの役割

  • ユーザー

    • コンソールサインイン、APIまたはCLIのリクエストを行うのに使用
  • グループ
    • ユーザーの集合。グループに属するユーザーに一括で権限付与できる
  • ロール
    • 特定タスクに応じてユーザーやサービスに権限付与できるもの
    • 認証情報(アクセスキー等)は関連付けられない

問題

IAMロールのユースケースをひとつあげてください


  • EC2インスタンスから他のAWSサービスにアクセスする必要がある時に権限を与えるためアタッチする

■ 参考
Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス権限を付与する


  • ルートアカウントだと権限が強すぎるので、必ずIAMユーザーを作成して適切な権限を付与
  • アクセスキーはできるだけ作成せず、IAMロールで利用することを推奨

しましょう


さらにIAMのベストプラクティスを知りたい場合はこちらへどうぞ

IAM のベストプラクティス


ありがとうございました。

続きを読む

EC2上にhubotを設置してslackと連携させる

最近ChatOpsに興味が出てきたので、とりあえずEC2上にhubotが動作する環境を作り、slackと連携出来るようにしました。

前提

以下の環境が既にあること。

  • EC2
  • slack

環境構築

  • nvm〜hubotの起動までは全てEC2上での作業です。

nvmのインストール

  • curlでインストールします
sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
  • .bash_profileに以下を追記します
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
  • nvmコマンドが実行できることを確認します
nvm help

nodejsのインストール

  • nvmでnodejsのv6.11.0をインストールします
  • 公式サイトを見ると includes npm 3.10.10 と書いてあるのでnpmも一緒にインストールされます
nvm install 6.11.0
  • インストールされたことを確認します
node -v
npm -v

redisのインストール

  • elasticacheは使わずAmazon Linux上にredisをインストールします
  • epelだとバージョンが古いようなのでremiを利用します
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum --enablerepo=remi install redis
  • redisを起動させます
sudo service redis start

hubotのインストール

  • hubotの環境を構築します
  • npmでhubot,coffescript,redis,yo,generator-hubotをインストールします
npm install -g hubot coffee-script redis yo generator-hubot
  • hubotをインストールします
mkdir -p ~/deploy-sushi
cd deploy-sushi
yo hubot
  • 対話式で色々聞かれるので自身の環境に合わせて入力してください
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Y/no


省略


? Owner (User <user@example.com>)
? Bot name (deploy-sushi)
? Description (A simple helpful robot for your Company)
? Bot adapter (campfire)
  • 今回は?4つに以下のように答えました
? Owner {MY_EMAIL}
? Bot name deploy-sushi
? Description this is deploy boy
? Bot adapter slack
  • hubotを立ち上げて動作確認をします
bin/hubot
  • いろんなメッセージが出た後にEnterを押せば deploy-sushi> という対話が始まります
deploy-sushi> deploy-sushi ping
deploy-sushi> PONG
  • hubot-slackをnpmでインストールします
npm install hubot-slack

slackと連携させる

  • slack上の操作に変わります
  • slackのサイドメニューを開き Configure Apps を開きます

スクリーンショット 2017-06-17 14.12.32.png

  • 画面上部に Hubot を入力し、検索結果をクリックします

スクリーンショット 2017-06-17 14.16.11.png

  • Installボタンをクリックします

スクリーンショット 2017-06-17 14.17.17.png

  • hubotの名前を入力して Add Hubot Integrationをクリックします

スクリーンショット 2017-06-17 14.18.21.png

  • 作成が完了したらhubotの詳細画面に遷移するので画面上部の Setup Instructions のところに記載されている HUBOT_SLACK_TOKEN={YOUR_API_TOKEN} をコピーしておきます
  • 画像を変更する・・・など何か編集を加えた場合、画面下部の保存ボタンをクリックして更新してください

  • EC2に戻り以下の環境変数をexportします

echo 'export HUBOT_SLACK_TOKEN={YOUR_API_TOKEN}' >> ~/.bash_profile
source ~/.bash_profile
  • アダプタを指定してhubotを起動します
bin/hubot --adapter slack
  • slackのどこかのチャンネルにhubotをinviteして動作確認します

スクリーンショット 2017-06-17 14.29.14.png

  • 動作確認ができたらEC2起動時に自動でhubotが立ち上がるようにします

hubotの永続実行

  • foreverをnpmでインストールします
npm install -g forever
  • bin/hubot を書き換えます
以下を追記
forever start -w -c coffee node_modules/.bin/hubot --adapter slack


以下をコメントアウト
exec node_modules/.bin/hubot --name "deploy-sushi" "$@"

  • バックグラウンドで動くことを確認します
bin/hubot
ps aux | grep hubot

EC2起動時のスクリプト作成

sudo vi /etc/init.d/start_deploy_hubot
#!/bin/bash
#chkconfig: 2345 99 10
#descpriction: start deploy hubot
DIR="/home/ec2-user/deploy-sushi"
cd $DIR
bin/hubot
  • 実行権限を付与します
sudo chmod 755 /etc/init.d/start_deploy_hubot
  • サービスに追加します
sudo chkconfig --add start_deploy_hubot
  • EC2インスタンスを再起動してhubotが立ち上がっていることを確認してください

hubotが起動しなかった・・・

  • npm,foreverのパスがec2-userにしか通っていないかったのでrootでnpm,foreverするとコマンドが見つからない。
  • トークンもec2-userの .bash_profile に記述していたので見つからない。
  • とりいそぎ bin/hubot に以下を追記しました
    • npm install よりも前に追記してください
export PATH="/home/ec2-user/.nvm/versions/node/v6.11.0/bin:$PATH"
export HUBOT_SLACK_TOKEN={YOUR_API_TOKEN}
  • EC2を再起動して、hubotが立ち上がっていることを確認してください

    • プロセスの確認をします
ps aux | grep hubot
  • slackのチャンネルでもpingして返答があることを確認してください

おわり

hubotがサーバ上で動き続けるようになったので、次回はslackからgit操作を出来るようにしようと思います。

続きを読む

Mac から AWS CodeCommit を使ってみる

0.はじめに

AWS CodeCommit が東京リージョンでも使えるようになったみたいなので、使ってみました。

1.AWS CodeCommit のリポジトリの作成

  1. AWS CodeCommit のコンソールへアクセス。

  2. ダッシュボードの「リポジトリの作成」ボタンを押下。
    • FireShot Capture 053 - AWS CodeCommit Management Console_ - https___ap-northeast-1.console.aws.png

  3. 「リポジトリの作成」画面が表示されるので、以下の事項を入力し、「リポジトリの作成」ボタンを押下。
    • リポジトリ名
    • 説明
    • ※「リポジトリ名」「説明」共に、後で変更が可能。
    • FireShot Capture 054 - AWS CodeCommit Management Console_ - https___ap-northeast-1.console.aws.png

  4. リポジトリが作成され、「リポジトリに接続」画面が横から飛び出てきますので、次に接続の手順へ。

2.AWS CodeCommit のリポジトリへの接続

  1. 今回は、HTTPS で接続。

    • FireShot Capture 055 - AWS CodeCommit Management Console_ - https___ap-northeast-1.console.aws.png

  2. 前提条件を一つずつ確認します。Mac に Git がインストールされていたので、続いて IAM の設定を行います。
  3. IAM のコンソールへアクセス。
  4. 左側ペインの「ユーザー」をクリック。
    • FireShot Capture 057 - IAM Management Console - https___console.aws.amazon.com_iam_home#_home.png

  5. ユーザーの一覧から、接続するユーザーの「ユーザー名」のリンクをクリック。
    • FireShot Capture 058 - IAM Management Console - https___console.aws.amazon.com_iam_home#_users.png

  6. ユーザーの情報が表示されるので、「アクセス権限」タブを選択し、以下のポリシーをアタッチ。
    • IAMSelfManageServiceSpecificCredentials
    • IAMReadOnlyAccess
    • AWSCodeCommitFullAccess
    • FireShot Capture 061 - IAM Management Con_ - https___console.aws.amazon.com_iam_home#_users_y.uekama.png

  7. 「認証情報」タブの「AWS CodeCommit の HTTPS Git 認証情報」の「生成」ボタンを押下。
    • FireShot Capture 063 - IAM Management Con_ - https___console.aws.amazon.com_iam_home#_users_y.uekama.png

  8. 「生成された Git 認証情報」ダイアログが表示されるので、「証明書のダウンロード」ボタンを押下し、「リポジトリのクローンを作成するステップ」の 1 の記載の通りに、コンピュータ上の安全な場所に保存。
    • FireShot Capture 067 - IAM Management Con_ - https___console.aws.amazon.com_iam_home#_users_y.uekama.png

  9. 「リポジトリのクローンを作成するステップ」の 2 の記載にしたがって、以下のコマンドを実行。
    • git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/Test

      • ※ユーザー名とパスワードを求められたら、保存した Git 認証情報を対応するフィールドに入力。

99.ハマりポイント

  • これは、AWS CodeCommit とは関係なくて、Git のことをよく知らない私のせいなんですが…、iOS アプリの Swift のコードを git add したんですが、全然追加されなくて悩んでいたら、追加したディレクトリの中に .git ディレクトリがあったせいでした…。登録する時は、余計なディレクトリやファイルは削除しておかないといけないですよね…。

XX.まとめ

と言う訳で、簡単に使うことができました。

AWS CodeCommit は、料金もほぼ無料みたいなので、AWS を利用している方はガシガシ使った方がメリットあるんじゃ無いかと思います。

続きを読む

[stripe][AWS] Stripe の Event を CloudWatch custom metrics に記録

Stripe では、各種イベントを Webhook としてぶん投げてくれる仕組みがあります。
以前、その Webhook を Serverless Framework 使って API Gateway + Lambda で処理する記事書きました。
Stripe の Webhook を API Gateway で受け取って Lambda で処理する

それを応用して、Event Type ごとに CloudWatch のカスタムメトリクスに記録しておくとテンションあがるかなーと思って、こんなん書いてみました。

Stripe の Event を CloudWatch custom metrics に記録

Lambda で Webhook 受け取って CloudWatch にカスタムメトリクス登録

Lambda は node.js 6.10 でやりましょう。
ソースはこんな感じです。

handler.js
'use strict';

module.exports.incoming = (event, context, callback) => {
    const stripe = require('stripe')(process.env.STRIPE_API_KEY); // eslint-disable-line
    let response = {
        statusCode: 200,
        body: ''
    };

    try {
        // Parse Stripe Event
        const jsonData = JSON.parse(event.body); // https://stripe.com/docs/api#event_object

        // Verify the event by fetching it from Stripe
        console.log("Stripe Event: %j", jsonData); // eslint-disable-line
        stripe.events.retrieve(jsonData.id, (err, stripeEvent) => {
            const AWS = require('aws-sdk');
            const cloudwatch = new AWS.CloudWatch({apiVersion: '2010-08-01'});
            const eventType = stripeEvent.type ? stripeEvent.type : '';
            const params = {
                Namespace: process.env.NAMESPACE,
                MetricData: [
                    {
                        MetricName: eventType,
                        Dimensions: [{
                            Name: process.env.DIMENSION,
                            Value: process.env.STAGE
                        }],
                        Timestamp:  new Date,
                        Unit: 'Count',
                        Value: '1'
                    }
                ]
            };
            cloudwatch.putMetricData(params, (err) => {
                if (err) {
                    console.log('PutMetricData Error: %j', err);  // eslint-disable-line
                }
                response.body = JSON.stringify({
                    message: 'Stripe webhook incoming!',
                    stage: process.env.STAGE,
                    eventType: eventType
                });
                return callback(null,response);
            });
        });
    } catch (err) {
        response.statusCode = 501;
        response.body = JSON.stringify(err);
        callback(err,response);
    }
};

stripe.events.retrieve() で、送られてきたデータが本当に Stripe からのデータかどうかをチェックして、問題なければ CloudWatch のカスタムメトリクスに登録してる感じすね。

Serverless framework で API Gateway の endpoint 用意

API GateWay + Lambda の設定は苦行でしたが、Serverless framework を使用することで途端に簡単になりました。
こんな感じの serverless.yml を用意してやればいいです。

serverless.yml
service: put-stripe-event-to-custom-metrics

custom:
  stage:  ${opt:stage, self:provider.stage}
  logRetentionInDays:
    test: "14"         # stage[test]は14日
    live: "90"         # stage[live]は90日
    default: "3"       # stageが見つからなかったらこれにfallbackするために設定
  stripeAPIKey:
    test: "__STRIPE_TEST_API_SECRETKEY_HERE___"         # stage[test]用の Stripe API Key
    live: "__STRIPE_LIVE_API_SECRETKEY_HERE___"         # stage[live]用の Stripe API Key
    default: "__STRIPE_TEST_API_SECRETKEY_HERE___"      # stageが見つからなかったらこれにfallbackするために設定

provider:
  name: aws
  runtime: nodejs6.10
  stage: test
  region: us-east-1
  memorySize: 128
  timeout: 60

  iamRoleStatements:
    - Effect: Allow
      Action:
        - cloudwatch:PutMetricData
      Resource: "*"

  environment:
    STAGE: ${self:custom.stage}

# you can add packaging information here
package:
  include:
    - node_modules/**
  exclude:
    - .git/**
    - package.json

functions:
  incoming:
    handler: handler.incoming
    events:
      - http:
          path: stripe/incoming
          method: post
    environment:
      NAMESPACE: "___SERVICENAME__HERE__"
      DIMENSION: "Stripe"
      STRIPE_API_KEY: ${self:custom.stripeAPIKey.${self:custom.stage}, self:custom.stripeAPIKey.default}

resources:
  Resources:
    IncomingLogGroup:
      Properties:
        RetentionInDays: ${self:custom.logRetentionInDays.${self:custom.stage}, self:custom.logRetentionInDays.default}

serverless でのデフォルトに従うと、開発環境の stage は dev になりますが、ここは Stripe のお作法に従って開発環境は test、本番環境は live としましょうか。
environment として、以下の 4つを渡してますので、これを Lambda 内部では process.env.{environment name} で参照できます。

  • STAGE
  • NAMESPACE
  • DIMENSION
  • STRIPE_API_KEY

サンプルなので Stripe API KEY もそのまま渡してますが、必要なら暗号化するなりしてください。

environmentSTRIPE_API_KEY とか、Resources のロググループの期限とかは stage によって切り替えています。
この辺は @sawanoboly の以下の記事が参考になります。
Serverless Frameworkで、AWS Lambda function用に作られるCloudWatch Logsの期限を指定する

Deploy !

前準備

deploy したいところですが npm パッケージ stripe を内部で使用しているので、まずは npm install で stripe パッケージを取ってきましょう。

$ npm install stripe

いよいよデプロイ

もう、何も恐れる必要はありません。deploy してあげてください。

$ serverless deploy -v
 :
Serverless: Stack update finished...
Service Information
service: put-stripe-event-to-custom-metrics
stage: test
region: us-east-1
api keys:
  None
endpoints:
  POST - https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/test/stripe/incoming
functions:
  incoming: put-stripe-event-to-custom-metrics-test-incoming

Stack Outputs
ServiceEndpoint: https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/test
ServerlessDeploymentBucketName: put-stripe-event-to-cust-serverlessdeploymentbuck-xxxxxxxxxxxx
IncomingLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:000000000000:function:put-stripe-event-to-custom-metrics-test-incoming:1

endpoint (https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/test/stripe/incoming) に表示される URL が API Gateway の endpoint です。
これを Stripe の Webhook 登録画面 で登録してあげればオッケーです。

本番環境( live )にデプロイする場合は、以下の感じで

$ serverless deploy -v -s live

やったー、CloudWatch のカスタムメトリクスに登録されてるよ!
Screen Shot 2017-06-13 at 17.17.25.png

これで、Stripe からのチャリンチャリンが CloudWatch で確認できるようになりました。
可視化大事ですね。

現場からは以上です。

続きを読む

AmazonLinuxでAWSのLocalStackインストール手順

リンク: https://github.com/atlassian/localstack

Dockerインストール

確認する:

$ sudo yum search docker
Loaded plugins: priorities, update-motd, upgrade-helper
========================================================================================= N/S matched: docker ==========================================================================================
docker-storage-setup.noarch : A simple service to setup docker storage devices
docker.x86_64 : Automates deployment of containerized applications
docker-devel.noarch : A golang registry for global request variables (source libraries)
docker-pkg-devel.noarch : A golang registry for global request variables (source libraries)

  Name and summary matches only, use "search all" for everything.


$ sudo yum info docker

Loaded plugins: priorities, update-motd, upgrade-helper
Available Packages
Name        : docker
Arch        : x86_64
Version     : 17.03.1ce
Release     : 1.50.amzn1
Size        : 22 M
Repo        : amzn-updates/latest
Summary     : Automates deployment of containerized applications
URL         : http://www.docker.com
License     : ASL 2.0 and MIT and BSD and MPLv2.0 and WTFPL
Description : Docker is an open-source engine that automates the deployment of any
            : application as a lightweight, portable, self-sufficient container that will
            : run virtually anywhere.
            :
            : Docker containers can encapsulate any payload, and will run consistently on
            : and between virtually any server. The same container that a developer builds
            : and tests on a laptop will run at scale, in production*, on VMs, bare-metal
            : servers, OpenStack clusters, public instances, or combinations of the above.

インストール:

$ sudo yum install -y docker

サービス起動

$ service docker start

LocalStackインストール

プロジェクトをクローンする

$ git clone https://github.com/atlassian/localstack.git

起動する:

make docker-run

# Or using docker-compose:

docker-compose up

続きを読む

Boto3を使ってAMIのNameのリスト一覧を取得してみた

Boto3を利用してAMIの一覧をリストで取得する処理を作成しました。
Owner_idにユーザのOwnerIDを入れると動きます。

リストの使い方などなんとなく覚えてきました。
for文で必要なところを抜き出してますが、もっと素敵があるとうれしいなと思います。

AWSのLambdaバージョンにすれば環境変数でOwnerIDも指定出来るのでGitで公開しやすいのですが・・・


# -*- coding: utf-8 -*-

# import
import boto3
from boto3.session import Session
from datetime import date, datetime, timedelta

ec2 = boto3.client('ec2')
list_ami = []
Owner_id = "ここにIDをいれる"

# def
def get_list_ami():
  response = ec2.describe_images(
    Owners = [Owner_id]
  )
  for list_id in response['Images']:
    list_ami.append(list_id['Name'])
  return list_ami

# Main
if __name__ == "__main__":
  get_list_ami()
  print list_ami

https://github.com/handa3/study/blob/master/aws/ec2/get_list_ami.py

続きを読む