執筆環境(PyCharm, CodeCommit, CodePipeline, S3, Lambda, 署名付きURL)
2020/01/09
2018年から、年に1回ぐらい商業本の執筆をさせていただいております。
2020年は薄い本にもチャレンジしたいです。
今利用している執筆環境を記録しておきます。
アーキテクチャはこちらです。
- フォーマットはマークダウンです。
- MacbookにインストールしたPyCharmで書いてコミットします。
- リポジトリはCodeCommitです。
- コミットされるとCodePipelineがzipにしてS3バケットに格納します。
- S3バケットにzipが格納されるとLambdaが署名付きURLを生成してSNSトピックにパブリッシュします。
- サブスクライバーのEメールに署名付きURLが送信されます。
目次
CodePipeline
[パイプラインの作成]からはじめました。
パイプライン名を任意で設定しました。
IAMロールは新規で自動作成しました。
アーティファクトストアは、ダウンロード用ファイルが作成されるバケットを指定しました。
ソースは今回の書籍執筆用に作成していたCodeCommitのリポジトリ、ブランチを指定しました。
イベントはCloudWatch Eventsにしました。
ビルドステージはビルドステージをスキップから、スキップしました。
デプロイステージには、今回用に作成したバケットを指定しました。
以上で設定は完了しました。
内容を確認して作成完了しました。
CloudWatch Eventsを確認すると、ルールとイベントが作成されていました。
IAMロールは次のポリシーがアタッチされたロールが作成されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:ap-northeast-1:12345678012:aws-linux" ] } ] } |
信頼ポリシーはこちらでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } |
署名付きURL生成
今回は、編集者さんにダウンロードしてもらうための署名付きURLを生成したいです。
有効期限としては、1週間欲しいです。
ですので、IAMロールを使用した場合は6時間なので、使用できません。
専用のIAMユーザーを作成しました。
Amazon S3 バケットの署名付き URL が、指定した有効期限より前に失効するのはなぜでしょうか?
IAMユーザーはマネジメントコンソールからログインする必要はありませんので、コンソールのパスワードは[無効]にしました。
ポリシーはインラインポリシーで、該当のS3オブジェクトキーに、GetObjectできるだけの権限です。
アクセスキーを発行しました。
SNSトピックを作成して、サブスクライバーには自分のEmailを設定しました。
Lambda
イベントトリガーはS3のプレフィックスとサフィックス指定で、イベントタイプはObjectCreatedです。
ランタイムはPython3.6です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import json import urllib import boto3 import os accesskey = os.environ.get('accesskey', '') secret = os.environ.get('secret', '') s3_client = boto3.client( 's3', aws_access_key_id=accesskey, aws_secret_access_key=secret ) def lambda_handler(event, context): print(event) bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key']) presigned_url = s3_client.generate_presigned_url( ClientMethod = 'get_object', Params = { 'Bucket' : bucket, 'Key' : key }, ExpiresIn = 604800, HttpMethod = 'GET' ) sns = boto3.client('sns') topic = 'yamashita-mail' snsTopicArn = [t['TopicArn'] for t in sns.list_topics()['Topics'] if t['TopicArn'].lower().endswith(':' + topic.lower())][0] sns.publish( TopicArn=snsTopicArn, Message=presigned_url, Subject='aws-linux presinedurl', MessageStructure='raw' ) |
環境変数に、accesskeyとsecretを設定して完了です。
実行結果
Pycharmのターミナルからコミットしてみました。
CodePipelineが動き始めました。
成功で完了しました。
メールでもちゃんと署名付きURLが届きました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Amazon LinuxにAlfresco Community Editionをインストールする
ダウンロード準備 Alfresco公式サイトで、「エンタープライズコンテンツ管理 …
-
WordPressで発生した「No space left on device」に対応
CloudWatch Logsメトリクスフィルターで「No space left …
-
kintone webhookからAWS API Gateway – Lambdaを実行しレコードの値を渡す
2017年2月のアップデートでkintoneにWebhook機能がリリースされま …
-
Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(失敗、手戻りそのまま記載版)
勉強のためブログサイトを長らくお世話になったロリポップさんから、AWSに移設する …
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
Backlogの課題チケット更新内容をMicrosoft Teamsに通知する(AWS Lambda Python)
BacklogにSlack連携が追加されました。 ですが、私の所属している会社で …
-
Amazon Connect 発信イベントをEventBridgeで確認
Amazon Connectから発信した電話に出たのか、出なかったのかを確認した …
-
AWS LambdaでChrome HeadlessドライバをAWS Lambda Layersから使う
この記事はSelenium/Appium Advent Calendar 201 …
-
AWS BackupでRDSスナップショットをクロスリージョンコピー
クロスリージョンでコピーしたい対象と理由 このブログはブログのアーキテクチャをコ …
-
slackのbotにWikipediaを調べてもらう(Python on AWS Lambda + API Gateway)
slackのbotに少しでも役に立ってもらおうと、Wikipediaを調べてもら …
- PREV
- ブログのアーキテクチャをコストベースで見直しました
- NEXT
- AWS DeepLens開封の儀