AWS CloudFormationでLambdaを構築してみる

# はじめに
CloudFormationを用いて、AWS Lambda構築していきたいと思います。
今回はLambdaを構築するところまで実施していきます。
また、Lambda@EdgeとしてCloudFrontと連携して利用するところは次回以降に記載予定です。
AWS Lambda@EdgeはCloudFront が配信するコンテンツをカスタマイズする関数を実行できるコンピューティングサービスです。

# 目次
・Lambdaの設定項目
・CloudFormation作成
・最後に
・参考

# Lambdaの設定項目
今回はnodejs.18.xを利用し、コードについてはS3から取得してくるようにします。
Lambda@Edgeはバージニア北部にのみ作成可能なため取得してくるS3もバージニア北部であるひつようがあります。また、今回作成するLambdaもバージニア北部に作成するので注意してください
また、IAMロールとCloudFrontへのアクセスを許可するためのポリシーステートメントを作成します

上記以外の項目についてはCloudFormationの設定を見てご確認ください
また、S3については前回の記事を参考に作成してください

https://qiita.com/ogataro/items/71dd28babfcdf6410a3c

# CloudFormation作成
LambdaとIAMロール、リソースベースのポリシーステートメントを作成します

```yaml:LambdaEdge.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Lambda@Edge Deployment

#------------------------------------------------------------#
#Parameters
#------------------------------------------------------------#
Parameters:
  PJPrefix:
    Description: Project Name
    Type: String
    Default: pj-ogataro
    AllowedPattern: ^[a-zA-Z0-9\-]*$
  Environment:
    Description: Environment Name
    Type: String
    Default: dev
    AllowedPattern: ^[a-zA-Z0-9\-]*$

#------------------------------------------------------------#
#Resources
#------------------------------------------------------------#
Resources:
  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: !Sub '${PJPrefix}-${Environment}-LambdaEdge'
      Runtime: nodejs18.x
      Handler: index.handler
      Code:
        S3Bucket: !Sub '${PJPrefix}-${Environment}-storage-useast1'
        S3Key: lambda/lambda_edge.zip
      Role: !GetAtt LambdaExecutionRole.Arn

  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub '${PJPrefix}-${Environment}-LambdaEdge-IAMRole'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
                - edgelambda.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: LambdaExecutionPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: arn:aws:logs:*:*:*
        - PolicyName: LambdaFunctionPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - lambda:InvokeFunction
                  - lambda:GetFunction
                Resource: !Sub 'arn:aws:lambda:us-east-1:${AWS::AccountId}:function:${PJPrefix}-${Environment}-LambdaEdge'

  LambdaPermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !Ref LambdaFunction
      Action: lambda:GetFunction
      Principal: cloudfront.amazonaws.com
      SourceArn: !Sub 'arn:aws:lambda:us-east-1:${AWS::AccountId}:function:${PJPrefix}-${Environment}-LambdaEdge'

#------------------------------------------------------------#
#Outputs
#------------------------------------------------------------#
Outputs:
  LambdaFunction:
    Value: !Ref LambdaFunction
    Export:
      Name: !Sub '${PJPrefix}-${Environment}-LambdaEdge-Output'
```

# 最後に
こちらでLambda@Edgeを導入する手順は完了です。
参考になれば、幸いです。

# 参考サイト
Lambda

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html