React+AWS環境を使ってアンテナサイト(RSS)を作成③

Reactでアンテナサイトを作成してみます。

Ishiguro Suguru

いわゆるアンテナサイトをReactで作ってみよう思い、その時のメモを公開しておきます。 今回はバックエンド部分をCloudFormationを使って作成します。

環境

前回PyCharmをAWS SAMのプロジェクトを作成しました。 今回はCloudFormationを使ってデプロイします。

  • PyCharm 2021.3.3 (Community Edition)
  • Package Type: Image
  • Architecture: x86_64
  • Runtime: python 3.9

本記事で出来上がるもの

  • AWSサービス(Lambda, CloudWatch Event, Role…)

YAMLファイル作成

以下のYAMLファイルで作成するAWSリソースを定義します。 作成したLambdaはCloudWatch Eventで10分ごとにキックする設定にしています。 これで指定したS3バケットに各サイトの記事リンクが記載されたjsonファイルがたまっていきます。

また今回作成したDockerコンテナはAWS ECRにプッシュしておきましょう。 PyCharmではデプロイの際にECRのレポジトリを指定する必要があります。(手順は別途記載するかも…)

■ template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  python3.9

  Lambda and EventBridge SAM Template for crawlRSS

Globals:
  Function:
    Timeout: 3
    Environment:
      Variables:
        TZ: Asia/Tokyo
        # S3バケット名を記載
        S3_BUCKET_NAME: <bucket_name>

Resources:
  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: CrawlRssLambdaRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/AmazonS3FullAccess

  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: CrawlRssLambda
      Role: !GetAtt LambdaRole.Arn
      # タイムアウト値をデフォルトから変更(30秒)
      Timeout: 30
      # メモリサイズ変更(512MB)
      MemorySize: 512
      PackageType: Image
      Architectures:
        - x86_64
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./src
      DockerTag: python3.9-v1

  Rule:
    Type: AWS::Events::Rule
    Properties:
      Description: Scheduled Rule
      Name: CrawlRssLambdaRule
      # 10分ごとに実行
      ScheduleExpression: 'cron(0/10 * * * ? *)'
      State: ENABLED
      Targets:
        - Arn: !GetAtt LambdaFunction.Arn
          Id: lambda

  FunctionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !Ref LambdaFunction
      Principal: events.amazonaws.com
      SourceArn: !GetAtt Rule.Arn

Outputs:
  LambdaFunction:
    Description: "Lambda Function ARN"
    Value: !GetAtt LambdaFunction.Arn
  LambdaRole:
    Description: "Implicit IAM Role created for function"
    Value: !GetAtt LambdaRole.Arn

これで表示するデータがS3にたまっていきます。 次回フロントエンド部分を改良していきます。

comments powered by Disqus