Lambdaで自動フォローとリツイート

概要

awsのEC2無料枠で、件名のスクリプトを定期実行していたが、無料期間が終わったので、永続無料のLambdaを使用することにした。 「パラメータストア(Parameter Store)」や「シークレットマネージャー(Secrets Manager)」との連携で手こずったので、メモとして記載。

※ 重要 ※
Twitterにおける自動フォローとリツイートについては自動化ルールの規約に反しない範囲での使用が必要。

パラメータストア(Parameter Store) との連携

【サービス > AWS Systems Manager > パラメータストア 】

  • パラメータを作成(略)

【サービス > Identity and Access Management (IAM) > ロール】

  • パラメータを使用する関数を選択する
    • 事前に関数がある前提、なければ新規作成のハズ
  • アクセス権限tabの[ポリシーをアタッチします]を選択
  • [ポリシーの作成] を選択
  • [JSON]tabを選択して下記を追加 "ssm:PutParameter" がパラメータに書き込むための権限
    "ssm:GetParameters" がパラメータを読み込むための権限
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:PutParameter",
                "ssm:GetParameter"
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}
  • 適切なポリシー名を設定して保存。

【Lambda > 関数 > パラメータを使用する関数】

  • 読み取り(1つのみ。複数ある時は get_parameters を使用)
    import boto3

    ssm = boto3.client('ssm', 'ap-northeast-1')
    response = ssm.get_parameter(Name="パラメータ名",WithDecryption=False)
    print(response['Parameter']['Value'])
  • 書き込み
    import boto3

    ssm = boto3.client('ssm', 'ap-northeast-1')
    response_put = ssm.put_parameter(
        Name = "パラメータ名",
        Value = str(lastid),  #書き込む値。Typeに合わせること
        Type = 'String',      #パラメータのYype
        Overwrite = True
    )


シークレットマネージャー(Secrets Manager)との連携

AWS Secrets Manager】

  • シークレットの作成

【サービス > Identity and Access Management (IAM) > ロール】

  • シークレットを使用する関数を選択する
    • 事前に関数がある前提、なければ新規作成のハズ
  • アクセス権限tabの[ポリシーをアタッチします]を選択
  • [ポリシーの作成] を選択
  • [JSON]tabを選択して下記を追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*"
        }
    ]
}
  • 適切なポリシー名を設定して保存。

【Lambda > 関数 > シークレットを使用する関数】

  • 読み取り
    import boto3
    import json

    client = boto3.client(service_name='secretsmanager')
    get_secret_value_response = client.get_secret_value(SecretId="シークレット名")

    #ディクショナリ型として読み込む
    secret = json.loads(get_secret_value_response['SecretString'])

    secret['呼び出したいシークレットキー']

自動化

【サービス > CloudWatch】
(略:直観的)

定数を渡して関数を実行するのに手間取ったので、下記に記事を追加。

【サービス > CloudWatch】 引数を渡して関数実行