311 Views
October 21, 23
スライド概要
札幌のウェブエンジニア
AWS CDK v2 で RSS 配信をしてみる #ゆるあさ n13u ( @_n13u_ ) 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
自己紹介 n13u / 西村航 Sapporo Engineer Base 運営事務局 一般社団法人未完事務局 SocialChangeLab合同会社 2002年生まれ。生まれも育ちも札幌市。 自分で小さい会社の副代表やりつつ、フロントエンドエンジニアとして受託開発や地域の中 小企業向けにプロダクト作っています(しんどい) エンジニアとしては、Web系を中心に触ることがほとんどですが、趣味でUnityや3DCG周 りも触っています。 Twitter @_n13u_ 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
目次 目的と背景 つくたいもの 考えたこと つくるもの AWS CDK とは? 中身 改善点 まとめ 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
目的と背景 「Sapporo Engineer Base」という札幌市の取組のウェブサイトたちあげる必要が生まれた。 Connpassからイベントを取得して表示するものをつくりたかったが、現状のAPIだと十分な 情報取得ができなかった。 かつ、今回サイト制作に使用したSTUDIOはRSSで情報を取るためRSS配信サービスをつくる 必要があった。 Connpass API の問題点(?) 複数条件でのOR/AND検索が複雑 エリア指定での検索が難しい サムネイル画像を取ってこれない 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
つくりたいもの ConnpassのAPIから特定条件に従ったイベント情報を取得する イベント情報取得後、イベント画像を取ってくる必要がある イベント情報に従ってRSS(XML) を構築 RSSを配信 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
考えたこと アクセス過多にならないか API取得の頻度は週1程度でよい なるべくリクエスト数を減らす 何で(どこで)APIを叩くか? Cloudflare?Hono? AWS Lambda? 言語はホスト環境によるけど書きやすいのは 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
考えたこと RSSをどう配信するか? リクエストごとに動的に生成するか? 静的なファイルを配信するか? デプロイやらホストがめんどいので自動化したい(できる限り) GitHub Actions? CodeDeploy? 公開ドメインどうする? 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
つくるもの APIはAWS Lambdaで叩く LambdaでそのままRSS(XML)を生成 AWS EventBridgeで定期実行 生成したファイルをs3に配置 s3に配置したファイルをCloudFrontで配信 Cloudflare Registrar に置かれたドメインに対して、AWSからDNSベースの証明書発行 CloudFrontで rss.sapporo-engineer-base.dev を紐づけ AWS Cloud 上のものは AWS CDK v2 で構築 ⇐ これの話 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
構成図 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
今日の話 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
AWS CDK とは? AWS CDK を使用すると、プログラミング言語の優れた表現力を活かして、信頼性が高く、スケーラブルで、コスト効率の高いアプリケーションをクラウドで構築でき ます。このアプローチには、次のような多くのメリットがあります。 AWSリソースに適切で安全なデフォルトを自動的に提供する高レベルの構造を使用して構築し、より少ないコードでより多くのインフラストラクチャを定義できま す。 パラメーター、条件、ループ、構成、継承などのプログラミングイディオムを使用して、AWSや他の人が提供するビルディングブロックからシステム設計をモデル 化します。 インフラストラクチャ、アプリケーションコード、構成をすべて1か所にまとめることで、すべてのマイルストーンで完全なクラウド導入可能なシステムを確保でき ます。 コードレビュー、ユニットテスト、ソース管理などのソフトウェアエンジニアリング手法を採用して、インフラストラクチャをより堅牢にします。 シンプルかつインテント指向の API を使用して、AWSリソースを (スタック間でも) Connect し、権限を付与します。 AWS CloudFormation既存のテンプレートをインポートして、リソースに CDK API を提供します。 AWS CloudFormationの機能を活用して、インフラストラクチャのデプロイを予測どおりに繰り返し実行し、エラー発生時にロールバックすることも可能です。 インフラストラクチャの設計パターンを、組織内のチーム間または一般ユーザーと簡単に共有できます。 は TypeScript、、Python JavaScript、Java、C#/.Net、および GoAWS CDK をサポートしています。開発者は、サポートされているこれらのプログラミング言語の いずれかを使用して、と呼ばれる再利用可能なクラウドコンポーネントを定義できますコンストラクト。スタックアプリケーションこれらを一緒におよびに構成します。 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
長い! 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
図解があるぞ? 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
わからん! 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
結局なにか? AWS純正のIaC(Infrastructure as a Code) 身近な言語で、AWS構成をデプロイするプログラムをかける CLIから cdk deploy コマンドでデプロイ可能 中身はAWSのCloudFormation 勝手にスタックやらテンプレートを作ってくれる IAMいじったり、クロスリージョンも可能 ランタイム環境を同じレポジトリに含められる 便利〜〜〜〜 TypeScriptのバンドラもあるよ〜 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
どんなことコード書いてるの? 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
つくりかた
Stackクラスを継承したStackを記述し、この中にアプリケーション構築と手順を記述します
Stack自体は bin/conpass-rss.ts でimportされ、実行されます
export class ConnpassRssStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
}
}
2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
つくりかた
S3バケットとCloudFrontはこんな感じ
const bucket = new s3.Bucket(this, "ConnpassRssBucket");
new Distribution(this, 'Distribution', {
comment: 'RSS Feed',
defaultRootObject: 'rss.xml',
defaultBehavior: {
allowedMethods: AllowedMethods.ALLOW_GET_HEAD,
cachedMethods: CachedMethods.CACHE_GET_HEAD,
cachePolicy: CachePolicy.CACHING_OPTIMIZED,
viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
origin: new S3Origin(bucket),
},
...//
priceClass: PriceClass.PRICE_CLASS_ALL,
});
省略
2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
つくりかた
AWS Lambda でNodeJS Functionを立てる際はこんな感じでかけます
const xmlExportLambda = new NodejsFunction(this, "ConnpassReturnRss", {
functionName: "ConnpassReturnRss",
entry: join(__dirname, "../src/index.ts").toString() //lambda
runtime: Runtime.NODEJS_18_X // Ver
,
memorySize: 1024,
timeout: Duration.seconds(300) // timeout aws-cdk
,
role: iamRoleForLambda // IAM Role
,
bundling: { // esbuild
minify: true,
sourceMap: true,
externalModules: ["@aws-sdk/*"],
tsconfig: join(__dirname, "../tsconfig.json"),
format: OutputFormat.CJS
},
environment: {
S3_BUCKET_NAME: bucket.bucketName, //
},
});
の実体コード,
指定
も
独自の書式で指定可能
を渡せます
ベースのバンドル(ファイルの絶対パスにスペース含まれるとコケます)
環境変数受け渡し
2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
GitHub レポジトリ mikan-foundation/connpass-rss 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
改善点 メモリの使用量が微妙(300MB〜400MBくらい) 256MBに抑えたい APIの取得ロジック考えたい RSSファイルちゃんとつくりたい 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ
宣伝:Sapporo Engineer Base について 札幌でイベントやりたくなったらお声がけください 逆に出張とかもします 2023.10.21@ゆるい勉強会@秋の終わり #ゆるあさ